오늘은 CSRF(Cross-site request forgery) 공격을 막기 위한 방법에 대해 알아보려고 합니다.
우선 Spring Security에서 csrf 설정을 활성화한다는 전제가 있어야 하고, 이 전제를 기반으로 Ajax Post 요청에서 Request Header에 Csrf Header, Token 정보를 넘겨줄 수 있게 됩니다.
CSRF 공격이 무엇인지 알아보고, 왜 Client의 Request에 csrf 설정을 해줘야 하는지까지 설명드리겠습니다.
CSRF(Cross-site request forgery, 사이트 간 요청 위조)
- 사이트 간 요청 위조는 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹 사이트에 요청하게 하는 공격
- 하나의 사례로는 유명 경매 사이트인 옥션에서 발생한 개인정보 유출 사건이 있습니다.
개인정보 유출 사례와 공격자가 어떤 행위를 할지 모르기 때문에, CSRF 방지는 필수적입니다. 그래서 이러한 공격을 예방하기 위해 CSRF Token을 통해 요청이 사용자가 전송한 것이 맞는지 확인하거나 재인증을 요구하는 등의 조치를 취하고 있습니다.
그러면 이제 서버, 클라이언트 단에서 처리해줘야 하는 과정에 대해 설명드리겠습니다.
서버
- Spring Security의 configure 설정에서 csrf 설정 활성화 (default : true)
- Spring Security에서 csrf 토큰 제공 방법
- HttpSessionCsrfTokenRepository (csrf token을 user session에 저장, Header : X-CSRF-TOKEN, default)
- CookieCsrfTokenRepository(csrf token을 browser cookie에 저장, Header : X-XSRF-TOKEN)
클라이언트
1. 공통으로 불러오는 jsp 페이지에 csrf header 및 token을 가져오도록 설정(meta data는 <head> tag 내에 정의)
<meta id="_csrf" name="_csrf" content="${_csrf.token}"/>
<meta id="_csrf_header" name="_csrf_header" content="${_csrf.headerName}"/>
$(function() {
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options) {
xhr.setRequestHeader(header, token);
});
});
2. ajax post 통신 시, header: X-CSRF-TOKEN, value 설정
$.ajax({
type: "POST"
, url: params.url
, data: params
, headers: $("meta[name='_csrf']").attr("content")
, dataType: "json"
})
3. Spring Form 태그 Library 활용
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
- form tag library 활용 시, form 태그에 <form:form>을 명시해주면 자동으로 csrf header, token이 담기게 됩니다
해당 설정을 마치면, 크롬 개발자 도구에서 Request Header에 X-Csrf-Token이라는 헤더 이름과 값이 들어가게 되는 것을 확인할 수 있습니다.
<참고 자료>
https://nordvpn.com/ko/blog/csrf/
'Java > Spring' 카테고리의 다른 글
[Spring] org.hibernate.AssertionFailure: null id in entry (don't flush the Session after an exception occurs) (0) | 2024.09.04 |
---|---|
[Spring] Spring Batch Architecture & Component (0) | 2024.07.05 |
[Java] ProcessBuilder (1) | 2024.04.02 |
[Spring] Lightsail 배포 서버에서 Spring Application 실행 시, Encoding UTF-8 인식을 하지 못하고 한글이 깨지는 현상 (1) | 2023.11.25 |
[Spring] @PropertySource, @Value 어노테이션에 대해 알아보자 (0) | 2023.11.25 |