Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

참새의 이야기

[Spring Security] Authentication Architecture 본문

Spring

[Spring Security] Authentication Architecture

참새짹짹! 2023. 11. 5. 14:12

Servlet Authentication Architecture

스프링 시큐리티의 인증은 아래의 조각들이 하나가 되어 움직인다.

가장 핵심이 되는 SecurityContextHolder 부터 하나씩 알아보자.

SecurityContextHolder

아래 그림은 SecurityContextHolder 의 구조를 보여준다.

이름에서부터 나타나듯이 SecurityContext를 가지고 있다.

SecurityContextHolder 는 인증된 사람에 대한 정보(detail)를 가지고 있다.

SecurityContext가 채워지는 방식과 무관하게 값만 채워지면 현재 인증된 사용자로 인식한다.

SecurityContextHolderSecurityContext 를 가지고 있기 때문에 아래와 같이 간단하게 인증 정보에 접근할 수 있다.

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

SecurityContextSecurityContextHolder 가 보유하는 것으로, 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를 제출하면, AbstractAuthenticationProcessingFilterHttpServletRequest로부터 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