참새의 이야기
[Spring Security] Authentication Architecture 본문
Servlet Authentication Architecture
스프링 시큐리티의 인증은 아래의 조각들이 하나가 되어 움직인다.
가장 핵심이 되는 SecurityContextHolder
부터 하나씩 알아보자.
SecurityContextHolder
아래 그림은 SecurityContextHolder
의 구조를 보여준다.
이름에서부터 나타나듯이 SecurityContext
를 가지고 있다.
SecurityContextHolder
는 인증된 사람에 대한 정보(detail)를 가지고 있다.
SecurityContext
가 채워지는 방식과 무관하게 값만 채워지면 현재 인증된 사용자로 인식한다.
SecurityContextHolder
가 SecurityContext
를 가지고 있기 때문에 아래와 같이 간단하게 인증 정보에 접근할 수 있다.
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
String username = authentication.getName();
Object principal = authentication.getPrincipal();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
SecurityContextHolder
는 ThreadLocal을 사용해 정보를 보관하므로, 한 thread 내에서는 언제든 SecurityContext
에 접근할 수 있다.
이는 FilterChainProxy
에 의해 사용 후 초기화가 보장된다.
SecurityContext
SecurityContext
는 SecurityContextHolder
가 보유하는 것으로, Authentication
객체를 가진다.
Authentication
Authentication
객체는 두 가지 목적으로 이용된다.
AutehnticationManager
에게 사용자의 credentials를 제공- 현재 인증된 사용자가 누군지에 대한 정보를 제공
구성은 아래와 같다.
- principal
- OAuth가 아닌 username과 password로 인증하는 경우에는 UserDetails의 인스턴스다.
- credentials
- 주로 password.
- authorities
- role 혹은 scope
GrantedAuthority
GrantedAuthority
는 principal에게 부여되는 권한이다.
ROLE_ADMIN, ROLE_GUEST와 같은 role이 주로 authority에 해당한다.
AuthenticationManager
AuthenticationManager
는 security의 필터가 인증을 수행하는 방법을 정의하는 인터페이스다.
반환된 인증은 security의 filter에 의해 SecurityContextHolder
에 설정된다.
ProviderManager와 AuthenticationProvider
AuthenticationManager의 가장 흔히 사용되는 implementation이다.
AuthenticationProvider
인스턴스들에게 위임한다.
각 인스턴스는 서로 다른 인증 방법을 수행한다.
덕분에 다양한 방식의 인증이 가능한 것이다.
Request Credentials with AuthenticationEntryPoint
인증되지 않은 사용자가 인증 후에 접근할 수 있는 경로에 접근하려고 하면 인증(로그인) 페이지로 redirect 해야한다.
이 동작을 수행하는 것이 AuthenticationEntryPoint
다.
AbstractAuthenticationProcessingFilter
유저의 credentials를 인증하는 기본 필터다.
스프링 시큐리티가 AuthenticationEntryPoint
를 이용해 사용자에게 인증을 요청하면 AbstractAuthenticationProcessingFilter
는 어떤 인증 요청이든 처리할 수 있다.
인증의 전체적인 흐름을 요약하면 다음과 같다.
- 유저가 credentials를 제출하면,
AbstractAuthenticationProcessingFilter
는HttpServletRequest
로부터Authentication
을 생성한다. Authentication
은 인증을 위해AuthenticationManager
에게 넘겨진다.AuthenticationManager
에서 정의된 방법에 따라 인증 로직을 실행한다.
'Spring' 카테고리의 다른 글
Querydsl로 동적 쿼리 활용하기 (0) | 2024.02.14 |
---|---|
Querydsl 기본 세팅 (0) | 2024.02.05 |
[Spring Security] Spring security Architecture (0) | 2023.11.05 |
[MVC2] API 예외 처리 (2) | 2023.08.15 |
[MVC2] MVC 예외 처리 (0) | 2023.08.12 |