CSRF( 사용자 간 요청 위조 : Cross Site Request Forgery )
。사용자의 의도와는 무관하게 의도치않은 위조된 HTTP Request를 전송하는것을 의미.
。 User가 웹사이트 로그인 시 User Session가 생성되며, 해당 User Session는 Server에서 생성된 Session Cookie를 사용하여 식별
▶ User가 의도적이지 않게 해당 웹사이트에서 브라우저를 종료하거나 로그아웃하지않고 다른 악성웹사이트로 이동 시 이전 웹사이트의 Session Cookie에 Access하여 탈취하는 공격을 의미한다.
▶ 이후 공격자는 탈취한 Cookie를 악용해서 이전 웹사이트에서 원치않는 Request를 강제로 실행.
。Http Request Method : POST, PUT , PATCH , DELETE 등의 경우에 영향을 준다.
CSRF Protection
。GET Http Request Method를 제외한 상태를 변화 가능하게 하는 POST, PUT, PATCH , DELETE Request로부터 Protection을 수행.
▶ HTTP Request의 X-CSRF-TOKEN에 CSRF token이 포함되어야 HTTP Request를 받아들임으로 위조요청을 방지.
。Spring Security에서 기본적으로 활성화 되도록 설정되어 Protection이 적용됨.
。STATELESS이거나 non-Browser Client를 위한 서비스인 경우, CSRF를 disable 설정하여 CSRF Protection을 비활성화해도 된다.
CSRF Protection 해결 방법
CSRF Token :
。CSRF 공격을 방지하기 위해 사용되는 보안 TOKEN.
。Server에서 Client의 이전 HTTP Request에서 Session과 연결된 CSRF Token을 발급 및 Client는 매번 Http Request를 전송할때마다 이전 HTTP Request에서 발급된 고유한 CSRF Token을 X-CSRF-TOKEN Header로 포함하여 함께 전송하는 방식.
▶ Thymeleaf를 통해 Web Application을 build 시 Spring Security는 자동으로 모든 Form에 CSRF Token을 생성하여 추가된다.
。CSRF Token 획득 방법 :
Controller Method의 매개변수의 HttpServletRequest instance를 통해 해당 REST API 호출시의 HTTP Request에서 보통 form에서 type=hidden으로 숨겨진 <input> field의 name="_csrf"를 참조하여 CSRF-TOKEN을 CsrfToken으로 캐스팅하여 반환하는 Controller Method 생성
X-CSRF-TOKEN : CSRF Token을 HTTP Request의 headers에 포함하는 역할을 수행.

CSRF 비활성화 :
。 Client에서 JWT Token을 사용하여 REST API를 호출하는 Session을 사용하지않는 STATELESS의 경우에만 CSRF Protection 비활성화를 수행
。SecurityFilterChain을 Configuration 후 반환하는 @Bean Method에서 HttpSecurity객체를 이용하여 httpsecurity객체.csrf(csrf->csrf.disable()); 선언.
SameSite Cookie
。Client가 Cookie를 HTTP 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 또는 AJAX의 HTTP Request에는 Cookie가 포함되지 않음.
。CSRF 공격을 방지하면서도 정상적인 링크 이동이 가능하도록 구축 시 사용.
same-site=none :
。모든 HTTP Request에 Cookie가 항상 포함되도록 설정.
▶ CSRF공격에 매우 취약하므로, CSRF Token을 활용하여 추가적인 보안조치를 수행해야한다.