Spring boot Security 와 JPA를 연동한 인증처리 연습
인증처리 과정 (DB 데이터를 이용한 방법)
- 클라이언트는 id와 password 값을 입력하여 서버로 인증 요청을 보낸다.
- 스프링 시큐리티는 여러개의 필터들의 체인으로 구성되어있는데 그 중 인증필터(UserNamePasswordAuthenticationFilter)에서 클라이언트로부터 받은 id와 password가 담긴 Authentication 객체를 생성한다.
- AuthenticationManger는 AuthenticationProvider로 AuthenticationProvider는 DaoAuthenticationProvider로 Authentication 객체를 전달한다. (DB 데이터를 이용한 Credential 인증 방식일 경우)
- DaoAuthenticationProvider는 Authentication에 담긴 id값을 매개변수로 하여 UserDetailsService 인터페이스를 구현한 클래스에서 오버라이딩한 loadUserByUserName() 메서드를 호출한다.
- loadUserByUserName() 메서드는 매개변수로 전달받은 id값을 이용하여 DB에 접근하고 DB에 저장된 유저 정보를 얻는다. (만약 유저정보가 DB에 없다면 직접 Exception 발생 시키도록 개발)
- DB로부터 얻어온 유저정보(id, password, authorities)를 이용하여 스프링 시큐리티에서 지원하는 UserDetails(인증 과정에 필요할법한 정보들을 추상화한 인터페이스) 객체를 만들어 반환한다.
- DaoAuthenticationProvider는 반환받은 UserDetails 객체의 비밀번호와 기존의 Authentication 객체에 있던 비밀번호를 비교하여 같다면 인증을 성공시키고, 다르면 인증을 실패시킴(Bad Credentials 예외 발생)
- 인증이 성공하면 Authentication 객체에 유저의 principal 정보가 담긴다.
- Authentication 객체는 SecurityContext 내에 저장되어 관리되고 SecurityContextHolder 내에서 SecurityContext가 관리된다. SecurityContextHolder는 기본적으로 *ThreadLocal에 의해 관리된다.
- 또한, 인증처리가 성공하면 SPRING_SECURITY_CONTEXT 라는 속성으로 세션에 인증 정보가 추가된다.
- 인증 성공 시 SuccessHandler가 호출되어 성공 로직을 작성할 수 있으며, 인증 실패 시 FailureHandler가 호출되어 실패 로직을 작성할 수 있다.
- 만약 다음 요청이 인증처리가 요구되는 요청이라면 먼저 세션에 인증정보가 있는지 확인하고 있다면 인증처리 로직을 생략, 없다면 인증처리 로직 수행하는 방식으로 동작함