728x90
1. CSRF 토큰 사용할 때
1) 스프링 시큐리티 설정 Java 코드
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@RequiredArgsConstructor
public class SecurityConfig {
private final AuthenticationSuccessHandler authenticationSuccessHandler;
private final AuthenticationFailureHandler authenticationFailureHandler;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.formLogin(
formLogin -> formLogin
.loginPage("/member/login") // GET
.loginProcessingUrl("/member/login") // POST
.successHandler(authenticationSuccessHandler)
.failureHandler(authenticationFailureHandler)
)
.logout(
logout -> logout.logoutUrl("/member/logout")
);
return http.build();
}
}
- 기본적으로 별다른 설정을 하지 않으면 CSRF 토큰을 사용하는 방식으로 시큐리티가 동작한다
2) HTML 코드
<a href="javascript: document.logoutForm.submit();" class="inline-flex" sec:authorize="isAuthenticated()">
<i class="fa-solid fa-arrow-right-from-bracket"></i>
<span class="ml-[2px] hidden sm:block">
로그아웃
</span>
</a>
<!-- CSRF 때문에 /member/logout POST로 요청-->
<form name="logoutForm" th:action="@{/member/logout}" method="post" hidden></form>
- POST /member/logout 요청을 보내기 위해 form 으로 전송한다
3) 실제 브라우저 HTML 코드
<a href="javascript: document.logoutForm.submit();" class="inline-flex">
<i class="fa-solid fa-arrow-right-from-bracket"></i>
<span class="ml-[2px] hidden sm:block">
로그아웃
</span>
</a>
<!-- CSRF 때문에 /member/logout POST로 요청-->
<form name="logoutForm" action="/member/logout" method="post" hidden><input type="hidden" name="_csrf" value="e1dfbb29-e4db-434f-9653-fb38ad65e503"/></form>
- form 태그에 csrf 토큰 값이 추가된 것을 확인할 수 있다.
2. CSRF 토큰 사용하지 않을 때
1) 스프링 시큐리티 설정 Java 코드
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@RequiredArgsConstructor
public class SecurityConfig {
private final AuthenticationSuccessHandler authenticationSuccessHandler;
private final AuthenticationFailureHandler authenticationFailureHandler;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.formLogin(
formLogin -> formLogin
.loginPage("/member/login") // GET
.loginProcessingUrl("/member/login") // POST
.successHandler(authenticationSuccessHandler)
.failureHandler(authenticationFailureHandler)
)
.logout(
logout -> logout.logoutUrl("/member/logout")
)
.csrf().disable(); // CSRF 토큰 끄기;
return http.build();
}
}
- csrf().disable() 로 CSRF 토큰을 발행하지 않도록 설정한다
2) HTML 코드
<a href="/member/logout" class="inline-flex" sec:authorize="isAuthenticated()">
<i class="fa-solid fa-arrow-right-from-bracket"></i>
<span class="ml-[2px] hidden sm:block">
로그아웃
</span>
</a>
- form 으로 POST 요청을 보낼필요 없이 GET /member/logout 요청을 보내도 잘 동작한다.
정리
- logout() 으로 로그아웃 처리가 가능하다
- CSRF 토큰을 사용할 때는 반드시 POST 방식으로 로그아웃을 처리한다
- CSRF 토큰을 사용하지 않을 때는 GET 방식으로도 로그아웃 처리가 가능하다
https://velog.io/@wnsqud70/CSRFlogOut%EC%84%A4%EC%A0%95
728x90
'Spring > Spring 학습' 카테고리의 다른 글
[Spring] 스프링의 JDBC(DAO, JDBC, JdbcTemplate, DataSource) (0) | 2022.04.29 |
---|---|
[Spring] 스프링 빈과 의존 관계 설정 (0) | 2022.04.28 |