csrf 란?
CSRF(Cross-Site Request Forgery)는 요청을 위조하여 사용자가 원하지 않아도 서버측으로 특정 요청을 강제로 보내는 방식이다. (회원 정보 변경, 게시글 CRUD를 사용자 모르게 요청)
개발 환경에서 csrf disable()
개발 환경에서는 Security Config 클래스를 통해 csrf 설정을 disable 설정하였다. 배포 환경에서는 csrf 공격 방지를 위해 csrf disable 설정을 제거하고 추가적인 설정을 진행해야 한다.
배포 환경에서 진행 사항
security config 클래스에서 csrf.disable() 설정을 진행하지 않으면 자동으로 enable 설정이 진행된다. enable 설정시 스프링 시큐리티는 CsrfFilter를 통해 POST, PUT, DELETE 요청에 대해서 토큰 검증을 진행한다.
- SecurityConfig 클래스 설정
- csrf.disable() 구문 삭제
- POST 요청에서 설정 방법
- mustache
<form action="/loginReceiver" method="post" name="loginForm">
<input type="text" name="username" placeholder="아이디"/>
<input type="password" name="password" placeholder="비밀번호"/>
<input type="hidden" name="_csrf" value="{{_csrf.token}}"/>
<input type="submit" value="로그인"/>
</form>
- Thymeleaf
<form action="/loginReceiver" method="post" name="loginForm">
<input type="text" name="username" placeholder="아이디"/>
<input type="password" name="password" placeholder="비밀번호"/>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<input type="submit" value="로그인"/>
</form>
- ajax 요청시
HTML <head> 구문에 아래 요소 추가
<meta name="_csrf" content="{{_csrf.token}}"/>
<meta name="_csrf_header" content="{{_csrf.headerName}}"/>
ajax 요청시 위의 content 값을 가져온 후 함께 요청
XMLHttpRequest 요청시 setRequestHeader를 통해 _csrf, _csrf_header Key에 대한 토큰 값 넣어 요청
- GET 방식 로그아웃을 진행할 경우 설정 방법
csrf 설정시 POST 요청으로 로그아웃을 진행해야 하지만 아래 방식을 통해 GET 방식으로 진행할 수 있다.
- securtiyConfig 클래스 로그아웃 설정
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
http
.logout((auth) -> auth.logoutUrl("/logout")
.logoutSuccessUrl("/"));
return http.build();
}
- LogoutController
@Controller
public class logoutController {
@GetMapping("/logout")
public String logout(HttpServletRequest request, HttpServletResponse response) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if(authentication != null) {
new SecurityContextLogoutHandler().logout(request, response, authentication);
}
return "redirect:/";
}
}
오류 발생시
mustache에서 csrf 토큰 변수 오류 발생시 아래 구문을 변수 설정 파일에 추가
- application.properties
spring.mustache.servlet.expose-request-attributes=true
'🌠Development > SpringBoot' 카테고리의 다른 글
[Spring Boot] @RestController (0) | 2024.04.10 |
---|---|
[Spring Boot] @Controller (0) | 2024.04.10 |
[Spring Security] 09 - 세션 설정 (0) | 2024.02.26 |
[Spring Securitiy] 08 - 세션 정보 확인 (0) | 2024.02.25 |
[Spring Security] 07 - 로그인 검증 로직 (0) | 2024.02.22 |