문제상황
[MyAsset] [nio-8080-exec-5] o.s.security.web.FilterChainProxy : Secured GET /onboarding
[MyAsset] [nio-8080-exec-5] o.s.security.web.FilterChainProxy : Securing GET /WEB-INF/views/asset/onboarding.jsp
- OAuth2 로그인 성공 후 /onboarding으로 리다이렉트됨
- /onboarding 컨트롤러는 정상 실행
- 하지만 JSP가 렌더링되기 직전에 /login으로 다시 리다이렉트
- 결과적으로 온보딩 페이지 진입 불가
※ 처음에 의심했던 사항들
- SecurityFilterChain의 authorizeHttpRequests에서 onboarding을 permitAll안했나?
- JWT 인증필터에서 온보딩을 제외 안시켰나..?
- .env.yml 에서 JWT 리다이렉트 온보딩 값을 잘못넣었나?
▶ 모두 문제 없었음.
실제 원인
- Spring Security가 JSP 리소스 접근 자체를 막고 있음
□ JSP의 랜더링 방식
브라우저 요청
GET /onboarding
↓
@Controller 실행 (return "asset/onboarding")
↓
InternalResourceViewResolver
- viewName을 prefix/suffix 설정(yml) 기준으로 해석
↓
request.getRequestDispatcher(
"/WEB-INF/views/asset/onboarding.jsp"
).forward(request, response)
↓
DispatcherType.FORWARD 요청 발생
↓
Spring Security Filter Chain 재진입
→ 여기서 중요한 건, forward 요청도 Spring Security 필터 체인을 탄다는 것!!
- GET /onboarding ← 이건 당연히 필터링에 넣어놨지만
- GET /WEB-INF/views/asset/onboarding.jsp ← 이게 새 요청으로 취급되는건 몰랐다.
그래서 기존에 아래 처럼만 permitAll 을 설정하였으니,
.requestMatchers(
"/onboarding",
"/onboarding/**"
).permitAll()
서버 내부에서 다시 요청한 아래 포워드가 허용 안 된 요청으로 된것
/WEB-INF/views/asset/onboarding.jsp
그래서 Spring Security의 판단으로
“/WEB-INF/...로 시작하네? permitAll에 없으니까 인증 필요하니까 로그인 페이지로 리다이렉트” 가 된 것
해결 방법
JSP를 사용하는 Spring Security 환경에서는 DispatcherType.FORWARD를 명시적으로 허용해야 한다
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
... (생략) ...
http.authorizeHttpRequests(auth -> auth
.dispatcherTypeMatchers(
DispatcherType.FORWARD,
DispatcherType.ERROR
).permitAll()
... (생략) ...
}
Spring Security filter chain does not work for forwarded request
My application needs to support only one URL. Like http://.../service/api. The action to be done depends on a "ACTION" request param To handle this I have created the below controller @
stackoverflow.com
'프로젝트 기록 > Troubleshooting Log' 카테고리의 다른 글
| Spring Security 단일 체인에서 OAuth2 + JWT를 함께 사용했을 때 발생한 문제와 해결 (0) | 2025.12.29 |
|---|