1. 참조: https://ohtaeg.tistory.com/8, https://wildeveloperetrain.tistory.com/163

  2. 구조

    Untitled

    1. 인증된 사용자 정보인 Principal은 Authentication(usernane, password, principa, role 정보 등)에서 관리
    2. Authentication을 SecurityContext가 관리
    3. SecurityContext는 SecurityContextHolder가 관리
  3. Authentication

    1. 접근 주체의 정보와 권한을 가지는 객체
    2. 스프링 시큐리티에서는 인증 시 id, password를 이용한 credentials 기반의 인증 사용
    3. 인증 후 인증 결과를 SecurityContext에 보관하며, 필요시 접근하도록 함
    4. 구조
      1. Principal: 접근 주체의 아이디 또는 객체를 저장
      2. credentials: 접근 주체의 비밀번호를 저장
      3. authorities: 인증된 접근 주체자의 권한 목록을 저장
      4. details: 인증에 대한 부가 정보를 저장
      5. authenticated: boolean타입의 인증 여부를 저장
  4. SecurityContext

    1. Authentication 객체가 보관되는 저장소 역할, 필요시 Authentication 객체를 꺼내서 사용
    2. Thread Local 별로 관리되기 때문에 전역이 아닌 같은 스레드의 경우에만 같은 객체를 조회 가능
    3. 즉, 각 Thread Local에 Security Context를 가짐
  5. SecurityContextHolder

    1. SecurityContext 객체를 보관하는 wrapper 클래스
    2. SecurityContextHolder에서는 Thread Local의 전략 설정 가능
  6. Thread Local

    Untitled

    1. Thread Local은 한 쓰레드 내에서 사용하는 공용 저장소
    2. 일반적인 변수는 해당 블록에서만 유효하지만, Thread Local을 사용하게 되면 특정 스레드의 모든 코드에서 해당 변수를 사용할 수 있게 됨
    3. 즉, Thread Local을 사용해서, Authentication을 한 쓰레드 내에서 공유 가능
    4. 그러므로 쓰레드가 달라지면 제대로 된 인증 정보를 가져올 수 없음
  7. 세션 커스텀 인증객체 작성

    1. 참고: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=platinasnow&logNo=221398649213

    2. 코드

      Untitled

      Untitled

      1. Spring Security에서는 SPRING_SECURITY_CONTEXT_KEY를 세션의 키로 하여 로그인 세션을 생성
      2. UsernamePasswordAuthenticationToken으로 인증 값 생성
      3. 생성자 매개변수로 Principal객체(인증객체), credentials(비밀번호?), 권한 목록을 매개변수로 받음)
      4. 차례대로 아이디, 비밀번호, 권한