-
Spring 기반 웹 애플리케이션에서 발생할 수 있는 4가지 주요 보안 공격Spring/Security 2025. 5. 19. 23:19
Spring 기반 웹 애플리케이션에서 발생할 수 있는 4가지 주요 보안 공격인 CSRF, XSS, 세션 고정, JWT 탈취와 Spring Security 또는 일반적인 대응 전략을 간단히 정리한 글입니다.
1. CSRF(Cross-Site Request Forgery)
공격 방식 : 사용자가 웹 사이트(A)에 로그인한 상태에서 악의적인 웹사이트(B)에 접속하면, (B)가 사용자 모르게 (A) 웹사이트에 대한 요청을 하는 공격입니다. 브라우저의 경우 자동으로 인증 쿠키를 포함시켜 서버는 이 요청이 합법적인 것으로 간주합니다.
e.g.
은행 사이트에 로그인하면, 이 은행 사이트에 대한 쿠키를 가집니다.
이후 서핑 중 특정 사이트가 궁금해서, 광고를 잘못 클릭해서 등의 이유로 공격자가 만든 사이트에 접속합니다.
그 사이트에는 <img src="https://bank.com/transfer?to=hacker&amount=1000"> 과 같은 코드가 포함돼 있었고, 해당 구문이 HTTP GET 요청으로 실행됩니다. 이때, 클라이언트에 은행 사이트에 대한 쿠키가 있는 상태이기 때문에 브라우저는 . . .
GET /transfer?to=hacker&amount=1000 HTTP/1.1 Host: bank.com Cookie: sessionId=ABC123 <- 자동으로 붙여버렸다.같은 요청을 만들어 전송하고, 해커에게 1000 만큼의 금액이 이동됩니다.
대응 전략
Spring Security CSRF 보호
기본적으로 활성화되어 있으며, 모든 상태 변경 요청(POST, PUT, DELETE 등)에 CRSF 토큰을 요구합니다.
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); } }SameSite 쿠키 속성
쿠키에 SameSite=Strict 또는 SameSite=Lax 설정을 추가하여 크로스 사이트 요청에 쿠키 전송을 제한합니다.
2. XSS (Cross-Site Scripting)
공격 방식 : 공격자가 웹사이트에 악성 스크립트를 삽입하고, 다른 사용자가 해당 페이지를 방문할 때 스크립트가 실행되어 쿠키 탈취, 계정 하이재킹*, 피싱 등의 공격이 가능해집니다.
*훔치는 행위
대응 전략
Spring Security 헤더
X-XSS-Protection, Content-Security-Policy 등의 보안 헤더 설정
http.headers() .contentSecurityPolicy("default-src 'self'") .and() .xssProtection() .and() .contentTypeOptions();입력 검증 및 출력 이스케이프*
*특수한 의미를 가진 문자나 기호를 안전하게 처리할 수 있는 대체 문자열로 변환하는 프로세스
- 서버 측에서 입력 데이터 검증 (Bean Validation 활용)
- Thymeleaf, JSP : 자동 이스케이프 활용
- HTML 컨텍스트 : th:text
- JavaScript : th:inline="javascript" 사용
3. 세션 고정 공격 (Session Fixation)
공격 방식 : 공격자가 자신의 세션 ID를 사용자에게 강제로 사용하게 한 후, 사용자가 로그인하면 공격자도 같은 세션으로 시스템에 접근합니다.
대응 전략
인증 시 세션 교체
Spring Security 는 기본적으로 인증 성공 후 세션 ID를 생성합니다.
http.sessionManagement() .sessionFixation().changeSessionId() // 기본값 // 또는 더 엄격하게 // .sessionFixation().newSession() .maximumSessions(1) // 동시 세션 제한 .expiredUrl("/login?expired");Secure, HttpOnly 세션 쿠키
쿠키 보안 강화로 세션 탈취를 방지합니다.
server.servlet.session.cookie.secure=true server.servlet.session.cookie.http-only=true
3. JWT 탈취 (JWT Token Theft)
공격 방식
JWT 토큰이 로컬이나 안전하지 않은 쿠키에 저장되면 XSS 공격이나 물리적인 접근을 통해 탈취될 수 있습니다.
대응 전략
토큰 저장소 보안
HttpOnly, Secure 플래그가 설정된 쿠키 사용
@Bean public CookieSerializer cookieSerializer() { DefaultCookieSerializer serializer = new DefaultCookieSerializer(); serializer.setCookieName("JWT-TOKEN"); serializer.setCookieMaxAge(3600); serializer.setCookiePath("/"); serializer.setCookieHttpOnly(true); serializer.setCookieSecure(true); return serializer; }짧은 만료 시간과 재발급 메커니즘
Access Token은 짧게, Refresh Token은 길게 설정한다.
@Bean public JwtTokenProvider jwtTokenProvider() { return new JwtTokenProvider( "secretKey", 1800000, // Access Token 30분 86400000 // Refresh Token 24시간 ); }서명 검증
토큰 서명 무결성 확인
@Component public class JwtTokenValidator { public Claims validateToken(String token, String secretKey) { return Jwts.parser() .setSigningKey(secretKey) .parseClaimsJws(token) .getBody(); } }토큰 블랙리스트
로그아웃된 토큰은 Redis 등에 저장하여 재사용 방지
'Spring > Security' 카테고리의 다른 글
JWT(JSON Web Token)의 구조, 구성 요소 (0) 2025.05.19