CSRF란
Cross Site Request Forgery의 약자로 크로스 사이트 요청 위조를 의미한다.
이러한 공격으로부터 보호하기 위해 CSRF Token을 만들어 사용한다.
클라이언트는 어떻게 CSRF 토큰을 얻나요
방법1. 서버 HTML 렌더링 시 meta 태그에 토큰을 집어 넣어주는 방법
<meta name="csrf-token" content="{{#_csrf}}token{{/_csrf}}">
방법2. 서버가 HTML 렌더링시 form 태그에 _csrf 필드를 넣어주는 방법
<form method="POST" enctype="multipart/form-data" action="/넘길페이지">
<div>
<input type="hidden" name="_csrf" value="{{#_csrf}}token{{/_csrf}}" />
<input type="submit" value="Upload" />
</div>
</form>
방법3. 서버의 API 호출 방법
RESTful 서버는 뷰 렌더링을 사용하지 않으므로, CSRF 토큰을 얻을 수 있는 별도의 API를 클라이언트에게 제공한다.
클라이언트는 발급받은 토큰을 요청 헤더에 넣어 요청한다.
서버는 토큰을 어떻게 생성하나요?
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
...
.csrf()
.csrfTokenRepository(cookieCsrfRepository())
.and();
}
@Bean
HttpSessionCsrfTokenRepository sessionCsrfRepository() {
HttpSessionCsrfTokenRepository csrfRepository = new HttpSessionCsrfTokenRepository();
// HTTP 헤더에서 토큰을 인덱싱하는 문자열 설정
csrfRepository.setHeaderName("X-CSRF-TOKEN");
// URL 파라미터에서 토큰에 대응되는 변수 설정
csrfRepository.setParameterName("_csrf");
// 세션에서 토큰을 인덱싱 하는 문자열을 설정. 기본값이 무척 길어서 오버라이딩 하는 게 좋아요.
// 기본값: "org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.CSRF_TOKEN"
csrfRepository.setSessionAttributeName("CSRF_TOKEN");
return csrfRepository;
}
@Bean
CookieCsrfTokenRepository cookieCsrfRepository() {
CookieCsrfTokenRepository csrfRepository = new CookieCsrfTokenRepository();
csrfRepository.setCookieHttpOnly(false);
csrfRepository.setHeaderName("X-CSRF-TOKEN");
csrfRepository.setParameterName("_csrf");
csrfRepository.setCookieName("XSRF-TOKEN");
//csrfRepository.setCookiePath("..."); // 기본값: request.getContextPath()
return csrfRepository;
}
}
REFFRENCE
'백엔드 > Spring' 카테고리의 다른 글
[Spring] Spring Validation을 이용한 유효성 검사 (0) | 2024.03.05 |
---|---|
[Swagger] 스웨거(Swagger) Annotation, Validation (0) | 2024.02.28 |
[Spring] Spring IoC 컨테이너, Bean (0) | 2024.01.16 |
[Spring] 필터(Filter)와 인터셉터(Interceptor) (1) | 2024.01.10 |
[Spring] 핸들러 메소드 - 1 (Mapping 어노테이션, 확장자, 요청헤더) (0) | 2023.12.22 |