inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 시큐리티

7) 인증 관리자 : AuthenticationManager

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

236

sonbbang

작성한 질문수 11

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여서 생긴 문제인지 그게 궁금합니다.

java Spring Security spring-boot

답변 1

0

정수원

네 

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 에 저장하는 처리를 해 주어야 시큐리티가 인증 사용자로 인식하게 됩니다.

시큐리티 공부 버전 질문

0

190

1

[해결 방법] MethodSecurityConfig.customMethodSecurityMetadataSource() 호출하지 않는 이슈

0

198

1

AbstractSecurityInterceptor.class.beforeInvocation()를 2번 실행하는 경우

0

187

1

강의 코드가 왜이렇게 뒤죽박죽인가요...

0

271

1

메인 페이지로 접속해도 login url로 리다이렉트가 되지 않습니다..

0

248

1

파라미터값이 넘어가지 않습니다 ....

0

382

1

security filterChain 설정 질문이 있습니다.

0

337

1

소스 부분 질문 드립니다.

0

213

2

섹션4 7번 강의 문제가 있는거 같네요.

0

352

2

파일이 수시로 이름이 바껴있네요 ㄷㄷ

0

312

1

HttpSessionSecurityContextRepository를 사용안하는 문제

0

566

2

error , exception 이 잘 안됩니다.

0

290

2

thymeleaf tag 질문합니다.

0

201

2

버전업하면서 deprecated된 것들이 너무많아요

0

483

1

spring security 패치 관련

0

443

1

모바일을 사용할때 토큰말고 세션

0

869

2

DB 연동한 인가 부분에 대한 질문입니다!

0

269

1

Ajax방식도 똑같이 Session방식을 사용하는건가요?

0

314

1

Config 파일 생성 시 질문이 있습니다.

0

238

1

강사님 몇일동안 구글 검색만 100개 했는데도 이유를 모르겠습니다..

1

443

2

403 에러 뜹니다.

0

829

2

login_proc의 존재에 대한 간략한 설명입니다

0

283

1

top.html에 로그인 링크를 만들어서 로그인을 해봤습니다

0

295

2

안녕하세요. DB에 저장될 때 이해 안 가는 값이 있어서 질문드립니다!

0

196

1