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 구조
- 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 원리
- 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)
- Provider들이 관리하는 인터페이스가 인증 관리자이고, 이 인증 관리자를 구현한 객체가 ProviderManager이다.
- AuthenticationManger는 AuthenticationManagerFactoryBean에서 DaoAuthenticationProvider를 기본 인증 제공자로 등록한 AuthenticationManager를 만든다. (Default)
- DaoAuthenticationProvider는 UserDetailsServicer가 있어야한다.
- 실제 Authentication과 Authentication Provider를 직접 개발하는 상황은 드물다. 대부분 UserDetails를 구현한 객체로 만들고 UserDetailsService를 만들어 Bean으로 제공해주면 DaoAuthenticationProvider 라는 default provider가 UserDetailsService를 가져다가 인증 제공을 맡아서 해준다.