스프링 시큐리티는 스프링 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해주는 스프링의 하위 프레임워크이다. 기본적으로 세션/쿠키 방식으로 인증한다.
implementation 'org.springframework.boot:spring-boot-starter-security'
@SpringBootApplication
public class SpringAuthApplication {
public static void main(String[] args) {
SpringApplication.run(SpringAuthApplication.class, args);
}
}
시큐리티를 활성화하면 다음과 같은 default 로그인 기능을 제공한다.
SecurityContext는 인증이 완료된 사용자의 상세 정보(Authentication)를 저장한다. Authentication는 현재 접근하는 주체(인증된 사용자)의 정보와 권한을 담는 인터페이스이다.
SecurityContextHolder를 통해 SecurityContext에 접근하고, SecurityContext를 통해 Authentication에 접근할 수 있다.
UsernamePasswordAuthenticationFilter는 Spring Security의 필터인 AbstractAuthenticationProcessingFilter를 상속한 Filter이다. Form Login 기반을 사용할 때 username 과 password 확인하여 인증한다.
UsernamePasswordAuthenticationToken은 Authentication을 implements한 AbstractAuthenticationToken의 하위 클래스로 User의 ID가 Principal 역할을 하고, Password가 Credential의 역할을 한다. 위의 필터에서 사용자의 정보를 담은 토큰을 만들어 AuthenticationManager에게 넘겨준다.
인증에 대한 부분은 Authentication Manager를 통해서 처리하게 되는데 인증에 성공하면 생성자를 이용해 객체를 생성하여 Security Context에 저장한다. 인증 상태를 유지하기 위헤 세션에 보관하며 인증이 실패한 경우에는 AuthenticationException을 발생시킨다.
인증에 성공하면 UserDeails 객체가 생성된다. 검증된 UserDetails는 Authentication객체를 구현한 UsernamePasswordAuthenticationToken을 생성하기 위해 사용되며 해당 인증 객체는 SecurityContextHolder에 세팅된다.
UserDetailsService 인터페이스는 UserDetails 객체를 반환하는 단 하나의 메소드를 가지고 있다. username/password 인증방식을 사용할 때 사용자를 조회하고 검증한 후 UserDetails를 반환한다. 일반적으로 이를 구현한 클래스의 내부에 UserRepository를 주입받아 DB와 연결하여 처리한다.