본문 바로가기
Springboot/spring security

[스프링시큐리티] 유효하지않은 URL에 대한 로그인요청 방지

by zigzinu 2021. 7. 2.

.anyRequest().authenticated();

Spring Security 설정 중에 아래와 같은 설정을 해봤을 것이다.

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .mvcMatchers("/sample/home", "/sample/signup").permitAll()
                .mvcMatchers("/sample/admin").hasRole("ADMIN")
                .mvcMatchers("/sample/user").hasRole("USER")
                .anyRequest().authenticated();
    }

이때 만약 익명의 사용자가 유효하지않은 url에 대한 요청을 보내면 어떻게 될까?


/invalid-url 요청 → /login페이지 리다이렉트 → 로그인 성공 → /invalid-url요청 (Whitelabel Error Page)

우리가 흔히 예상하기로는 유효하지않은 페이지에 대해서는 바로 해당 도메인에서 제공하는 Error 페이지로 이동하는 것이다. 로그인 요청을 하지는 않는다. 어떤 설정이 잘 못된 것일까?


설정을 살펴보면

  1. permitAll(): 모두에게 공개된 리소스를 명시하고
  2. hasRole(): ADMINUSER 권한이 필요한 페이지를 명시하고
  3. anyRequest.authenticated(): 나머지 페이지는 모두 권한이 필요하도록 설정되어있다

.anyRequest().permitAll();

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .mvcMatchers("/sample/home", "/sample/signup").permitAll()
                .mvcMatchers("/sample/admin").hasRole("ADMIN")
                .mvcMatchers("/sample/user").hasRole("USER")
                .anyRequest().permitAll();
    }

anyRequest.authenticated() 설정만 permitAll() 로 수정하였다.


/invalid-url 요청 → /invalid-url요청 (Whitelabel Error Page)

이렇게 하면 유효하지않은 어떤 페이지도 권한을 묻지 않는다. 그리고 처리할 수 없는 리소스에 대한 요청이기 때문에 Whitelabel Error Page가 표시된다.

주의

명시하지 않은 리소스들을 모두 공개하기 때문에 보호하고자 하는 리소스들은 철저하게 권한을 명시해야 보안 이슈가 발생하지 않는다. 설정이 순차적으로 적용되기 때문에 .anyRequest().permitAll() 설정보다 앞선 순서로 설정해야 한다.


.anyRequest().anonymous();

anyRequest().anonymous() 설정으로하면 어떻게 될까? Stackoverflow 에서는 이 설정을 우선적으로 소개한다.

.anonymous() 같은 경우엔 익명의 유저에게만 허용하는 설정이다. 따라서 로그인한 유저가 /invalid-url 에 접근하게 되면, http.exceptionHandling().accessDeniedHandler()에서 설정한 대로 권한 거부에 대한 예외처리가 발생한다.

이 또한 우리가 원하는 결과는 아니다.


출처: Stackoverflow

댓글