๐ ์ด ๊ธ์ ์ธํ๋ฐ ์ธํฐ๋ท ๊ฐ์ ์คํ๋ง ์ํ๋ฆฌํฐ - Spring Boot ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐํ๋ Spring Security ์์ ๊ธฐ๋ฐ๋ ๊ฒ์ผ๋ก ์ฌ๊ธฐ์ ์ธ์ฉ๋๋ PPT ์ด๋ฏธ์ง ๋ํ ๋ชจ๋ ํด๋น ๊ฐ์์์ ๊ฐ์ ธ์์์ ์๋ฆฝ๋๋ค.
๐น Logout ๋์ ๋ฐฉ์
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์ ์์ฒญ์ ํ๋ค.
- Spring Security๊ฐ ๋ก๊ทธ์์์ ๋ํด ํ์ํ ์์
์ ์ํํ๋ค.
- ์ธ์ ๋ฌดํจํ
- ์ธ์ฆํ ํฐ ์ญ์
- ์ธ์ฆํ ํฐ์ ๊ฐ๊ณ ์๋ SecurityContext ์ญ์
- ์ฟ ํค ์ ๋ณด ์ญ์
- ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ
- ์ ๊ณผ์ ๋ฟ ์๋๋ผ ๊ฐ๋ฐ์๊ฐ ์ํ๋ ๋๋ก ์ปค์คํ ํ์ฌ ๋ก๊ทธ์์ ์์ ์ ์ถ๊ฐํ ์๋ ์๋ค.
๐น Logout API
Form Logout ์ฌ์ฉ์ src > main > java > io > security > basicsecurity > SecurityConfig ์์ฑํ๋ค.
์ฌ์ฉ์ http.formLogout()๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋ค๋ฉด ๋ก๊ทธ์์ ๊ธฐ๋ฅ์ด ์๋ํ๋ฉฐ, api๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.logout() // ๋ก๊ทธ์์ ๊ธฐ๋ฅ ์ ์ฉ
.logoutUrl("/logout") // ๋ก๊ทธ์์ ์ฒ๋ฆฌ URL
.logoutSuccessUrl("/login") // ๋ก๊ทธ์์ ์ฑ๊ณต ํ ์ด๋ํ์ด์ง
.deleteCookies("JSESSIONID", "remember-me") // ๋ก๊ทธ์์ ํ ์ฟ ํค ์ญ์
.addLogoutHandler(logoutHandler()) // ๋ก๊ทธ์์ ํธ๋ค๋ฌ
.logoutSuccessHandler(logoutSuccessHandler()) // ๋ก๊ทธ์์ ์ฑ๊ณต ํ ํธ๋ค๋ฌ
}
๐ก ์ฌ์ฉ์์
// import ์๋ต
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.logout()
.logoutUrl("/logout")
// .logoutSuccessUrl("/login") // logoutSuccessHandler ๋์ฒด
.addLogoutHandler(new LogoutHandler() {
@Override
public void logout(HttpServletRequest request,
HttpServletResponse response, Authentication authentication) {
HttpSession session = request.getSession();
session.invalidate();
// ์ธ์
๋ฌดํจํ, ์ง์ ํ์ง ์์๋ LogoutFilter๊ฐ ๋ด๋ถ์ ์ผ๋ก ํจ
}
})
.logoutSuccessHandler(new LogoutSuccessHandler() {
@Override
public void onLogoutSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
response.sendRedirect("/login");
}
})
.deleteCookies("remember-me"); // ๋ก๊ทธ์์ ํ ์ญ์ ํ ์ฟ ํค ์ง์
return http.build();
}
}
- Logout ๊ธฐ๋ฅ์ ํ์ฑํํ๋ฉด LogoutFilter๊ฐ ์๊ธด๋ค.
- ํด๋น ํํฐ ๋ด๋ถ์๋ ์ด๋ฏธ ์๋์ ๊ฐ์ ๋ก๊ทธ์์ ํธ๋ค๋ฌ๊ฐ ์กด์ฌํ๋ค.
- ์ธ์ ๋ฌดํจํ ํธ๋ค๋ฌ
- ์ธ์ฆ ํ ํฐ, SecurityContext ์ญ์ ํธ๋ค๋ฌ
- ์ฟ ํค ์ ๋ณด ์ญ์ ํธ๋ค๋ฌ
- ๊ธฐ๋ณธ ๋ก๊ทธ์์ ํธ๋ค๋ฌ ์ธ์๋ ์ฌ์ฉ์๊ฐ ์ง์ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๊ณ ์ถ๋ค๋ฉด addLogoutHandler๋ฅผ ์ฌ์ฉํ๋ค.
- ์ฐธ๊ณ ๋ก ์คํ๋ง ์ํ๋ฆฌํฐ์ ๊ธฐ๋ณธ์ ์ธ ๋ก๊ทธ์์ ์ฒ๋ฆฌ๋ post ๋ฐฉ์์ด๋ค.
๐น LogoutFilter
๋ก๊ทธ์์์ ํ๊ธฐ ์ํด์๋ Logout Request๋ฅผ ๋ฐ์์ ๋, Server์ ์ธ์ ์ ๋ฌดํจํํ๊ณ , ์ฟ ํค ์ ๋ณด, ์ธ์ฆ ํ ํฐ๊ณผ ์ธ์ฆ ํ ํฐ์ด ์ ์ฅ๋ Security Context์ ๊ฐ์ฒด๋ฅผ ์ญ์ ํด์ค์ผ ํ๋ค.
๐น LogoutFilter ๋์ ๋ฐฉ์
- logoutUrl ๋ฉ์๋๋ก ์ง์ ํ๋ Url๋ก ์จ ์ฌ๋ฐ๋ฅธ ์์ฒญ์ธ์ง ํ์ธํ๋ค.
- ์ง์ ํ๋ Url๋ก ๋ค์ด์จ ์์ฒญ์ด ๋ง๋ค๋ฉด, SecurityContext์์ ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ๊บผ๋ธ๋ค.
- ๊บผ๋ธ ์ธ์ฆ ๊ฐ์ฒด๋ฅผ SecurityContextLogoutHandler๋ก ์ ๋ฌํ๋ค.
- ์ดํ, ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํด์ ์ธ์ ๋ฌดํจํ, ์ฟ ํค ์ญ์ , SecurityContext ์ญ์ ๋ฅผ ์ํํ๋ค.
- ๋ก๊ทธ์์์ด ๋๋๋ฉด SimpleUrlLogoutSuccessHandler ํธ์ถํ์ฌ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํ๋ค.
๐ reference