본문 바로가기

Spring Security 환경에서 JSP 렌더링이 login으로 튕기는 이유

@silver-w2025. 12. 26. 22:15

문제상황

[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()

    ... (생략) ...
}

 


 

https://stackoverflow.com/questions/67766736/spring-security-filter-chain-does-not-work-for-forwarded-request

 

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

silver-w
@silver-w :: silver-w 님의 블로그

silver-w 님의 블로그 입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차