springframework/시작하자SpringSecurity

13. 사이트 간 요청위조 : CSRF, CsrfFilter

Jungsoomin :) 2020. 9. 21. 11:19

CSRF( Cross Site Request Forgery ) 사이트 간 요청 위조 공격 

 

 

  1. 사용자가 인증을 완료하여 서버에서 JSESSIONID를 받급 받는다. 

  2. 공격자이메일과 같은 방법으로 링크사용자에게 전달

  3. 사용자링크를 여는 즉시 사용자의 브라우저이미지파일을 로딩하기위해  img 태그의 src 속성 값으로 서버 주소, 공격자의 주소 값으로 요청을 보낸다.

  4. 결국 인증된 사용자의 브라우저로 요청이 가므로 서버쿠키를 검사하고 인증된 사용자로 판단

  5. 사용자승인, 인지 없이 공격자의 배송지가 등록됨으로 공격이 완료된다.


Form 인증 - CsrfFilter

 

  • SpringSecurity 는 모든 Request 에 대해 랜덤하게 생성CsrfToken HTTP Prameter 로 요구한다.

  • Request전달된 CsrfToken 서버에 저장된 CsrfToken 비교하여 일치하지 않으면 AccessDeniedHandler 와 같은 처리를 하여 Request는 실패한다.

  • Client : Form 인증input:hidden[name=${_csrf.parameterName}][value=${_csrf.token}] 컴포넌트를 추가해주어 요청시 추가되도록 한다.

  • HTTP Method : PATCH, POST, PUT, DELETE 방식을 채용한다.

Spring SecurityCSRF 설정정보

  • http.csrf() : default 값 

  • http.csrf().disabled() : 비활성화


CsrfFilter 적용 후 의 CSRF 공격

 

  1. 사용자가 인증을 성공하고 , JSESSIONID 와 함께 CsrfToken 을 발급 받는다.

  2. 공격자사용자에게 이메일과 같은 방법으로 CSRF 공격을 시도

  3. img태그의 src 속성에 있는 주소 값으로 서버에 요청을 보내도 CsrfToken은 존재하지않기 때문에 서버는 해당 요청을 받지않는다.


Spring Frame Work 의 CustomTag : form 과 Thymeleaf 에서의 CsrfToken

 

Thymeleaf 와 같은 뷰 템플릿 엔진에서는 기재하지 않아도 기본적으로 CsrfToken 을 보내준다.

  • POST 방식 요청

Springform 태그 사용 시에도 기본적으로 CsrfToken을 보내준다.

 

위의 방법 없이 JSP 사용 시에는 적용되지 않기 때문에 input:hidden 태그를 작성하여 적용시켜줘야한다.