Post

자바 백엔드 실무

자바 백엔드 실무

들어가며

일반적인 스타트업이나 서비스 기업에서는 “빠른 배포”가 미덕입니다. 하지만 제가 지원하고자 하는 방산 및 공공 분야 시스템 구축/운영 업무에서 가장 중요한 가치는 단연 “보안(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>라고 입력했을 때, 이를 실행되지 않게 &lt;script&gt;로 변환(Escape)해서 저장하거나 보여줘야 합니다.
  • Naver의 Lucy XSS Filter 같은 라이브러리를 적용하는 것이 일반적입니다.

5. 폐쇄망 개발 환경의 특수성

방산/공공 프로젝트는 인터넷이 차단된 폐쇄망 환경인 경우가 많습니다.

  • Maven/Gradle 사용 불가: 필요한 .jar 라이브러리를 미리 반입 신청해서 로컬 저장소(Nexus 등)에 구축해 둬야 합니다.
  • 로그 관리: System.out.println은 성능 저하뿐만 아니라 보안 로그 정책 위반일 수 있습니다. 반드시 Log4j2Logback을 사용하여 파일로 남기고, 민감 정보(비밀번호 등)가 로그에 찍히지 않도록 마스킹 처리해야 합니다.

마무리하며

보안은 ‘기능’이 아니라 ‘품질’ 그 자체입니다. “나중에 기능 다 만들고 보안 적용하자”라는 생각은, 건물을 다 짓고 나서 기초 공사를 다시 하겠다는 것과 같습니다.

개발 초기 단계부터 보안을 고려하는 Security by Design 마인드를 가진 개발자만이, 국가 중요 시설이나 기업의 핵심 자산을 다루는 시스템을 운영할 자격이 있다고 생각합니다.

어느덧 이 시리즈의 마지막입니다. 1일차 아키텍처부터 오늘 보안까지, 9일간 쉼 없이 달려왔습니다. 마지막 10일차에서는 기술 이야기를 잠시 내려놓고, [안정적인 자산관리 시스템 운영을 위한 개발자의 태도와 마음가짐]으로 이 긴 여정을 마무리하려 합니다.

This post is licensed under CC BY 4.0 by the author.