스프링 시큐리티 OAuth2/Spring Security Fundamentals

시큐리티 인증 및 인가 흐름 요약

webmaster 2022. 12. 17. 16:35
728x90

스프링 시큐리티 인증/ 인가 흐름

ServletFilter

  • 사용자 요청 시 DelegatingFilterProxy 클래스가 요청을 받는다.
    • DelegatingFilterProxy는 서블릿 필터로, 스프링의 기능을 사용하지 못하기 때문에 FilterChainProxy로 요청을 전달해 주는 역할만 한다.
  • FilterChainProxy는 여러 개의 필터를 가지고 있고, 하나씩 호출하며 인증을 진행한다(Authentication)

Authentication

  • 인증 필터에는 여러 종류가 있지만, 그 중 가장 많이 사용하는 UserPasswordAuthenticationFilter이다.
  • UserPasswordAuthenticationFilter가 인증 요청을 받고(/login), Authentication 객체를 만들게 된다.
    • Password, Id 와 같은 인증정보를 Authentication 객체에 넣어둔다.
  • Authentication 객체를 만든 후, AuthenticationManager를 호출한다
    • AuthenticationManager는 인증 처리를 할 수 있는 클래스(AuthenticationProvider)를 찾아 인증 처리를 위임하는 역할을 한다.
  • AuthenticationProvider는 전달받은 Authentication을 확인해, ID/Password 정보를 가지고 온 뒤, 일치하는지 확인한다.
    • AuthenticationProvider는 UserDetailService를 통해 DB에서 ID를 Query를 통해 질의를 하고, 반환받은 User 객체를 UserDetails 타입으로 변환해서 가지고 있는다.(ID 검증 완료)
    • AuthenticationProvider는 PasswordEncoder를 이용해, 암호화된 Password와 DB에 저장된 Password를 비교하여 인증 처리를 진행한다(Password 검증 완료)
    • 만약 둘 중 하나라도 실패하게 된다면 AuthenticationFilter까지 예외를 전달하여, 인증 실패 예외를 발생시킨다.
  • AuthenticationProvider를 통해 인증이 성공한 User는 다시 UserDetails 정보를 가지고, Authentication 객체를 만들어 최종적으로 인증이 완료된 객체를 AuthenticationFilter에 전달을 하게 되고,  AuthenticationFilter는 인증이 완료된 객체를 SecurityContext에 저장한다.
    • SecurityContext는 인증을 받았다는 보증을 하고, 어디서나 해당 정보를 꺼내서 사용할 수 있다.

Authorization

  • 인증은 완료가 되었지만, 권한이 있는지 확인이 필요하기 때문에 Authorization 체크를 해야한다(SecurityContext는 존재한다, 인증을 받았기 때문)
  • ExceptionTranslationFilter에서 인증, 인가에서 예외가 발생했을 경우 해당 필터에서 이를 처리해준다.
  • ExceptionTranslationFilter는 SecurityFilter 가장 마지막에 존재하는 FilterSecurityInterceptor에서 인가에 권한이 있는지 판단한다.
    • FilterSecurityInterceptor는 AccessDecisionManager 클래스를 가지고 있고, AccessDecisionManager 클래스는 내부적으로 AccessDecisionVoter를 가지고 있다.
    • AccessDecisionManager는 어떤 접근을 허용할지 말지 판단하는 클래스이고 AccessDecisionVoter는 현재 사용하는 자원이 접근 가능한지 투표해준다.

 

 

728x90