kiwi

csrf 방지 기법

by 키위먹고싶다

web

CSRF

[Cross-site request forgery, CSRF, XSRF] 사이트 간 요청 위조는 사용자의 의도와는 무관하게 공격자가 의도한 행위(수정, 삭제 , 등록)를 특정 웹사이트에 요청하게 하는 공격이다. 

 

사용자가 웹사이트에 로그인과 같은 인증된 상태에서 사이트간 위조 요청 공격 코드가 삽입된 페이지를 열면 공격 대상이 되는 웹사이트는  위조된 명령이 믿을 수 있는 사용자로부터 발송된 것으로 판단하게 되어 공격에 노출된다. 웹사이트가 사용자의 브라우저를 신뢰할 경우 발생한다.

 

CSRF토큰을 통한 보호

1. 서버가 뷰 랜더링 시 form태그에 hidden처리된 _csrf필드를 넣어준다.

// 로그인시, 또는 작업화면 요청시 CSRF 토큰을 생성하여 세션에 저장한다.
session.setAttribute("CSRF_TOKEN",UUID.randomUUID().toString());

// 요청 페이지에 CSRF 토큰을 셋팅하여 전송한다
<input type="hidden" name="_csrf" value="${CSRF_TOKEN}" />

 

2. csrf token정보를 header에 포함하여 요청을 시도한다.

헤더명은 X-CSRF-TOKEN or X-XSRF-TOKEN이다.

 

csrf토큰을 사용하기 위해서는 csrf().disable()처리가 아닌  csrf().csrfTokenRepository() 설정을 해야한다. 

 

REST API에서 CSRF

다음과 같이 SecurityConfig클래스를 만들면  Spring Security에서 csrf 보호가 default로 설정된다. GET요청을 제외한 PUT, DELETE, POST는 html에서 csrf토큰이 포함되어야 요청을 받아 들인다. 

 

그런데 spring security는 non-browser clients만을 위한 서비스라면 csrf를 disable해도 된다고 한다. 

 

보통 이렬 경우 session인증기반과 다르게 json web token과 같은 토큰 인증방식을 사용해 stateless하도록 서버에 인증정보를 저장할 필요가 없다. 따라서 csrf를 disable처리 하여 불필요한 코드를 작성하지 않는다. 

'web' 카테고리의 다른 글

HTTP와 HTTPS의 차이점에 대해서 알아보자  (0) 2022.01.14
HTTP 의 진화  (0) 2022.01.07

블로그의 정보

kiwi

키위먹고싶다

활동하기