ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.