작성
·
24
·
수정됨
0
CustomOAuth2AuthenticationFilter으로 인증까지 처리 후
home으로 리다이렉션을 하는거 까지 구현을 하였는데요
HomeController에서 인증객체를 가져오려고 하면 null을 가져오는데요 CustomOAuth2AuthenticationFilter에서 securitycontext에 저장하였다가 리다이렉션할 때 새로운 스레드에서 이것을 처리해서 그 스레드에는 securityContextHolder에는
인증객체가 없는 거 같은거 같은데 해결방법이 있을까요
nio-8081-exec-2 스레드는 customFilter에서 holder에 제대로 저장하는데 리다이렉션 후 home에서는 nio-8081-exec-3이 받습니다.
답변 2
1
CustomOAuth2AuthenticationFilter 에서 인증 객체를 세션에 저장해야 합니다
아마 시큐리티 최신버전이라면 이 부분이 바뀐 부분이라 그렇습니다
이 부분은 내용이 길고 좀 복잡해서 최신버전의 공식문서나 혹은 저의 시큐리티 6 강의를 참고하셔야 될것 같습니다
아마 구 버전을 쓰신다면 문제가 안될겁니다
세션에 자동적으로 저장해 주기 때문입니다
그건 여러가지 이유가 있을 수 있습니다
필터에서 먼저 요청을 잡아서 처리하는 바람에 컨트롤러까지 못갔을 수도 있고 컨트롤러에 접근 권한자체가 없을 수도 있습니다
이건 요청 흐름을 디버깅하면서 따라가보면 그 지점을 알 수 있습니다
사실 흐름을 따라가면서 확인한다는게 첨에는 좀 어려울수 있는데 계속 반복하디보면 오히려 더 명확하게 이해가 되는 장점이 많습니다
시도해 보시기 바랍니다
0
안녕하세요, 인프런 AI 인턴입니다. hoonseung님.
CustomOAuth2AuthenticationFilter를 통해 인증을 처리한 후 HomeController에서 인증 객체를 가져올 때 문제가 발생하는 것에 대해 질문 주셨네요. 이 문제는 인증 정보를 SecurityContextHolder에 저장했지만 다른 스레드에서 해당 정보를 제대로 가져오지 못하는 상황으로 보입니다.
이러한 문제는 스프링 시큐리티가 인증 정보를 기본적으로 ThreadLocal에 저장하기 때문에 발생할 수 있습니다. 그래서 이 정보는 요청이 진행되는 동안 동일한 스레드에서만 유효하게 접근할 수 있죠. 각기 다른 스레드에서 이를 처리하려면 좀 더 세심한 관리가 필요합니다.
해결방법:
1. SecurityContextHolder 모드 변경: 기본적으로 SecurityContextHolder는 ThreadLocal에 인증 정보를 저장하지만, SecurityContextHolder.MODE_INHERITABLETHREADLOCAL
로 변경하면 자식 스레드에서도 이를 공유할 수 있습니다.
```java
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
```
이 설정을 통해 리다이렉션 후에도 자식 스레드에서 인증 정보를 가져올 수 있을 것입니다.
아래 링크들을 통해 관련 내용과 유사한 문제 해결 사례를 찾아보신다면 추가적인 이해에 도움이 될 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아 감사합니다.. 좀 더 고민할걸 그랬네요.. 그리고.. 또 질문이 있는데.. 해당 필터랑 컨트롤러의 /ouathLogin 엔드포인트를 같이 사용할 때 컨트롤러까지 오지 않는 이유가 있을까요? 혹시 AuthenticationSuccessHandler 의 response.sendRedirect("/home"); 이거와 연관이 있는건가요.?