CustomOAuth2AuthenticationFilter 구현 중 질문
139
34 asked
CustomOAuth2AuthenticationFilter으로 인증까지 처리 후
home으로 리다이렉션을 하는거 까지 구현을 하였는데요
HomeController에서 인증객체를 가져오려고 하면 null을 가져오는데요 CustomOAuth2AuthenticationFilter에서 securitycontext에 저장하였다가 리다이렉션할 때 새로운 스레드에서 이것을 처리해서 그 스레드에는 securityContextHolder에는
인증객체가 없는 거 같은거 같은데 해결방법이 있을까요
nio-8081-exec-2 스레드는 customFilter에서 holder에 제대로 저장하는데 리다이렉션 후 home에서는 nio-8081-exec-3이 받습니다.
Answer 2
1
CustomOAuth2AuthenticationFilter 에서 인증 객체를 세션에 저장해야 합니다
아마 시큐리티 최신버전이라면 이 부분이 바뀐 부분이라 그렇습니다
이 부분은 내용이 길고 좀 복잡해서 최신버전의 공식문서나 혹은 저의 시큐리티 6 강의를 참고하셔야 될것 같습니다
아마 구 버전을 쓰신다면 문제가 안될겁니다
세션에 자동적으로 저장해 주기 때문입니다
0
아 감사합니다.. 좀 더 고민할걸 그랬네요.. 그리고.. 또 질문이 있는데.. 해당 필터랑 컨트롤러의 /ouathLogin 엔드포인트를 같이 사용할 때 컨트롤러까지 오지 않는 이유가 있을까요? 혹시 AuthenticationSuccessHandler 의 response.sendRedirect("/home"); 이거와 연관이 있는건가요.?
1
그건 여러가지 이유가 있을 수 있습니다
필터에서 먼저 요청을 잡아서 처리하는 바람에 컨트롤러까지 못갔을 수도 있고 컨트롤러에 접근 권한자체가 없을 수도 있습니다
이건 요청 흐름을 디버깅하면서 따라가보면 그 지점을 알 수 있습니다
사실 흐름을 따라가면서 확인한다는게 첨에는 좀 어려울수 있는데 계속 반복하디보면 오히려 더 명확하게 이해가 되는 장점이 많습니다
시도해 보시기 바랍니다
0
안녕하세요, 인프런 AI 인턴입니다. hoonseung님.
CustomOAuth2AuthenticationFilter를 통해 인증을 처리한 후 HomeController에서 인증 객체를 가져올 때 문제가 발생하는 것에 대해 질문 주셨네요. 이 문제는 인증 정보를 SecurityContextHolder에 저장했지만 다른 스레드에서 해당 정보를 제대로 가져오지 못하는 상황으로 보입니다.
이러한 문제는 스프링 시큐리티가 인증 정보를 기본적으로 ThreadLocal에 저장하기 때문에 발생할 수 있습니다. 그래서 이 정보는 요청이 진행되는 동안 동일한 스레드에서만 유효하게 접근할 수 있죠. 각기 다른 스레드에서 이를 처리하려면 좀 더 세심한 관리가 필요합니다.
해결방법:
1. SecurityContextHolder 모드 변경: 기본적으로 SecurityContextHolder는 ThreadLocal에 인증 정보를 저장하지만, SecurityContextHolder.MODE_INHERITABLETHREADLOCAL로 변경하면 자식 스레드에서도 이를 공유할 수 있습니다.
```java
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
```
이 설정을 통해 리다이렉션 후에도 자식 스레드에서 인증 정보를 가져올 수 있을 것입니다.
- Session 기반 인증 정보 저장: SecurityContextPersistenceFilter를 통해서 보통 SecurityContext가 세션에 저장되는데, 요청이 완전히 끝나기 전에 이를 세션에 저장해서 다른 스레드에서도 동일한 인증 정보를 참조할 수 있게 만드세요. 확인해보니 SecurityContextPersistenceFilter가 설정되어 있는지, 그리고 세션 관리를 웹 세션으로 설정했는지 점검해보세요.
아래 링크들을 통해 관련 내용과 유사한 문제 해결 사례를 찾아보신다면 추가적인 이해에 도움이 될 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
authorization-server 라이브러리 질문이 있습니다.
0
71
1
loadUser 중 Missing attribute 'preferred_username' in attributes 에러 발생
0
72
2
JWT 조회 에 대한 질문
0
67
1
password grant 방식 에러 응답
0
83
3
FormLoginConfigure에서 생성하는 필터
0
72
2
현업에서 springboot를 3.5.5 를 사용해서 공부중인데...
0
280
2
Jdbc 관련 강의 및 깃헙 문의
0
73
1
OAuth2AuthorizedClient 이해 및 활용 강의 내용 질문
0
207
1
UserInfo 엔드포인트 요청 실습
0
71
1
RFC 문서에서의 AccessToken 발급 방식 궁금한점
0
147
1
강의자료.zip 를 다운로드 받았는데 압축이 풀리지 않습니다. 확인 부탁드려요
0
133
2
OIDC SSO 관련 질문 입니다.
0
128
1
AuthenticationEntryPoint 강의 누락 문의
0
118
1
cors설정방법
0
113
1
jwt decoder 토큰 검증 시 질문
0
217
1
클라이언트에서 userinfo 엔드포인트 호출 시 질문
0
182
2
JOSE 구성요소의 api에 관한 질문
0
137
2
스프링 부트 3버전으로 따라가시는 분들 참고하세요
1
522
1
AuthenticationManager 생성시점
0
111
1
FormLogin과 Oauth2Client 둘 중 사용하는 시점
0
120
1
postman userinfo 엔드포인트 질문
0
122
2
강의 수강신청하고 듣기 전입니다 질문있습니다.
0
108
1
인증 코드를 통해 발급 받은 토큰의 관리
0
195
1
SPA의 로그인 페이지 사용하면서 자체 인가 서버 구성하는 법
0
243
1

