programing

SecurityContextPersistenceFilter의 동작을 사용자 지정하는 방법은 무엇입니까?

starjava 2023. 8. 30. 21:05
반응형

SecurityContextPersistenceFilter의 동작을 사용자 지정하는 방법은 무엇입니까?

토큰 기반 인증을 사용하는 상태 비저장 REST API를 개발하고 있으며, 여기서 호출을 통해 수동으로 인증 개체를 보안 컨텍스트에 추가하고 있습니다.SecurityContextHolder.getContext().setAuthentication(authentication)사용자 정의 보안 필터 내에서.컨텍스트가 올바르게 설정되지 않는 문제를 경험해 왔습니다. 이는 다음과 같은 문제 때문이라고 생각합니다.

요청 간 보안 컨텍스트 저장

단일 세션에서 동시 요청을 수신하는 응용 프로그램에서 동일한 SecurityContext 인스턴스가 스레드 간에 공유됩니다.ThreadLocal은 사용 중이지만 각 스레드에 대해 HttpSession에서 검색되는 인스턴스와 동일합니다.스레드가 실행 중인 컨텍스트를 일시적으로 변경하려는 경우 이 문제가 발생합니다.SecurityContextHolder.getContext() 및 호출 집합만 사용하는 경우반환된 컨텍스트 개체에 대한 인증(인증)을 수행하면 동일한 SecurityContext 인스턴스를 공유하는 모든 동시 스레드에서 인증 개체가 변경됩니다. ...

SecurityContextPersistenceFilter의 동작을 사용자 지정하여 각 요청에 대해 완전히 새로운 SecurityContext를 만들어 한 스레드의 변경사항이 다른 스레드에 영향을 미치지 않도록 할 수 있습니다.

문제는 SecurityContextPersistenceFilter의 동작을 어떻게 변경하느냐입니다.

보안 컨텍스트가 http 세션과 연결되지 않도록 하고 싶지만 CSRF 보호 등을 구현하고 싶기 때문에 세션 생성 정책을 상태 비저장으로 설정하지 않습니다.

저는 오늘 오후에 정확한 질문이 있었는데, 이 열린 질문이 제 검색과 정확히 일치했습니다. 그래서 저는 제가 배운 것을 조금 더 추가하려고 생각했습니다.

동일한 보안 컨텍스트에 액세스하는 스레드가 있었습니다.SecurityContextPersistenceFilter의 동작을 직접 사용자 지정하는 방법(및 프레임워크 패턴)은 알 수 없었지만 스레드 세이프로 설정할 수 있는 두 가지 방법이 있었습니다.

첫 번째 해결책은 기본 인증 필터에 빈 컨텍스트가 생성되도록 하는 것이었습니다.여기에는 인증된 모든 요청이 포함되어 있으므로 솔루션에 도움이 됩니다.

SecurityContextHolder.createEmptyContext();

두 번째로 효과가 있었던 것은 WebSecurityConfig를 상태 비저장으로 변경한 것입니다. 이 작업은 운영 부서에서는 작동하지 않지만 완전성을 위해 여기에 추가되었습니다.

http.authorizeRequests()
  .anyRequest().authenticated()
  .and()
  .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
  ...

이 두 솔루션은 모두 특정 구성에 대해 독립적으로 작동합니다.더 잘 읽을 수 있는 세 번째 해결책이 있을 것이라고 확신하지만, 무엇인지는 모르겠지만 그렇게 하고 싶습니다.

저는 처음으로 글을 올립니다.어떤 피드백이든 환영합니다.

언급URL : https://stackoverflow.com/questions/30781498/how-to-customize-the-behaviour-of-securitycontextpersistencefilter

반응형