SecurityContext
- Authentication 객체가 저장되는 보관소를 말한다.
- 필요 시 언제든지 Authentication 객체를 꺼내서 쓸 수 있도록 제공되는 클래스 이다.
- ThreadLocal에 저장되어 아무 곳에서나 참조가 가능하도록 설계함.
- Thread 마다 고유하게 할당된 구역이 있는데 그것을 ThreadLocal 이라고 말함.
- 인증이 완료괴면 HttpSession에 저장되어 어플리케이션 전반에 걸쳐 전역적인 참조가 가능함.
SecurityContextHolder
- SecurityContext 객체를 저장 하고 있는 공간을 말한다.
- 저장하는 방식에는 여러가지가 있다
- MODE_THREADLOCAL : 각 각의 쓰레드 마다 SecurityContext 객체를 할당 하고 있는 것 (기본값으로 설정됨)
- MODE_INHERITABLETHREADLOCAL : 메인 쓰레드와 자식 쓰레드는 하나의 SecurityContext를 유지하는 것을 말함.
- MODE_GLOBAL : 응용 프로그램에서 단 하나의 SecurityContext를 저장함. (Static 상태)
// SecurityConfig 클래스 내에 설정을 아래와 같이 잡으면 설정을 변경 할 수 있음.
protected void configure(HttpSecurity http) throws Exception {
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}
- SecurityContext 정보를 초기화 방법
SecurityContextHoler.clearContext(); // SecurityContext 기존 정보를 초기화함.
- Authentication 객체를 꺼내는 방법
//아래와 같은 방식으로 하면 Authentication 객체를 꺼낼 수 있음
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
// session에 저장된 값을 가져올 수 있음.
SecurityContext context = (SecurityContext)session.getAttribute(
HttpSessionSecurityContextRepositoy.SPING_SECURITY_CONTEXT_KEY);
Authenticaion authentication1 = context.getAuthentication();
인증 및 보관되는 전체적인 흐름
- Login 폼에 유저정보를 입력하고 submit을 누름
- 해당 유저의 정보를 ThreadLocal에 저장을 함.
- 서버에서는 해당 유저의 정보를 가지고 인증 과정을 거침.
- 인증 과정에서 인증을 실패한다면 쓰레드에 있는 정보를 초기화 시킴.
- 성공시 ThreadLocal에 있는 유저정보를 SecurityContextHolder에 저장시킴.
- 이후 HttpSession에 "SPRING_SECURITY_CONTEXT" 라는 이름으로 저장함.
'Backend > Security' 카테고리의 다른 글
AuthenticationManager, AuthenticationProvider (0) | 2023.01.22 |
---|---|
SecurityContextPersistenceFilter (0) | 2023.01.21 |
Authentication (0) | 2023.01.18 |
필터 초기화와 다중 보안 설정 (0) | 2023.01.18 |
DelegatingFilterProxy, FilterChainProxy (0) | 2023.01.18 |