스프링 스큐리티
스프링 시큐리티는 스프링 기반의 어플리케이션의 인증, 인가를 담당하는 스프링 하위 프레임워크이다.
스프링 시큐리티는 서블릿 기반 필터 체인으로 동작한다. 각각의 필터는 개발자가 상속받아 메소드를 커스터마이징 가능하다.
필터 체인은 총 11개로 구성되어 다양한 기능을 제공한다.
1. 흐름
스프링 시큐리티에서 회원가입을 한 후, 로그인을 할 경우, default로 설정된 로그인 url은 "/login"으로 설정되어 있고,
loginProcessingUrl 메소드를 사용하여 변경이 가능하다. 로그인을 진행 후 로그인 객체는 spring security context에 저장되며 spring security context holder에 의해 관리된다.
2. spring security 흐름
스프링 시큐리티는 spring dispetcher servlet과 controller 사이에서 동작한다. 스프링 시큐리티는 delegatingfilterproxy가 http request를 가로채서 등록된 필터에 의해 인증, 인가가 적용된다.
3. 스프링 시큐리티는 configure 메소드를 상속받아 필터, 기능을 추가 삭제가 가능하다.
4. 로그인 필터에 의해 넘어온 request 요청은 attemptAuthentication으로 넘어간다.
// attemptAuthentication 메서드는 HTTP Request가 처음으로 들어오는 메서드
//attemptAuthentication 메서드에서는 Request Body에 있는 데이터를 DTO 객체로 변환한 후 Provider Manager의 authentication 메서드에 전달하게 된다.
//authentication 메서드의 결과가 성공이라면 인증된 객체가 successfulAuthentication 메서드로 돌아오고, 발행된 토큰과 같은 적절한 데이터를 포함한 HTTP Response를 돌려주면 된다.
//authentication 메서드의 결과가 실패라면 인자로 넘어온 예외를 활용해 사용자에게 적절한데이터를 보여줘 이후 프로세스를 진행할 수 있도록 하면 된다.
5. attemptAuthentication 메소드를 오버라이딩하고, 인증을 진행하게 되는데, request로부터 로그인 정보를 받아 Authentication 객체로 만들어서 반환시켜준다. 이 토큰은 다음 필터로 넘어가게되고, 정상적인 로그인 인지 판별하게 된다. 각 필터는 request, response를 chain.doFilter로 전달받게되며, 순차적으로 필터를 통과하게 된다.
6. 5번에서 인증 객체를 만들어줄 때, UserDetails 라는 인터페이스의 구현체를 만들게되는데, 사용자의 정보(아이디 패스워드, 권한, 만료여부 등등)를 담는 객체이다.
7. Authentication 객체는 Authentication Manager에 의해 관리되고 AuthenticationProvider에서 객체를 보고 인증을 처리한다.
8. 로그인을 완료했으면 SecurityContextHolder를 사용하여 SecutiryContext에 저장하며 관리된다.
9. 로그인 과정을 커스터마이징 하려면 이러한 과정을 알고있어야한다. 이것을 이용해 jwt도 구현하고, Oauth2를 적용하는 로그인 정책을 구현할 수 있다.