강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

스프링 시큐리티

5) 인증 저장소 필터 - SecurityContextPersistenceFilter

초보같은 질문 하나만 하겠습니당..

작성

·

320

0

SecurityContext contextAfterChainExecution = SecurityContextHolder.getContext();
// Crucial removal of SecurityContextHolder contents before anything else.
SecurityContextHolder.clearContext();
this.repo.saveContext(contextAfterChainExecution, holder.getRequest(), holder.getResponse());
SecurityContextPersistenceFilter의 코드를 보면 위와 같이 되어있습니다.
 
중간에 clearContext()를 하면 contextAfterChainExecution 도 null이 된다고 생각했는데, 실제로는 null이 안되더라구요...
 
왜 그런건지 궁금합니다...
 
 

답변 1

5

정수원님의 프로필 이미지
정수원
지식공유자

SecurityContext contextAfterChainExecution = SecurityContextHolder.getContext();

// Crucial removal of SecurityContextHolder contents before anything else.

SecurityContextHolder.clearContext();

this.repo.saveContext(contextAfterChainExecution, holder.getRequest(), holder.getResponse());

에서 

SecurityContextHolder.clearContext(); 

은 내부적으로 ThreadLocal 에서 contextAfterChainExecution 을 삭제하고 있습니다.

private static final ThreadLocal<SecurityContext> contextHolder = new ThreadLocal<>();

// ~ Methods
// ========================================================================================================

public void clearContext() {
contextHolder.remove();
}

그렇기 때문에 사용자마다 할당된 ThreadLocal 에서 contextAfterChainExecution 가 비워지는 것이지 

contextAfterChainExecution 객체가 없어지거나 null 이 되는 것은 아닙니다.

그래서 ThreadLocal 에서 비워지기 전에 

SecurityContext contextAfterChainExecution = SecurityContextHolder.getContext();

으로 저장해놓고 ThreadLocal 에서 비운다고 이해하시면 될 것 같습니다.

즉 contextAfterChainExecution 가 SecurityContextImpl  객체를 참조하게 됩니다.

마치

List<String> list = new ArrayList<>();

list.add("user");

String name = list.get(0);

list.remove(0) ;

이렇게 하더라도 name 의 값에는 "user" 가 여전히 참조되고 있는 것과 같은 이치라고 보시면 됩니다.

다만 list 에는 더이상 "user" 값이 참조되지 않겠죠^^

 

 

 

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기