전체 방문자
오늘
어제
21종
종이의 코딩 공부방
21종
  • 분류 전체보기 (174)
    • JAVA (64)
    • Springboot (46)
      • 블로그만들기 (45)
    • Database (60)
      • Oracle (60)
    • 프로젝트 3 (CELOVER) (0)
    • 개발서버 구축 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

최근 댓글

hELLO · Designed By 정상우.
21종

종이의 코딩 공부방

카테고리 없음

[SpringBoot] SpringSecurity 무한 redirect 발생

2024. 1. 23. 05:15

 

홈페이지 메인페이지에 접속했더니 로그인 페이지가 무한 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();
}

 

 

    21종
    21종
    코딩 공부한 것 정리하려고 만든 블로그

    티스토리툴바