티스토리 뷰

728x90
반응형

목차

     

    Authentication

     

    인증이란 사용자가 식별정보(Cridential)를 이용해 본인이 맞음을 증명하는 절차이다.

     

    스프링 시큐리티 내부에서는 이를 위해 제법 길고 촘촘한 과정이 이어지는데, 요약에 도전해보자.

     

    당연하게도 사용자가 크리덴셜을 담아 보낸 요청이 필터에 도달하면서 과정이 시작된다.

     

    UsernamePasswordAuthenticationFilter

     

    제출된 크리덴셜을 통한 인증을 처리하는 필터이다.

     

    가장 앞에서 크리덴셜만 담은, 인증이 완료되지 않은 토큰을 생성(UsernamePasswordAuthenticationToken) 후

     

    AuthenticationManager 호출.

     

    AuthenticationManager

     

    인증을 총괄하는 관리자 인터페이스. 실질적인 인증관리는 해당 클래스를 구현한 ProviderManager에 의해 이루어지며

     

    ProviderManager는 AuthenticationProvider에게 인증에 대한 처리 위임을 한다.

     

    인증 여부를 확인하는 authenticate() 메서드를 정의하고 있다.

     

    AuthenticationProvider

     

    인증 처리를 위임받아 실제적인 인증을 수행하는 인터페이스.

     

    UserDetails와 크리덴셜 저장소를 조회해 비교하여 인증을 수행한다.

     

    UserDetails

     

    UserDetailsService에 의해 생성되며 크리덴셜과 권한 정보 등을 담는 인터페이스이다.

     

    이후의 자격증명에 이용된다.

     

    SecurityContextHolder and SecurityContext

     

    다시 AuthenticationProvider로 돌아와서, 해당 인터페이스는 UserDetails의 크리덴셜과

     

    앞서 받은 토큰에 포함된 크리덴셜이 일치하는지 확인하며,

     

    검증에 성공하면 인증이 완료된 토큰을 생성해 리턴한다.

     

    이 토큰은 다시 UsernamePasswordAuthenticationFilter까지 전달되며,

     

    필터는 SecurityContextHolder를 이용해 SecurityContext에 토큰을 저장한다.

     

    이때 사용되는 SecurityContext는 인증된 Authentication 객체를 저장하는 역할을 하는 인터페이스이고

    SecurityContextHolder는 이런 SecurityContext를 관리하는 역할을 하는 클래스이다.

    참고로 스프링 시큐리티에서는 아래 그림과 같이 SecurityContextHolder에 의해 SecurityContext가 채워져 있다면

    인증이 완료된 사용자로 간주한다.

     

    추가로 토큰에 접근하려면 반드시 SecurityContextHolder를 거쳐야 한다.

     

    Authorization

     

    인증이 끝나면 다음은 권한 부여이다. 권한부여 과정은 인증보단 한결 가볍다.

     

    계속 가보자.

     

    AuthorizationFilter

     

    이름 그대로 권한 부여를 담당하는 클래스이다. URL을 통한 사용자의 접근을 제한한다.

     

    먼저 앞서 알아본 SecurityContextHolder로부터 인증을 획득한다.

    이어서 권한 부여 처리 후 HttpServletRequest와 함께 인증을 전송하는 역할을 하는데,

    이 역할은 다음 컴포넌트인 AuthorizationManager 인터페이스를 DI 받음으로써 가능해진다.

     

    참고로 check() 메서드는 AuthorizationManager의 구현 클래스에 따라 로직이 다른데,

    URL을 기반으로 한 권한 부여 처리는 그림에 있는 RequestMatcherDelegatingAuthorizationManager를 사용한다.

     

    AuthorizationManager

     

    권한부여 처리를 총괄하는 인터페이스이다. 권한부여 여부를 확인하는 check() 메서드를 정의하고 있다.

     

    RequestMatcherDelegatingAuthorizationManager

     

    AuthorizationManager의 구현체 중 하나이며, 직접 권한 부여 처리를 하지 않고

    RequestMatcher를 통해 매치되는 AuthorizationManager에게 권한 부여 처리를 위임한다.

    계속해서 매치되는 Authorization 구현 클래스가 있다면 그 구현 클래스가 사용자의 권한을 체크하며,

    적절한 권한이라면 다음 단계를, 그렇지 않다면 예외를 표시한다.

     

    추가로 여기서 RequestMatcher 객체는 SecurityConfiguration에서 메서드 체인 정보를 기반으로 생성된다.

     

    이상의 글에 대한 풀버전(?)은 아래 글에 있다.

    2022.09.22 - [Development/Spring] - [Spring]Spring Security - 인증(Authentication) 구조

    2022.09.22 - [Development/Spring] - [Spring]Spring Security - 권한 부여(Authorization) 구조

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   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
    글 보관함