X509 인증 request가 오면 X509에 도달할때 까지 filter chain을 거친다. X509AuthenticationFilter
다양한 filter들은 밑에, 종류들을 나열해놨다.
2. Creates AuthenticationToken based on user credentials
인증요청이 AuthenticationFilter에 의해 수신되면, 수신된 request로 부터 username, password를 추출한다. 추출된 사용자 자격 증명을 기반으로 인증 개체를 생성한다.
만약 credential이 username, password면 이를 통해 UsernamePasswordAuthenticationToken을 username, password로 생성한다.
3. Delegating created AuthenticationToken for AuthenticationManagager
이후 UsernamePasswordAuthenticationToken object를 Authenticationmanager의 인증방법을 호출하는데 사용된다.
ProviderManager에는 사용자 요청을 인증하는 데 사용해야 하는 구성된 AuthenticationProvider 목록이 있다. ProviderManager는 제공된 각 AuthenticationProvider를 살펴보고 전달된 Authentication Object를 기반으로 사용자를 인증하려고 시도한다.
4. Trying to authenticate with list of AuthenticationProvider
AuthenticationProvider는 인증 객체를 이용해 사용자를 인증하려고 시도한다.
provider
CasAuthenticationProvider
JaasAuthenticationProvider
DaoAuthenticationProvider
OpenIDAuthenticationProvider
RememberMeAuthenticationProvider
LdapAuthenticationProvider
5. UserDetailsService Required
일부 AuthenticationProvider는 사용자 이름을 기반으로 사용자 세부 정보를 검색하기 위해 UserDetailsService를 사용할 수 있다.
6 & 7. UserDetails or User Object
UserDetailsService는 사용자 이름을 기반으로 UserDetails를 검색한다.
8. Authentication Object Or AuthenticationException
사용자가 성공적으로 인증되면 완전히 채워진 인증 객체가 반환된다.
9. Authentication is done
AuthenticationManager는 완전히 채워진 Authentication 개체를 관련 Authentication Filter로 다시 반환한다.
10. Setting up Authentication Object in SecurityContext
그런 다음 관련 AuthenticationFilter는 획득한 인증 개체를 향후 필터 사용을 위해 SecurityContext에 저장한다.
security의 filter
아까 위에서 말한 filter들의 종류들을 보자.
SecurityContextPersistenceFilter : SecurityContextRepository 에서 SecurityContext를 가져오거나 저장하는 역할.
LogoutFilter : 설정된 로그아웃 URL로 오는 요청을 감시하고 로그아웃 처리를한다.
BasicAuthenticationFilter : HTTP 기본 인증 헤더를 감시하여 처리한다.
RequestCacheAwareFilter : 로그인 성공 후 원래 요청 정보를 재구성하기 위해 사용한다.
UsernamePasswordAuthenticationFilter : username과 password를 사용하는 form 기반 인증에서 설정된 login URL로 오는 요청을 감시하며 유저 인증을 처리한다.
DefaultLoginPageGeneratingFilter : 인증을 위한 login form URL을 감시한다.
SecurityContextHolderAwareRequestFilter : HttpServletRequestWrapper를 상속한 SecurityContextHolderAwareRequestWapper 클래스로 HttpServletRequest 정보를 감싼다.
AnonymousAuthenticationFilter : 이 필터가 호출되는 시점까지 사용자 정보가 인증 되지 않았다면, 인증토큰에 사용자가 익명 사용자로 나타난다.
SessionManagementFilter : 인증된 사용자와 관련된 모든 세션을 추적한다.
ExceptionTranslationFilter : 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위암하거나 전달한다.
FilterSecurityInterceptor : AccessDecisionManager로 권한부여 처리를 위임해서 접근 제어 결정을 쉽게 해준다.
Authentication
모든 접근 주체는 Authentication을 생성한다. 이것은 SecurityContext에 보관되고 사용된다. security의 세션들은 내부 메모리(SecurityContextHolder)에 쌓고 꺼내 쓰는것이다.
AuthenticationManager
User의 요청내에 담긴 Authentication을 AuthenticationManager에 넘겨주고 AuthenticationManager를 구현한 ProviderManager가 처리한다.
1
2
3
4
5
6
7
8
publicinterfaceAuthenticationextendsPrincipal,Serializable{Collection<?extendsGrantedAuthority>getAuthorities();// Authentication 저장소에 의해 인증된 사용자의 권한 목록 ObjectgetCredentials();// 주로 비밀번호 ObjectgetDetails();// 사용자 상세정보 ObjectgetPrincipal();// 주로 ID booleanisAuthenticated();//인증 여부 voidsetAuthenticated(booleanisAuthenticated)throwsIllegalArgumentException;}
@Controller@AllArgsConstructorpublicclassUserController{privateUserServiceuserService;@GetMapping(value="/index")publicStringhome(){return"/index";}// 회원가입 페이지@GetMapping("/user/signup")publicStringdispSignup(){return"/signup";}// 회원가입 처리@PostMapping("/user/signup")publicStringexecSignup(UserDtomemberDto){userService.joinUser(memberDto);return"redirect:/user/login";}// 로그인 페이지@GetMapping("/user/login")publicStringdispLogin(){return"/login";}// 로그인 결과 페이지@GetMapping("/user/login/result")publicStringdispLoginResult(){return"/loginSuccess";}// 로그아웃 결과 페이지@GetMapping("/user/logout/result")publicStringdispLogout(){return"/logout";}// 접근 거부 페이지@GetMapping("/user/denied")publicStringdispDenied(){return"/denied";}// 내 정보 페이지@GetMapping("/user/info")publicStringdispMyInfo(){return"/myinfo";}// 어드민 페이지@GetMapping("/admin")publicStringdispAdmin(){return"/admin";}}