[Spring Security] UserDetailsService/ UserDetails/ 인증(Authentication)/ 인가(Authorization)
인증(Authentication)
쉽게 말하자면 로그인이다. 인증을 위해서 자신의 정보를 제공하여야 한다.
인가(Authorization)
허가나 권한을 의미한다. 인증이 된 사용자라고 해도 이에 접근할 수 있는 권한이 있는지를 확인하는 과정이다.
스프링 시큐리티 (Spring Security)
웹에서 스프링 시큐리티를 적용하면 로그인을 통해서 '인증'을 수행한다. 그리고 컨트롤러의 경로에 시큐리티 설정으로 특정한 '권한'이 있는 사용자들만 접근할 수 있도록 설정한다.
인증과 username
* username : id를 스프링 시큐리티에서는 username이라함.
인증 처리의 흐름
1. 사용자의 아이디(username)만으로 사용자의 정보를 로딩
2. 로딩된 사용자의 정보를 이용해서 패스워드 검증
위와 같이 아이디와 패스워드를 한번에 조회하는 방법이 아닌, 스프링 시큐리티는 아이디(username)만을 이용해서 사용자 정보를 로딩하고 나중에 패스워드를 검증한다.
* 인증 처리는 '인증 제공자(Authentication Provider)' 를 이용해서 처리된다.
인증 처리를 위한 UserDetailsService
public interface UserDetailsService {
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
스프링 시큐리티에서 가장 중요한 객체는 실제로 인증을 처리하는 UserDetailService라는 인터페이스 구현체이다.
UserDetailService 인터페이스는 loadUserByUsername()이라는 메소드를 가지는데 이것이 실제 인증을 처리할 때 호출된다.
반환 타입 UserDetails
loadUserByUsername()의 반환 타입은 UserDetails 인터페이스이다. 이 인터페이스는 사용자 인증(Authentication)과 관련된 정보들을 저장한다.
스프링 시큐리티는 내부적으로 UserDetails 객체를 이용해서 패스워드를 검사하고, 사용자 권한을 확인한다.