* 정수원 님의 스프링 시큐리티 OAuth2 강의 내용을 참고.(https://www.inflearn.com/course/%EC%A0%95%EC%88%98%EC%9B%90-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0)
< Authentication - 인증 >
- SecurityContext - 이 객체가 생성되면 이미 인증받았다는 것을 의미하기 때문에 다시 인증 절차를 진행할 필요가 없다. 전역적으로 인증된 Authentication 객체를 어디에서든지 참조할 수 있도록 해준다.
- AuthenticationFilter - 로그인을 인증하는 필터다. 일반적으로는 로그인 url로 요청하게 되면 Authentication 객체를 만든다.
가장 보편적으로 사용하는 방식은 UsernamePasswordAuthenticationFilter가 있다. - Authentication - 사용자가 입력한 Id, password 값을 저장한다.
- AuthenticationManager - 인증 관리자이다. 인증 처리를 실질적으로 할 수 있는 클래스를 찾아서 위임하는 역할이다. AuthenticationFilter가 Authentication 객체를 만든 후 AuthenticationManager를 호출한다.
- AuthenticationProvider - 실제로 Id와 password를 최종적으로 검증해서 인증에 성공 / 실패를 처리하는 클래스다.
- 인증 성공 : Authentication 인증 객체를 다시 만들어 UserDetails 타입의 객체를 저장하고 User가 가지고 있는 권한과 권한 증거도 저장한다. 인증에 성공한 Authentication 객체를 AuthenticationFilter에 전달한다. Filter는 전달받은 Authentication 인증 객체를 SecurityContext에 보관소에 저장한다.
- 인증 실패 : AuthenticationFilter에 실패 정보를 보낸 후 Filter에서 실패 처리를 한다.
- UserDetailService - DB의 데이터와 입력된 Id, password가 일치하는지 확인한다. 만약 존재한다면 User의 정보를 담은 객체의 타입은 UserDetails 타입으로 만들어서 반환을 해야 한다.
< Authorization - 인가 >
- ExceptionTranslationFilter - FilterSecurityInterceptor에서 예외가 발생하게 되면 두 가지로 나눠서 예외 처리를 한다.
- 인증이 안되었을 경우
- 인증은 되었지만, 권한이 없을 경우
- FilterSecurityInterceptor - 인가의 권한이 있는지 없는지 판단하고 결정한다.
- AccessDecisionManager - AccessDecisionVoter의 결과를 확인해 최종적으로 사용자가 Spring MVC Servlet에 접근할 수 있도록 접근 허가 여부를 판단한다.
- AccessDecisionVoter - 현재 사용자가 접근하고자 하는 그 자원의 권한이 있는지 없는지를 투표하는 클래스
- Access Granted - 허가
- Access Denied - 보류