본문 바로가기

Java/SpringBoot

리다이렉션 횟수가 너무 많습니다.

default

Path설계를 잘못하면 위와 같은 페이지를 만날 수 있다. Security에서 Path의 권한 설정은 위에서 부터 차례대로 적용된다. 아래의 코드를 보면 anyRequest()는 “USER"권한을 가지고 접근가능하지만 로그인을 하기위한 .antMatchers(”/users/login")는 로그인 하지 않은 ANONYMOUS를 포함한 모든 권한을 다 받아 들인다. 따라서 처리 순서는 다음과 같이 된다.

  1. 사용자는/으로 접근할 것이다. 이때 사용자는 로그인 하지 않았으므로 ANONYMOUS 권한을 가지고 있다. 하지만 .anyRequest() .hasRole("USER")에 의해 /USER권한이 있어야 접근 가능하므로 Security는 요청을 로그인페이지로 리다이렉트 시킬것이다
  2. /users/login페이지의 권한은 .permitAll()이지만 anyRequest()의 범위에 .antMatchers ("/users/login")가 포함될 뿐만 아니라 Path의 권한 설정은 위에서 부터 차례대로 적용된다고 했으므로 이미 USER권한이 적용되어 로그인페이지에 대한 권한은 USER인데 사용자는 ANONYMOUS권한을 가지고 있으므로 권한이 일치하지 않아 인증 실패로 Security는 계속 로그인 페이지로 리다이렉트 시킬것이다.
 @Override
 protected void configure(HttpSecurity http) throws Exception {
	 http.authorizeRequests()
		 .antMatchers("/h2-console/**").permitAll()
		 .anyRequest().hasRole("USER")
		 .antMatchers("/users/login").permitAll()
		 ...
 }

실제로 크롬 디버깅툴로 확인해보면 다음과 같이 계속 login페이지를 계속 요청하는 것을 볼 수 있다

login

이것을 해결하려면 범위가 좁은 /users/login패스의 권한 설정을 다음과 같이 전체 패스 설정 위로 올려준다.

 @Override
 protected void configure(HttpSecurity http) throws Exception {
	 http.authorizeRequests()
		 .antMatchers("/h2-console/**").permitAll()
		 .antMatchers("/users/login").permitAll()
		 .anyRequest().hasRole("USER")
		 ...
 }