Home Authentication
Post
Cancel

Authentication

Login

  • Login이 되었다는 것은 authenticated Filed가 true인 Authentication객체를 SecurityContext에 갖고 있는 상태를 말한다.
    • Authentication이 AnnoymouseAuthenticationToken이라면 로그인하지 않은 사용자로 간주한다.
1
로그인 == Authentication(authenticated = true) only if Authentication != AnonymouseAuthenticationToken
  • UsernamePasswordAuthentication : Form Login, 세션 기반
  • Basic Authentication : 클라이언트 로그인, 세션 or 토큰 기반
  • OAuth2 로그인 : 로그인 위임
  • JWT 토큰 (Bearer 토큰) : 클리이언트 로그인, 세션 or 토큰 기반

Authentication 구조

AuthenticationStructure

  • Authentication을 제공하는 Filter들이 AuthenticationManager를 통해 Authentication을 인증하고 결과를 SecurityContextHolder에 넣어준다.
  • Authentication Interface는 아래와 같은 정보를 가지고 있다.
    • Set<GrantedAuthority> authorities : 권한 정보
    • principal : 인증 대상에 관한 정보, 주로 UserDetails객체가 온다.
    • credentials : 인증 확인을 위한 정보. 주로 비밀번호가 오지만, 인증 후에는 보안을 위해 삭제한다.
    • details : 그 밖에 필요한 정보. IP, 세션정보, 기타 인증 요청에서 사용했던 정보들
      • Request에 대한 Detail정보
      • Security Context Holder로 데이터가 들어가게 되면 컨트롤러 혹은 서비스 내에서 그 정보들을 접근하게 되는데 Request객체 에서 접근할 수 있는 값이 필요한 경우 불필요하게 Request객체를 서비스까지 가지고 가야하는 상황이 발생할 수 있기 때문에 해당 옵션을 두었다.
    • authenticated : Boolean형으로 인증 여부를 나타낸다.

Authentication Filter

  • UsernamePasswordAuthenticationFilter : 폼 로그인
  • RememberMeAuthenticationFilter : remember-me 쿠키 로그인
  • AnonymouseAuthenticationFilter : 로그인하지 않았다는 것을 인증함
  • SecurityContextPersistenceFilter : 기존 로그인을 유지함(기본적으로 Session을 이용)
  • BearerTokenAuthenticationFilter : JWT 로그인
  • BasicAuthenticationFilter : ajax 로그인
    • authorization헤더에 UserName, Password를 Base64로 Encoding해서 보내주면 filter에서 인증을 해주고, 요청을 곧바로 수행해줌
    • 로그인 페이지 필요 없음
  • OAuth2LoginAuthenticationFilter : 소셜 로그인
  • OpenIDAuthenticationFilter : OpenID 로그인
  • Saml2WebSssoAuthenticationFilter : SAML2 로그인

Authentication 원리

AuthenticationMac

  • Authentication은 사이트 내에서 통행증과 같은 역할을 한다.
    • Authentication을 구현한 객체들은 일반적으로 Token이라는 이름의 객체로 구현한다.
    • Authentication 내부에는 권한인 GrantedAuthority라는 인터페이스를 구현한 객체들을 Authorities에 넣어둔다.
  • Authentication filter에서 토큰이 발행이 되면 Security context에 들어가 있는 Authentication을 가지고 사이트에서는 사용자에 대한 인증, 권한 체크를 하게된다.
  • Authentication은 인증을 하기 위한 정보와 인증을 받기 위한 정보를 가지고있다.
    • Credentials : 인증을 받기 위해 필요한 정보, 비밀번호 등 (input)
    • Principal : 인증된 결과. 인증 대상 (output)
    • Details : 기타 정보, 인증에 관여 된 주변 정보들
    • Authorities : 권한 정보들
  • Authentication 객체는 SecurityContextHolder를 통해 세션이 있건 없건 언제든 접근할 수 있도록 필터체인에서 보장해준다.

인증 제공자(AuthenticationProvider)

  • Provider는 기본적으로 Authentication을 받아서 인증을 하고 인증된 결과를 다시 Authentication객체로 전달한다.
  • 인증 대상과 방식이 다양할 수 있기 때문에 인증 제공자도 여러개 올 수 있다.

인증 관리자(AuthenticationManager)

AuthenticationManager

  • Provider들이 관리하는 인터페이스가 인증 관리자이고, 이 인증 관리자를 구현한 객체가 ProviderManager이다.
  • AuthenticationManger는 AuthenticationManagerFactoryBean에서 DaoAuthenticationProvider를 기본 인증 제공자로 등록한 AuthenticationManager를 만든다. (Default)
  • DaoAuthenticationProvider는 UserDetailsServicer가 있어야한다.
  • 실제 Authentication과 Authentication Provider를 직접 개발하는 상황은 드물다. 대부분 UserDetails를 구현한 객체로 만들고 UserDetailsService를 만들어 Bean으로 제공해주면 DaoAuthenticationProvider 라는 default provider가 UserDetailsService를 가져다가 인증 제공을 맡아서 해준다.
This post is licensed under CC BY 4.0 by the author.