SecurityContextHolder
ThreadLocal을 기반으로 동작한다.WAS는 ThradPool을 생성한다. 요청이 들어오면 큐에 적재되고 특정 쓰레드가 큐에서 요청을 가져와 처리한다. HTTP 요청은 처음과 끝이 동일한 쓰레드에서 처리된다. 다 사용된 쓰레드는 반납처리 된다. 최대 동시 처리 요청 개수는 ThreadPool의 개수와 같다. 개수가 늘리면 동시 처리가 늘어나지면 Thread Context Switching에 의한 오버헤드 또한 커지기에 성능이 선형적으로 증가하진 않는다.
-> WebFlux 같은 기술로 Thread 개수를 작게 유지하면서 요청을 동시처리할 수 있다.
SecurityContext를 쓰레드와 연결해주는 역할을 한다.
SecurityContextHolder를 통해 SecurityContext에 접근할 수 있다.
Authentication
사용자를 표현하는 인증 토큰 인터페이스이며, 인증주체를 표현하는 Principal 그리고 사용자의 권한을 의미하는 GrantedAuthority 목록을 포함
- Principal - UserDetails의 인스턴스이다.
- credentials - 자격 증명을 담당한다.
- authorities - User가 가진 권한을 가지고 있다.
- 사용자의 인증 완료 여부에 따라 Principal 값이 다르다
- 로그인 전 Principal — 로그인 아이디 (String)
- 로그인 후 Principal — userdetails.User 객체
Authentication 구현체
- AnonymousAuthenticationToken 클래스는 익명 사용자를 표현하기 위한 Authentication 인터페이스 구현체
- UsernamePasswordAuthenticationToken 클래스는 로그인 아이디/비밀번호 기반 Authentication 인터페이스 구현체
- RememberMeAuthenticationToken 클래스는 remember-me 기반 Authentication 인터페이스 구현체
인증 정보를 가져오는 방법
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
String username = authentication.getName();
Object principal = authentication.getPrincipal();
Object credentials = authentication.getCredentials();
boolean authenticated = authentication.isAuthenticated();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
authorities
AuthenticationManager에 의해 Authentication 객체에 삽입되고 권한에 의한 결정을 할때 AccessDecisionManager가 읽어서 사용한다.
'스프링 부트 > 시큐리티' 카테고리의 다른 글
[스프링 시큐리티] 주요 Security Filter들 정리 (0) | 2022.05.24 |
---|---|
[스프링 시큐리티] FilterChainProxy (0) | 2022.05.23 |
[스프링 시큐리티] AuthenticationManager, AccessDecisionManager (0) | 2022.05.23 |
[스프링 시큐리티] PasswordEncoder (0) | 2022.05.23 |
댓글