Spring Security - CSRF

TopOfTheHead·2026년 5월 18일

Spring Security

목록 보기
24/27

CSRF( 사용자 간 요청 위조 : Cross Site Request Forgery )
。사용자 의도와는 무관하게 의도치않은 위조된 HTTP Request를 전송하는 것
악성사이트가 중간에 사용자 요청위조해서 대상 사이트에 전송하면서 공격하는 방법

위조된 사이트 내 잘못된 HTTP 요청을 전달하는 버튼을 구현하여 브라우저쿠키 정보인증정보 기반으로 해당 잘못된 HTTP 요청을 전송

CSRF의 경우 주로 POST, PUT, PATCH , DELETE 요청에 대해서 주의해야한다.

  • CSRF 원리

    1. User가 웹사이트 로그인 시 User Session가 생성되며, 해당 User SessionServer에서 생성된 Session Cookie를 사용하여 식별

    2. User가 의도적이지 않게 해당 웹사이트에서 브라우저를 종료하거나 로그아웃하지않고 다른 악성웹사이트로 이동 시 공격자는 이전 웹사이트의 Session CookieAccess하여 탈취

  1. 공격자는 탈취한 Cookie를 악용해서 이전 웹사이트에서 원치않는 Request를 강제로 실행.

CSRF Protection
GET Http Request Method를 제외한 상태를 변화 가능하게 하는 POST, PUT, PATCH , DELETE Request로부터 Protection을 수행.
HTTP RequestX-CSRF-TOKENCSRF token이 포함되어야 HTTP Request를 받아들임으로 위조요청을 방지.

Spring Security에서 기본적으로 활성화 되도록 설정되어 Protection이 적용됨.

STATELESS이거나 non-Browser Client를 위한 서비스인 경우, CSRFdisable 설정하여 CSRF Protection을 비활성화해도 된다.
▶ 따로 사용자에게 세션 또는 토큰을 부여하지 않으므로.


CSRF Protection 해결 방법

  • CSRF Token :
    CSRF 공격을 방지하기 위해 사용되는 TOKEN Pair
    ▶ 한 토큰서버 세션 인메모리 DB에 저장하고, 나머지 토큰HTTP Response Header에 저장

    Spring SecurityCSRF를 가진 요청통신을 허용하도록 설정되어CSRF 토큰이 없으면 무조건 차단
    ▶ 반드시 HTTP 요청Header : X-CSRF 토큰이 포함되어야함.

    Server에서 Client의 이전 HTTP Request에서 Session과 연결된 CSRF Token을 발급 및 Client는 매번 Http Request를 전송할때마다 이전 HTTP Request에서 발급된 고유한 CSRF TokenX-CSRF-TOKEN Header로 포함하여 함께 전송하는 방식.
    Thymeleaf를 통해 Web Application을 build 시 Spring Security는 자동으로 모든 FormCSRF Token을 생성하여 추가된다.

    CSRF Token 획득 방법 :
    Controller Method의 매개변수의 HttpServletRequest instance를 통해 해당 REST API 호출시의 HTTP Request에서 보통 form에서 type=hidden으로 숨겨진 <input> field의 name="_csrf"를 참조하여 CSRF-TOKENCsrfToken으로 캐스팅하여 반환하는 Controller Method 생성

    X-CSRF-TOKEN : CSRF TokenHTTP Requestheaders에 포함하는 역할을 수행.


  • CSRF 비활성화 :
    Client에서 JWT Token을 사용하여 REST API를 호출하는 Session을 사용하지않는 STATELESS의 경우에만 CSRF Protection 비활성화를 수행
    SecurityFilterChain을 Configuration 후 반환하는 @Bean Method에서 HttpSecurity객체를 이용하여 httpsecurity객체.csrf(csrf->csrf.disable()); 선언.

  • SameSite Cookie
    。Client가 CookieHTTP Request와 함께 전송할 수 있는 범위를 제한하는 보안속성
    타 사이트에서 HTTP Request 시 Cookie가 전송되지 않도록 제한함으로써 CSRF 공격 방지용도로 활용.

    。Spring의 application.yml에서 다음을 설정.
server.servlet.session.cookie.same-site=strict
  • same-site=strict :
    。오직 동일한 사이트에서만 HTTP Request에 Cookie를 포함하여 전송.
    ▶ 가장 강력한 보안으로 사이트 간 모든 HTTP Request에는 Cookie를 미포함.

  • same-site=lax :
    。외부 사이트에서 HTTP Request를 전송 시 GET Request Method에 대해서만 Cookie를 포함.
    POST, PATCH , DELETE 등의 Request Method 또는 AJAXHTTP Request에는 Cookie가 포함되지 않음.

    CSRF 공격을 방지하면서도 정상적인 링크 이동이 가능하도록 구축 시 사용.

  • same-site=none :
    。모든 HTTP RequestCookie가 항상 포함되도록 설정.
    CSRF공격에 매우 취약하므로, CSRF Token을 활용하여 추가적인 보안조치를 수행해야한다.

CSRF 관련 설정
SecurityFilterChain 관련 @Configuration 클래스에서 설정을 수행


httpsecurity객체.csrf(콜백함수)
HttpRequest에 대한 CSRF Protection을 설정하는 method.
Spring SecurityCSRF Protection이 기본적으로 활성화되어있으므로, 해당 method를 이용해 비활성화 설정이 가능.

。람다식의 매개변수로서 CSRF instance가 input.

http.csrf(csrf->csrf.disable());

HttpSecurity객체Filter chain에서 CSRF Protection을 비활성화하도록 설정
▶ 다음 코드는 다음처럼 메서드참조로 축약이 가능

.csrf(AbstractHttpConfigurer::disable)

Session이 존재하지 않는 경우는 비활성화해도 되지만, Session이 존재하는 경우, 반드시 CSRF protection을 활성화해야한다.
Spring Security에서는 default로 CSRF protection 활성화로 설정되어있으므로 JWT 토큰을 사용 시 비활성화

profile
공부기록 블로그

0개의 댓글