스프링 시큐리티의 주요 용어

  • 접근주체(Principal) : 보호된 리소스에 접근하는 대상 (사용자)
  • 인증(Authentication) : 보호된 리소스에 접근한 대상이 누구인지, 애플리케이션의 작업을 수행해도 되는 주체인지 확인하는 과정 (ex. Form 기반 로그인)
  • 인가(Authorization) : 해당 리소스에 대한 접근 가능한 권한을 가지고 있는지 확인하는 과정 (인증 과정 이후에 수행)
  • 권한 : 어떠한 리소스에 대한 접근 제한으로, 모든 리소스는 접근 제어 권한이 걸려있으며, 인가 과정에서 해당 리소스에 대하여 제한된 최소한의 권한을 가졌는지 확인한다

스프링 시큐리티의 기본 절차

image

  1. 클라이언트가 사용자 이름과 비밀번호를 서버로 보낸다.
  2. AuthenticationFilter(UsernamePasswordAuthenticationFilter의 구현객체)가 HttpServletRequest 객체에서 사용자 정보를 가로챈다.
    • Authentication 객체(UsernamePasswordAuthenticationToken의 구현 객체)를 생성하고, 사용자 정보를 저장한다.
  3. AuthenticationFilter는 인증을 담당하는 인증관리자(AuthenticationManager)에게 2번에서 생성한 Authentication 객체를 전달한다.
  4. 인증관리자는 내부적으로 AuthenticationProvider에게 인증처리를 위임한다.
  5. AuthenticationProvider는 DB에 저장된 사용자 정보를 조회하기 위해서 UserDetailsService를 이용한다.
    • 개발자는 UserDetailsService 인터페이스의 loadByUsername(String username) 메소드를 재정의해서 DB에 저장된 사용자 정보를 반환한다.
  6. UserDetailsService는 DB에서 사용자 정보를 조회 후 UserDetails 인터페이스를 구현한 객체에 사용자 정보를 저장해서 반환한다.
    • UserDetails는 사용자정보, 비밀번호, 권한정보, 계정만료 정보 등을 제공하는 객체이다.
  7. AuthenticationProvider는 UserDetailsService가 제공하는 사용자 정보와 사용자가 로그인폼에서 입력한 사용자 정보를 비교하고, 사용자 인증 작업을 수행한다.
  8. 인증작업이 실패하면 AuthenticationException 예외를 반환하여 AuthenticationFilter로 돌아가 예외 처리를 수행한다.
    • 인증 작업이 성공한다면 Authentication 객체에 사용자정보와 권한정보를 담아서 AuthenticationManager에게 반환한다.
  9. 인증 완료 후 AuthenticationManager는 AuthenticationProvider로부터 반환받은 인증객체(인증결과 유저 + 유저권한 정보)를 SecurityContext에 저장한다.
  10. SecurityContext는 Session에도 저장되기 때문에, 전역적으로 SecurityContext를 참조할 수 있다.

AuthenticationProvider란?

  • 인증 절차를 정의하는 객체
  • DaoAuthenticationProvider의 구현 객체

위 과정에서 구현해야 하는 객체

  1. DB에서 유저 정보를 조회하는 기능이 있는 UserDetailsService interface를 구현한 객체
  2. 사용자 정보를 제공하는 UserDetails interface를 구현한 객체
  3. WebSecurityConfigurerAdapter 객체를 상속받은 WebSecurityConfig(클래스명은 상관없음) 객체
    • WebSecurityConfig에서는 요청URL 별로 인증이 필요한 것, 필요하지 않은 것을 구분할 수 있다
    • 스프링 시큐리티에서 제공하는 패스워드 인코더를 정의할 수 있다