이클립스에서 실행할 당시 문제없이 작동이 되었으나 인테리제이로 넘어오면서 문제가 발생하기 시작헀다 해당 문제를 기록할겸 작성한다.
무한로딩
javax를 jakarta로 바꾸고 기타설정을 완료하였고 프로젝트를 실행했으나 Loginpage가 무한redirect로 에러가 나타났다.
해당 문제를 확인하기 위해 좀더 자세한 로그를 확인하기로 했다.
로그 내용을 좀더 자세히 확인하기 위해 설정파일을 수정하였다.
application.propertoes
logging.level.org.springframework.security=DEBUG
logging.level.org.springframework.web=DEBUG
logging.level.org.springframework.boot=DEBUG
확인해보니 다음과 같은 결과가 나타났다.
o.s.s.w.s.HttpSessionRequestCache : Saved request http://localhost:8090/WEB-INF/views/member/loginPage.jsp?continue to session
o.s.s.web.DefaultRedirectStrategy : Redirecting to http://localhost:8090/loginPage
o.s.s.w.header.writers.HstsHeaderWriter : Not injecting HSTS header since it did not match request to [Is Secure]
A. 로그인 안된 사용자이니 loginpage로 보내야지
B. loginpage로 이동시켰는데 권한이 없네? (무한반복..)
일단 모든 페이지에 권한이 없어도 접근 가능하도록 시큐리티 설정을 변경한다.
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("loginPage/","loginPage","/loginPage","/loginPage/","/css/**", "/js/**", "/images/**", "/public/**").permitAll() // 인증 없이 접근 허용
// .anyRequest().authenticated() // 나머지 요청은 모두 인증 필요
.anyRequest().permitAll() // 모든 요청에 대해 접근 허용
우선 모든 페이지에 접근을 허용하도록 만들었고 에러를 하나씩 찾아가기로 하였다.
확인해보니 다음과 같은 에러가 나타났다
[nio-8090-exec-4] o.s.w.s.r.ResourceHttpRequestHandler:
"Path with "WEB-INF" or "META-INF": [WEB-INF/views/member/loginPage.jsp]"
해당 에러는 스프링이 WEB-INF 또는 META-INF에 직접적으로 작업하려고 했기에 나타나는 에러이다.
이전에 xml에선 에러 페이지를 따로 설정해놨으나 스프링 부트에선 자체 오류 처리 메커니즘(ErrorController)으로 에러페이지에 대한 설정을 할수 있다고 한다.
뷰 리졸버 설정하기
기존 maven + Spring Legacy를 사용했을땐 viewResovler가 jsp를 처리했으나 현재 gradle + Spring Boot에선 내장된 tomcat에 jsp를 처리하는 서블릿이 없어서 나타나는 에러였다.
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:10.1.25' // Apache Tomcat이 JSP를 컴파일, 실행
implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api:3.0.0' //JSTL API
implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl:3.0.0' // JSTL의 구현체,jakarta.servlet.jsp.jstl-api 종속성이 제공하는 API의 실제 구현
다음과 같은 의존성을 추가하여 내장된 톰캣이 jsp를 처리 가능하도록 만들었다.
또한 내가 작성한 jsp파일을 탐색할수 있도록 application.properties에 추가로 코드를 입력하였다.
spring.mvc.view.prefix=/webapp/WEB-INF/views/
spring.mvc.view.suffix=.jsp
depth는 다음과 같다
참고 링크 : https://yeonyeon.tistory.com/110
이제 404 에러는 나타나지 않으나 css파일을 아직 찾지 못하고 있었다.
해당 리소스에 접근이 가능하도록 다음과 같은 코드를 추가하였다.
webConfig
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/resources/");
}
}
addResourceHandler를 사용하여 css를 가져오도록 하였다.
css 또한 정상적으로 적용시켰다.
그렇다면 이제 securityconfig에 permitall을 제거하고 다시 진행해보자
안됬다...
로그인페이지 이동
DEBUG o.s.web.servlet.view.JstlView : View name 'member/loginPage', model {}
DEBUG o.s.web.servlet.view.JstlView : Forwarding to [/WEB-INF/views/member/loginPage.jsp]
DEBUG o.s.security.web.FilterChainProxy : Securing GET /WEB-INF/views/member/loginPage.jsp
DEBUG o.s.s.w.s.HttpSessionRequestCache : Saved request http://localhost:8090/WEB-INF/views/member/loginPage.jsp?continue to session
DEBUG o.s.s.web.DefaultRedirectStrategy : Redirecting to http://localhost:8090/loginPage
DEBUG o.s.web.servlet.DispatcherServlet : Completed 302 FOUND
DEBUG o.s.security.web.FilterChainProxy : Securing GET /loginPage
DEBUG o.s.security.web.FilterChainProxy : Secured GET /loginPage
DEBUG o.s.web.servlet.DispatcherServlet : GET "/loginPage", parameters={}
DEBUG s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.study.member.MemberController#moveloginPage()
DEBUG o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to anonymous SecurityContext
로그인페이지 이동
다시 확인해보니 여전히 무한루프에 걸렸다...
그렇다면 해당 페이지 자체에 접근이 가능하도록 하면 어떨까?
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/WEB-INF/views/**","loginPage/").permitAll() // 인증 없이 접근 허용
.anyRequest().authenticated() // 나머지 요청은 모두 인증 필요
// .anyRequest().permitAll() // 모든 요청에 대해 접근 허용
)
}
/WEB-INF에 접근 자체를 허용해버릴경우 문제없이 작동이된다!...