인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

hoonseung님의 프로필 이미지
hoonseung

작성한 질문수

스프링 시큐리티 OAuth2

DefaultOAuth2AuthorizedClientManager -필터 기반으로 구현하기

CustomOAuth2AuthenticationFilter 구현 중 질문

작성

·

23

·

수정됨

0

CustomOAuth2AuthenticationFilter으로 인증까지 처리 후

home으로 리다이렉션을 하는거 까지 구현을 하였는데요

HomeController에서 인증객체를 가져오려고 하면 null을 가져오는데요 CustomOAuth2AuthenticationFilter에서 securitycontext에 저장하였다가 리다이렉션할 때 새로운 스레드에서 이것을 처리해서 그 스레드에는 securityContextHolder에는

인증객체가 없는 거 같은거 같은데 해결방법이 있을까요

nio-8081-exec-2 스레드는 customFilter에서 holder에 제대로 저장하는데 리다이렉션 후 home에서는 nio-8081-exec-3이 받습니다.

 

 

답변 2

1

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

CustomOAuth2AuthenticationFilter 에서 인증 객체를 세션에 저장해야 합니다

아마 시큐리티 최신버전이라면 이 부분이 바뀐 부분이라 그렇습니다

이 부분은 내용이 길고 좀 복잡해서 최신버전의 공식문서나 혹은 저의 시큐리티 6 강의를 참고하셔야 될것 같습니다

아마 구 버전을 쓰신다면 문제가 안될겁니다

세션에 자동적으로 저장해 주기 때문입니다

hoonseung님의 프로필 이미지
hoonseung
질문자

아 감사합니다.. 좀 더 고민할걸 그랬네요.. 그리고.. 또 질문이 있는데.. 해당 필터랑 컨트롤러의 /ouathLogin 엔드포인트를 같이 사용할 때 컨트롤러까지 오지 않는 이유가 있을까요? 혹시 AuthenticationSuccessHandler 의 response.sendRedirect("/home"); 이거와 연관이 있는건가요.?

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

그건 여러가지 이유가 있을 수 있습니다

필터에서 먼저 요청을 잡아서 처리하는 바람에 컨트롤러까지 못갔을 수도 있고 컨트롤러에 접근 권한자체가 없을 수도 있습니다

이건 요청 흐름을 디버깅하면서 따라가보면 그 지점을 알 수 있습니다

사실 흐름을 따라가면서 확인한다는게 첨에는 좀 어려울수 있는데 계속 반복하디보면 오히려 더 명확하게 이해가 되는 장점이 많습니다

시도해 보시기 바랍니다

0

안녕하세요, 인프런 AI 인턴입니다. hoonseung님.

CustomOAuth2AuthenticationFilter를 통해 인증을 처리한 후 HomeController에서 인증 객체를 가져올 때 문제가 발생하는 것에 대해 질문 주셨네요. 이 문제는 인증 정보를 SecurityContextHolder에 저장했지만 다른 스레드에서 해당 정보를 제대로 가져오지 못하는 상황으로 보입니다.

이러한 문제는 스프링 시큐리티가 인증 정보를 기본적으로 ThreadLocal에 저장하기 때문에 발생할 수 있습니다. 그래서 이 정보는 요청이 진행되는 동안 동일한 스레드에서만 유효하게 접근할 수 있죠. 각기 다른 스레드에서 이를 처리하려면 좀 더 세심한 관리가 필요합니다.

해결방법:
1. SecurityContextHolder 모드 변경: 기본적으로 SecurityContextHolder는 ThreadLocal에 인증 정보를 저장하지만, SecurityContextHolder.MODE_INHERITABLETHREADLOCAL로 변경하면 자식 스레드에서도 이를 공유할 수 있습니다.

```java
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
```

이 설정을 통해 리다이렉션 후에도 자식 스레드에서 인증 정보를 가져올 수 있을 것입니다.
  1. Session 기반 인증 정보 저장: SecurityContextPersistenceFilter를 통해서 보통 SecurityContext가 세션에 저장되는데, 요청이 완전히 끝나기 전에 이를 세션에 저장해서 다른 스레드에서도 동일한 인증 정보를 참조할 수 있게 만드세요. 확인해보니 SecurityContextPersistenceFilter가 설정되어 있는지, 그리고 세션 관리를 웹 세션으로 설정했는지 점검해보세요.

아래 링크들을 통해 관련 내용과 유사한 문제 해결 사례를 찾아보신다면 추가적인 이해에 도움이 될 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

hoonseung님의 프로필 이미지
hoonseung

작성한 질문수

질문하기