2022. 6. 22. 00:50ㆍWeb/Spring
Session 1 스프링 시큐리티 기본 이해
목적 : usernameAuthenticationFilter, LogoutFilter, RememberMeAuthenticationFilter, AnonymousFilterAuthenticationFilter, SessionManagementFilter, ConcurrentSessionFilter 이해
- 로그 아웃
로그아웃 request가 있을 시에 HTTP session을 무효화하고 rememberMe authentication이 있다면 없에지고 SecurityContextHolder를 삭제해주며 url 로 연결해준다.
이에 대한 공식 자료의 예시 코드는 아래와 같다.
public SecurityFilterChain filterChain(HttpSecurity http) {
http
.logout(logout -> logout
.logoutUrl("/my/logout")
.logoutSuccessUrl("/my/index")
.logoutSuccessHandler(logoutSuccessHandler)
.invalidateHttpSession(true)
.addLogoutHandler(logoutHandler)
.deleteCookies(cookieNamesToClear)
)
...
}
Logout을 핸들링 하기 위해 LogoutHandler를 사용할 수 있다.
성공적으로 Logout이 LogoutFilter 에 의해 되고 LogoutSuccessHandler가 적절한 주소로 가기 위해 호출 된다.
- LogoutFilter : LogoutHandler 인터페이스 사용시 LogoutFilter를 이용하여 쿠키를 자동적으로 없애준다.
- 세션(Session)
로그인이 성공했다면 Session이 만들어진다. 코드는 아래와 같다.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
http
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
);
return http.build();
}
여러 개의 Session을 manage하는 기능도 제공하고 있다.
- SessionManagementFilter : 현재 SecurityContextHolder의 내용에서 SecurityContextRepository의 내용을 체크 한다. 체크 하는 목적은 사용자가 현재 request에서 pre-authentication이나 remember-me를 통해 인증이 되었는지 확인한다. 만약 security context에 repository가 있다면 filter는 아무일도 하지 않지만, SecurityContext가 Authentication 객체를 갖고 있다면 Filter는 이전에 인증하였다고 판하여 SessionAuthenticationStrategy를 실행한다.
Spring Security에서는 현재인증을 정해진 번수 외에 application에서 동일하게 인증하는 것을 막는다.
가령 "Batman"이라는 사용자가 두 개의 다른 세선에서 로그인 하는 것을 막는다.
이를 ConcurrentSessionControlAuthenticationStrategy라고 부른다.
이러한 기능을 활용하기 위해서는 FilterChainPoxy에 있는 ConcurrentSessionFilter를 추가해야 한다.
- ConcurrentSessionFilter : 최대 허용 세션을 초과할 경우 세션 만료 시킴.
ConcurrentSessionFilter는 두 개의 생성자 sessionRegistry(SessionRegistryImpl의 인스턴스를 가리킴)와 sessioninformationExpiredStrategy(session이 만료될 때 적용되는 strategy를 정의함.)가 있다.
참고 자료
https://docs.spring.io/spring-security/reference/servlet/authentication/logout.html
https://docs.spring.io/spring-security/reference/servlet/authentication/session-management.html
'Web > Spring' 카테고리의 다른 글
[Spring] Spring Security 기본 이해 - (3) (0) | 2022.06.27 |
---|---|
[Spring] QueryDSL 오류 - org.springframework.dao.InvalidDataAccessApiUsageException: No sources given (0) | 2022.06.23 |
[Spring] Spring Security - 기본 이해 (1) (0) | 2022.06.21 |
[JPA] QueryDSL 사용하기 - 환경설정 (1) (0) | 2022.06.20 |
[Spring] 생성자 주입 vs 필드 주입 - Spring 특성 (2) (0) | 2022.05.29 |