[Spring Security] 스프링 시큐리티 절차
스프링 시큐리티의 주요 용어
- 접근주체(Principal) : 보호된 리소스에 접근하는 대상 (사용자)
- 인증(Authentication) : 보호된 리소스에 접근한 대상이 누구인지, 애플리케이션의 작업을 수행해도 되는 주체인지 확인하는 과정 (ex. Form 기반 로그인)
- 인가(Authorization) : 해당 리소스에 대한 접근 가능한 권한을 가지고 있는지 확인하는 과정 (인증 과정 이후에 수행)
- 권한 : 어떠한 리소스에 대한 접근 제한으로, 모든 리소스는 접근 제어 권한이 걸려있으며, 인가 과정에서 해당 리소스에 대하여 제한된 최소한의 권한을 가졌는지 확인한다
스프링 시큐리티의 기본 절차
- 클라이언트가 사용자 이름과 비밀번호를 서버로 보낸다.
- AuthenticationFilter(UsernamePasswordAuthenticationFilter의 구현객체)가 HttpServletRequest 객체에서 사용자 정보를 가로챈다.
- Authentication 객체(UsernamePasswordAuthenticationToken의 구현 객체)를 생성하고, 사용자 정보를 저장한다.
- AuthenticationFilter는 인증을 담당하는 인증관리자(AuthenticationManager)에게 2번에서 생성한 Authentication 객체를 전달한다.
- 인증관리자는 내부적으로 AuthenticationProvider에게 인증처리를 위임한다.
- AuthenticationProvider는 DB에 저장된 사용자 정보를 조회하기 위해서 UserDetailsService를 이용한다.
- 개발자는 UserDetailsService 인터페이스의 loadByUsername(String username) 메소드를 재정의해서 DB에 저장된 사용자 정보를 반환한다.
- UserDetailsService는 DB에서 사용자 정보를 조회 후 UserDetails 인터페이스를 구현한 객체에 사용자 정보를 저장해서 반환한다.
- UserDetails는 사용자정보, 비밀번호, 권한정보, 계정만료 정보 등을 제공하는 객체이다.
- AuthenticationProvider는 UserDetailsService가 제공하는 사용자 정보와 사용자가 로그인폼에서 입력한 사용자 정보를 비교하고, 사용자 인증 작업을 수행한다.
- 인증작업이 실패하면 AuthenticationException 예외를 반환하여 AuthenticationFilter로 돌아가 예외 처리를 수행한다.
- 인증 작업이 성공한다면 Authentication 객체에 사용자정보와 권한정보를 담아서 AuthenticationManager에게 반환한다.
- 인증 완료 후 AuthenticationManager는 AuthenticationProvider로부터 반환받은 인증객체(인증결과 유저 + 유저권한 정보)를 SecurityContext에 저장한다.
- SecurityContext는 Session에도 저장되기 때문에, 전역적으로 SecurityContext를 참조할 수 있다.
AuthenticationProvider란?
- 인증 절차를 정의하는 객체
- DaoAuthenticationProvider의 구현 객체
위 과정에서 구현해야 하는 객체
- DB에서 유저 정보를 조회하는 기능이 있는 UserDetailsService interface를 구현한 객체
- 사용자 정보를 제공하는 UserDetails interface를 구현한 객체
- WebSecurityConfigurerAdapter 객체를 상속받은 WebSecurityConfig(클래스명은 상관없음) 객체
- WebSecurityConfig에서는 요청URL 별로 인증이 필요한 것, 필요하지 않은 것을 구분할 수 있다
- 스프링 시큐리티에서 제공하는 패스워드 인코더를 정의할 수 있다