• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

안녕하세요 세션질문 계속 드리게 되네요.

22.07.06 11:11 작성 조회수 143

0

안녕하세요 강사님

https://thecodinglog.github.io/spring/security/2018/06/12/spring-security-4.html

이링크를 보게 되었는데요.

상태 비 저장 RESTful 웹 서비스

HTTP 세션을 사용하지 않고 모든 요청에 ​​대해 다시 인증한다. 그러나 각 요청 후에 SecurityContextHolder가 지워지도록 SecurityContextPersistenceFilter가 체인에 포함되는 것이 중요하다.

라는 내용이 있고

단일 세션에서 동시에 요청을 받는 응용 프로그램에서 동일한 SecurityContext 인스턴스가 스레드간에 공유된다. 

ThreadLocal를 사용하고 있지만 각 스레드에서는 HttpSession에서 인스턴스를 가져오기 때문에 동일한 인스턴스를 반환한다. 만약에 한 스레드에서 임시로 컨텍스트를 바꾸기를 원하는 경우 주의해야 한다. SecurityContextHolder.getContext() 로 컨텍스트를 가져오고 setAuthentication(anAuthentication)을 호출하면 같은 SecurityContext 인스턴스를 사용하고 있는 모든 현재 스레드에 있는 정보까지 다 같이 바뀌게 된다. 

SecurityContextPersistenceFilter를 커스터마이징하면 요청 마다 완전히 새로운 SecurityContext를 반환하게 할 수 있다. 이 방법으로 한 스레드에서 생긴 변경이 다른 스레드로 전파되지 않도록 할 수 있다. 또 다른 방법은 SecurityContextHolder.createEmptyContext() 메서드를 호출하여 임시적으로 컨텍스트를 만들 수도 있다.

 

이내용 같은데 .. 혹시 이게 맞을까요?..

 

제 과거 질문들입니다.

https://www.inflearn.com/questions/565980

https://www.inflearn.com/questions/572566

 

저 방법으로 해소를 시도를 먼저 진행해보겠습니다.. 

 

RESTAPI여서 생긴 문제인지 그게 궁금합니다.

답변 1

답변을 작성해보세요.

0

정수원님의 프로필

정수원

지식공유자

22.07.09 01:16

네 

https://www.inflearn.com/questions/565980

에서 제가 말씀 드린 답변을 보시면 위의 내용과 동일한 의미로 설명한 내용들이 있습니다.\

"다만 전제 조건이 있다면 securityContext 가 최종적으로는 세션에 저장되기 때문에 만약 동일계정의 여러명이 동일한 세션을 공유하고 있다면 securityContext 를 공유할 수 는 있지만 정상적인 상황에서는 발생할 수 없는 경우라 볼 수 있습니다."

"같은 계정 로그인시 동일한 context 가 생성이 된다면의 전제조건은 같은계정을 로그인하는 사용자들의 세션쿠키가 다 동일해야 함을 의미합니다.

위에서 말씀드렸지만 그래야 동일한 세션에 저장된 context 를 공유할 수 있습니다."
 
즉 하나의 세션을 공유하는 여러 스레드는 동일한 SecurityContext 를 공유할 수 있다는 내용입니다.
 
현재 sonbbang 님께서 테스트 하시는 실행환경이 하나의 단일세션을 공유하는 여러 스레드이고 이 때 어느 한 스레드가 SecurityContext 를 변경하거나 삭제할 경우 모든 스레드에게 적용되게 됩니다.
메모리에 하나의 공유 데이터를 여러 스레드가 바라보고 있으니 당연한 거겠죠
 
그래서 위의 상황을 해결하기 위해 SecurityContextPersistenceFilter 에서 하나의 세션을 공유하지 않도록 커스터 마이징하거나 단일 세션에서 SecurityContext 를 가져 오지 않고 스레드마다 SecurityContextHolder.createEmptyContext() 즉, 새로운 SecurityContext 를 생성해서 참조하도록 하는 방법들을 설명한 거라 볼 수 있습니다.
 
참고로 HTTP 세션을 사용하지 않는다면 SecurityContextPersistenceFilter 는 요청 스레드마다   SecurityContextHolder.getContext() 에서 항상 새로운 SecurityContext 를 반환하게 되고 인증 객체가 null 인 상태이기 때문에 매번 인증을 완료한 후 SecurityContext 에 저장하는 처리를 해 주어야 시큐리티가 인증 사용자로 인식하게 됩니다.