Backend
home

Java 시큐어 코딩

생성 일시
2025/05/04 16:54
태그
Java
게시일
2025/05/05
최종 편집 일시
2025/05/04 17:14

시큐어 코딩이 중요한 이유

국내 보안 관련 법령 (정보통신망법, 개인정보보호법 등)
보안 취약점 하나가 기업 신뢰도와 금전 피해로 직결

자바에서 자주 발생하는 보안 취약점과 예방 방법

1. SQL Injection

취약 예시: Statement에 문자열 덧붙이기
방어 코드: PreparedStatement 사용
String query = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement pstmt = conn.prepareStatement(query); pstmt.setString(1, username); pstmt.setString(2, password);
Java
복사

2. XSS (Cross Site Scripting)

취약 예시: 입력값 그대로 HTML에 출력
방어 코드: StringEscapeUtils.escapeHtml4(userInput)

3. CSRF (Cross Site Request Forgery)

방어 기법: Spring Security CSRF 토큰 적용
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
Java
복사

4. 파일 업로드 취약점

방어 코드: 확장자 검증 + 파일명 UUID 처리 + 업로드 경로 외부 노출 방지
String safeFilename = UUID.randomUUID().toString() + ".jpg";
Java
복사

5. 암호화/복호화 취약점

잘못된 예: MD5, SHA1 사용
안전한 방식: PBKDF2, bcrypt, Argon2
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); String hashed = encoder.encode(rawPassword);
Java
복사

6. 보안 관련 자바 라이브러리 추천

Spring Security: 인증·인가 프레임워크
OWASP ESAPI: 보안 유틸리티 제공
Apache Shiro: 경량 보안 프레임워크

실전 시큐어 코딩

1. 입력값 검증 (Input Validation)

잘못된 예 (취약 코드)
String email = request.getParameter("email"); // 바로 DB 쿼리에 사용 → 위험
Java
복사
안전한 예 (화이트리스트 검증)
if (!email.matches("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$")) { throw new IllegalArgumentException("Invalid email format"); }
Java
복사
Tip: 입력 검증은 화이트리스트 방식으로 허용할 값만 명시하는 것이 기본 원칙이다.

2. 인증과 세션 관리 (Authentication & Session)

비밀번호 저장 시 보안 처리
절대 평문 저장 금지
안전한 해시 알고리즘 사용
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); String hashedPassword = encoder.encode(plainPassword);
Java
복사
추천 알고리즘: bcrypt, Argon2, PBKDF2
세션 고정 공격 방지
request.getSession().invalidate(); request.getSession(true); // 새로운 세션 발급
Java
복사

3. SQL 인젝션 방지

잘못된 예
String query = "SELECT * FROM users WHERE id = " + userId;
Java
복사
안전한 예 (PreparedStatement)
String query = "SELECT * FROM users WHERE id = ?"; PreparedStatement stmt = connection.prepareStatement(query); stmt.setInt(1, userId);
Java
복사
ORM 사용 시에도 @Param이나 바인딩 방식을 통해 방어한다.

4. XSS 방어

취약 코드
out.println("<p>" + userInput + "</p>");
Java
복사
방어 코드
out.println("<p>" + StringEscapeUtils.escapeHtml4(userInput) + "</p>");
Java
복사
Spring MVC에서는 @ResponseBodyth:text로 자동 XSS 방어 처리가 됩니다.

5. CSRF 방지 (Spring Security)

기본 설정 (Spring Security)
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
Java
복사
폼 전송 시 CSRF 토큰을 반드시 포함해야 요청이 정상 처리됩니다.

6. 파일 업로드 보안

안전한 파일명 처리
String safeFilename = UUID.randomUUID().toString() + ".jpg";
Java
복사
업로드 경로 분리
/upload 폴더를 웹 루트 외부에 두고 다운로드 시 별도의 컨트롤러로 파일을 제공하도록 설계한다.

7. 민감 정보 로그 출력 금지

잘못된 로그 예시
log.info("로그인 시도: username={}, password={}", username, password);
Java
복사
올바른 로그 예시
log.info("로그인 시도: username={}", username);
Java
복사

8. 보안 HTTP 헤더 설정 (Spring Security)

이 설정은 XSS, Clickjacking 공격 방어에 효과적이다.
http.headers() .xssProtection() .and() .contentSecurityPolicy("script-src 'self'") .and() .frameOptions().deny();
Java
복사

9. 포인트

SQL Injection은 PreparedStatement로 방어한다.
비밀번호는 bcrypt로 해싱하여 저장한다.
CSRF 방어를 위해 Spring Security의 기본 정책을 따른다.
XSS 방어는 출력 시 HTML 이스케이프 처리한다.