Back-end

[Spring] Spring REST Docs 권한 에러

서채리 2024. 2. 29. 17:08

그냥 내가 기억해 두려고 간단하게 올리는 글..

+ 혹시 나같은 사람 있을까 봐

 

@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {

    private final AuthInterceptor authInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
            .order(1)
            .addPathPatterns("/**")
            .excludePathPatterns("/", "/docs/**", "/*.ico");
    }
}
@Component
@RequiredArgsConstructor
public class AuthInterceptor implements HandlerInterceptor {

    private final AuthService authService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
        Object handler) throws Exception {
        String authorizationHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
        if (authorizationHeader == null) {
            throw UNAUTHORIZED_USER;
        }
        String token = authService.extractToken(authorizationHeader, TOKEN_TYPE);
        authService.validateToken(token);
        return true;
    }

}

내 프로젝트의 Config와 Config에 등장하는 AuthInterceptor 부분을 요약하자면 이렇다.

 

나는 분명 "/docs/**"과 "/*.ico"에 AuthInterceptor를 적용하지 않도록 URL 패턴을 지정해 놓았는데 자꾸 AuthInterceptor로 흘러들어가 authorizationHeader이 null이냐는 조건문에 걸려 UNAUTHORIZED_USER 에러를 반환했다. (개발자 도구로 보면 favicon.ico에서 에러가 났다고 했다. 근데 난 *.ico는 인터셉터 들어가지 말라고 했잖아..)

 

알아봤더니 페이지에서 사용하는 정적 리소스를 찾을 수 없으면 404를 반환하는 대신 에러 페이지를 렌더링 하려 한다. 하지만 스프링 시큐리티에서 사용자 권한이 없다는 이유로 이 요청을 거부하게 돼서 이렇게 에러가 나타났던 것 같다.

그래서 아래와 같이 excludePathPatterns에 "/resources/**", "/error" 를 추가했더니 정상적으로 docs 페이지에 접속할 수 있었다.

 

Spring security redirects to page with status code 999

After successful login spring redirects to /error page with the following content { "timestamp" : 1586002411175, "status" : 999, "error" : "None", "message" : "No message available" } I'm...

stackoverflow.com

@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {

    private final AuthInterceptor authInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
            .order(1)
            .addPathPatterns("/**")
            .excludePathPatterns("/", "/docs/**", "/*.ico", "/resources/**", "/error");
    }
}