자바 백엔드 실무
들어가며
일반적인 스타트업이나 서비스 기업에서는 “빠른 배포”가 미덕입니다. 하지만 제가 지원하고자 하는 방산 및 공공 분야 시스템 구축/운영 업무에서 가장 중요한 가치는 단연 “보안(Security)”입니다.
채용 공고에 명시된 “방산 보안 정책상 신원조회 실시”라는 문구는, 개발자가 다루게 될 데이터의 중요성을 상징적으로 보여줍니다.
오늘은 행정안전부 및 KISA(한국인터넷진흥원)의 시큐어 코딩 가이드를 준수하며, 안전한 자바 애플리케이션을 만드는 실무 원칙들을 정리해 봅니다.
1. SQL Injection: 여전히 가장 위험한 구멍
아무리 강조해도 지나치지 않는, OWASP Top 10의 단골손님입니다.
- 위험한 코드:
1 2
// 사용자가 입력한 name이 "' OR '1'='1"이라면? -> 모든 정보 유출 String query = "SELECT * FROM USER WHERE NAME = '" + name + "'";
- 안전한 코드 (PreparedStatement 사용):
1 2 3
// MyBatis를 쓴다면 #{}을 사용해야 함 (${} 사용 절대 금지) String query = "SELECT * FROM USER WHERE NAME = ?"; pstmt.setString(1, name);
운영 업무 중 레거시 코드를 볼 때, 동적 쿼리를 만들기 위해 문자열 결합(
+)을 사용한 부분이 보이면 즉시 수정 1순위 대상입니다.
2. 개인정보 암호화: DB에 그대로 넣으면 범죄
자산관리 시스템이라도 사용자 정보(이름, 연락처, 주민번호 등)가 포함됩니다.
- 단방향 암호화 (Hash): 비밀번호는 절대 복호화할 수 없도록
SHA-256+Salt를 적용해 저장해야 합니다. - 양방향 암호화 (AES): 연락처나 주민번호는 관리자가 조회를 위해 복호화가 필요하므로
AES-256알고리즘을 사용합니다. 이때 암호화 키(Secret Key)는 소스 코드가 아닌 별도의 보안 파일이나 서버 환경 변수에 숨겨서 관리해야 합니다.
3. 접근 제어 (ACL)와 권한 관리
“로그인만 하면 다 볼 수 있다?” -> 보안 사고의 지름길입니다.
- URL 접근 제어: Spring Security나 Interceptor를 활용해,
ADMIN권한이 없는 사용자가/admin/**경로를 호출하면 즉시 차단해야 합니다. - 데이터 접근 제어: 같은 ‘부서장’이라도 ‘내 부서’의 자산만 조회해야 합니다. SQL의
WHERE절에 반드시DEPT_CODE = #{session.deptCode}조건을 강제하는 로직이 서비스 레이어에 녹아 있어야 합니다.
4. XSS (Cross Site Scripting) 방어
NEXACRO를 사용한다면 상대적으로 안전하지만, 웹 에디터 등을 통해 스크립트가 주입될 수 있습니다.
- 사용자가 게시글 제목에
<script>alert('hacked')</script>라고 입력했을 때, 이를 실행되지 않게<script>로 변환(Escape)해서 저장하거나 보여줘야 합니다. - Naver의 Lucy XSS Filter 같은 라이브러리를 적용하는 것이 일반적입니다.
5. 폐쇄망 개발 환경의 특수성
방산/공공 프로젝트는 인터넷이 차단된 폐쇄망 환경인 경우가 많습니다.
- Maven/Gradle 사용 불가: 필요한
.jar라이브러리를 미리 반입 신청해서 로컬 저장소(Nexus 등)에 구축해 둬야 합니다. - 로그 관리:
System.out.println은 성능 저하뿐만 아니라 보안 로그 정책 위반일 수 있습니다. 반드시Log4j2나Logback을 사용하여 파일로 남기고, 민감 정보(비밀번호 등)가 로그에 찍히지 않도록 마스킹 처리해야 합니다.
마무리하며
보안은 ‘기능’이 아니라 ‘품질’ 그 자체입니다. “나중에 기능 다 만들고 보안 적용하자”라는 생각은, 건물을 다 짓고 나서 기초 공사를 다시 하겠다는 것과 같습니다.
개발 초기 단계부터 보안을 고려하는 Security by Design 마인드를 가진 개발자만이, 국가 중요 시설이나 기업의 핵심 자산을 다루는 시스템을 운영할 자격이 있다고 생각합니다.
어느덧 이 시리즈의 마지막입니다. 1일차 아키텍처부터 오늘 보안까지, 9일간 쉼 없이 달려왔습니다. 마지막 10일차에서는 기술 이야기를 잠시 내려놓고, [안정적인 자산관리 시스템 운영을 위한 개발자의 태도와 마음가짐]으로 이 긴 여정을 마무리하려 합니다.