홈페이지 메인페이지에 접속했더니 로그인 페이지가 무한 redirect 돼서 오류가 발생했다.
기존코드
- SecurityConfig
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf((csrfConfig) ->
csrfConfig.disable()
) // csrf 토큰 비활성화 (테스트시 걸어두는게 좋음)
.authorizeHttpRequests((authorize) ->
authorize
.requestMatchers("/", "/auth/**", "/js/**", "/css/**", "/img/**").permitAll()
.anyRequest()
.authenticated()
)
.formLogin((formLogin) ->
formLogin
.loginPage("/auth/login-form")
.usernameParameter("userId")
.passwordParameter("password")
.loginProcessingUrl("/auth/login")
.defaultSuccessUrl("/", true) // 성공시 이 페이지로 이동
);
return http.build();
}
메인페이지 url은 http://localhost:8888/ 이기 때문에 로그인하지 않은 사이트 방문자도 메인페이지가 나와야 한다.
하지만 페이지가 자꾸 로그인 페이지로 넘어간다.
원인
http://localhost:8888/ 로 접속시 index페이지를 띄워주도록 컨트롤러를 생성했었다.
@Controller
public class MainController {
@GetMapping({"", "/"})
public String index() {
System.out.println("인덱스 페이지 들어온다.");
return "index";
}
}
이 컨트롤러를 통해서 메인페이지를 열었을때 index.jsp 화면을 띄워준다.
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:forward page="main/main-page.jsp"/>
</body>
</html>
index.jsp 에 도달하게 되면 jsp포워드 방식으로 메인페이지를 띄워줬다.
이러한 방식은 구버전에서는 잘 동작하지만 스프링부트 3.0 이상 스프링시큐리티 6.0 이상에서는
forward 방식에서도 기본적으로 인증이 걸리도록 변경돼서 제대로 메인페이지에 도달하지 못하게 된다.
따라서 포워딩을 허용해준다는 설정을 추가해주면 된다.
변경된 코드
- SecurityConfig
request.dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll() 이게 핵심이다.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf((csrfConfig) ->
csrfConfig.disable()
) // csrf 토큰 비활성화 (테스트시 걸어두는게 좋음)
.authorizeHttpRequests((request) ->
request.dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll()
.requestMatchers("/", "/auth/**", "/js/**", "/css/**", "/img/**", "/fontawesome-free-6.5.1-web/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(login -> login
.loginPage("/auth/login-form")
.loginProcessingUrl("/auth/login")
.usernameParameter("userId")
.passwordParameter("pw")
.defaultSuccessUrl("/", true)
.permitAll()
);
return http.build();
}