본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
안녕하세요 :)
오늘은 챌린지 18일차로, 어제보다는 조금 이른 새벽 공부네요. 마무리하고 자야겠어요..
오늘 배울 내용은,
Part A. 로그인, 로그아웃, 회원가입으로 배워보는 스프링 시큐리티 기초
Ch 5. AuthenticationProvider 와 인증
"02. SecurityContext 살펴보기" 입니다.
사용자 인증 정보는 어디에 저장할까? 에 대해 생각해보면 인증 프로세스가 완료되면 인증 엔티티에 대한 정보를 얻을 있다. AuthenticationManager 는 인증 프로세스를 성공적으로 완료한 후 요청이 유지되는 동안 Authentication 인스턴스를 저장한다. 또 저장하는 위치가 보안 컨텍스트 (SecurityContext) 라고 한다.
보안 컨텍스트에 저장되기까지의 흐름에 대해 살펴보면,
인증 프로세스가완료 되면 보안 컨텍스트에 인증 정보가 담기게 되고 컨트롤러에서는 보안 컨텍스트에서 정보를 이용할 수 있다.
보안 컨텍스트 인터페이스 SecurityContext 는 인터페이스로 두 개의 메소드를 제공한다.
getAuthentication(), setAuthentication()
SecurityContext 의 역할은 인증, Authentication 을 저장하고 관리하는 것이다.
SecurityContext 를 관리하는 세 가지 전략에 대해 알아보면,
SecurityContext 는 세 가지 전략에 의해 관리되며 관리자 역할을 하는 객체를 SecurityContextHolder 라고 한다.
SecurityContext 를 관리하는 기본 전략에 대해 살펴보자.
MODE_THREADLOCAL 은 SecurityContext 를 관리하는 기본 전략으로 ThreadLocal 을 활용한다. Threadlocal은 JDK 에 있는 구현으로 애플리케이션의 각 스레드가 저장된 데이터만 볼 수 있도록 보장한다. 즉, 다른 스레드의 ThreadLocal 에는 접근할 수 없고 자신의 보안 컨텍스트에만 접근 가능하다. 각 요청은 자신의 할당된 스레드를 가지며 자신의 보안 컨텍스트에 저장된 인증 세부 정보만 참조 할 수 있다.
만약 새로운 스레드가 생성되는 경우에는 어떻게 동작할까? (예를 들어, 비동기 메소드가 호출되어 새로운 스레드가 생기는 경우)
새로운 스레드 역시 자체 보안 컨텍스트를 가지며 기존 스레드에 있던 정보는 복사되지 않는다는 것을 알 수 있다.