CSRF (Cross Site Request Forgery) , CSRF Protection

TopOfTheHead·2025년 11월 18일

Spring Security

목록 보기
10/21

CSRF( 사용자 간 요청 위조 : Cross Site Request Forgery )
。사용자의 의도와는 무관하게 의도치않은 위조된 HTTP Request를 전송하는것을 의미.

User가 웹사이트 로그인 시 User Session가 생성되며, 해당 User SessionServer에서 생성된 Session Cookie를 사용하여 식별
User가 의도적이지 않게 해당 웹사이트에서 브라우저를 종료하거나 로그아웃하지않고 다른 악성웹사이트로 이동 시 이전 웹사이트의 Session CookieAccess하여 탈취하는 공격을 의미한다.
▶ 이후 공격자는 탈취한 Cookie를 악용해서 이전 웹사이트에서 원치않는 Request를 강제로 실행.

Http Request Method : POST, PUT , PATCH , DELETE 등의 경우에 영향을 준다.

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.
    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을 활용하여 추가적인 보안조치를 수행해야한다.
profile
공부기록 블로그

0개의 댓글