JAVA/SPRING

[SPRING SECURITY] 1011 공부(SecurityContextHolder)

gracelove91 2019. 10. 12. 11:38

SecurityContextHolder

  • SecurityContextHolder - SecurityContext - Authentication
  • SecurityContextHolder는 쓰레드로컬.

Authentication

  • principal

    • 누구에 해당하는 정보
    • UserDetailsService에서 리턴한 객체
    • Object 타입이긴 하지만, UserDetailsService에서 리턴한 값이기 때문에 사실상 UserDetails 타입.
  • authrities

    • "ROLE_USER", "ROLE_ADMIN" 등 Principal이 가지고 있는 '권한'
    • 인증 이후 인가 및 권한 확인할 때 이 정보를 참조한다.
  • UserDetailsService

    • 유저정보를 UserDetails 타입으로 가져오는 DAO인터페이스.
  • AuthenticationManager

    • UserDetailsService를 이용해서 인증한다.

AuthenticationManager와 Authentication의 관계.

  • 스프링 시큐리티에서 인증(Authentication)은 AuthenticationManager가 한다.
  • AuthenticationManager는 하나의 메서드선언부를 가진 인터페이스다.
    • Authentication authenticate(Authentication authentication) throws AuthenticationExeption;
      • 인자로 받은 authentication이 유효한 인증인지 확인하고 Authenticaion객체를 리턴한다.
      • 인증 확인 과정에서 비활성계정, 잘못된 비밀번호, 잠긴계정등의 에러를 던질 수 있다.
    • 인자로 받은 Authentication
      • formLogin할 때 입력한 정보.
        • Principal : "username"
        • Credential : "password"
    • 리턴된 Authentication
      • 인증된 Authentication.
        • UsernamePasswordToken
        • Principal : UserDetailsService에서 리턴하는 UserDetails.
        • Credential : 인증됐으므로 Credential은 비어있다.
        • GrantedAuthorities : 권한
    • 보통 구현체로 ProviderManager를 사용한다.

ThreadLocal

  • java.lang 패키지에서 제공하는 쓰레드 범위 변수. 즉 쓰레드 수준의 데이터저장소.
  • 같은 쓰레드 내에서만 공유.
  • 따라서 같은 쓰레드 내라면 위치상관없이 호출가능. 매개변수로 넘겨줄 필요 없다.
  • SecurityContextHolder의 기본전략.

AuthenticationManager를 통해 Authentication을 만들고, 만든 Authentication을 SecurityContext에 set해준다.
그렇다면 언제 set해주는 걸까? 그 공부는 내일!