인프런 커뮤니티 질문&답변

펭귄님의 프로필 이미지

작성한 질문수

스프링 시큐리티 완전 정복 [6.x 개정판]

폼 인증 - formLogin()

폼 로그인 방식 failureUrl 지정 시 인가 처리 API 가 작동하지 않습니다.

작성

·

147

·

수정됨

0

1.png

 

위와 같이 failureUrl 지정하지 않았을 경우에는

 

2.png

 

이렇게 애플리케이션 홈 화면이 잘 나타납니다.

 

그런데

 

3.png

 

이렇게 failureUrl 을 별도로 지정해주게 되면

 

4.png

 

홈 화면에서도 인증을 요구하고 인가 처리에 대한 설정이 무시되어 버립니다.

 

 

 

왜 이렇게 되는 것인가요? 강의에서 이 현상에 대해서는 별 말씀 없으셔서 혼란스럽네요.

 

답변 1

0

정수원님의 프로필 이미지
정수원
지식공유자

네 이 부분을 확인해 보니 약간 특이한 점이 있긴 합니다.

DefaultLoginPageGeneratingFilter.java
private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
       throws IOException, ServletException {
    boolean loginError = isErrorPage(request);
    boolean logoutSuccess = isLogoutSuccess(request);
    if (isLoginUrlRequest(request) || loginError || logoutSuccess) {
       String loginPageHtml = generateLoginPageHtml(request, loginError, logoutSuccess);
       response.setContentType("text/html;charset=UTF-8");
       response.setContentLength(loginPageHtml.getBytes(StandardCharsets.UTF_8).length);
       response.getWriter().write(loginPageHtml);
       return;
    }
    chain.doFilter(request, response);
}

위 코드를 보시면

if (isLoginUrlRequest(request) || loginError || logoutSuccess) {

즉 분기문이 true 이면 무조건 로그인 페이지를 생성해서 클라이언트로 반환해 버리고 있습니다

위 조건에서 loginError 가 true 가 되는 상황은

formLogin(form -> form.failureUrl("/"));

로 설정을 했을 경우 failureUrl 과 현재 클라이언트의 요청 url 이 동일한 경우 (여기서는 "/") 강제로 로그인 페이지를 생성해서 클라이언트로 반환해 버리고 있네요..

그래서 아래와 같이 설정했다고 하더라도

.requestMatchers("/").permitAll()

DefaultLoginPageGeneratingFilter 가 먼저 로그인 페이지를 만들어서 처리해 버리니 "/" 로 가지 못하는 현상이 발생하고 있는 것 같습니다.

이 부분은 스프링 시큐리티가 강제하고 있는 것 같습니다.

그래서 만약 failureUrl 로 이동하기 위해서는

.formLogin(form -> form.failureHandler((request, response, exception) -> response.sendRedirect("/")));

와 같이 핸들러를 사용하면 됩니다.

제 기억에는 핸들러를 사용하지 않고도 되었던 것 같은데 이 부분은 저도 좀 더 확인이 필요할 것 같네요

펭귄님의 프로필 이미지
펭귄
질문자

좋은 답변 감사합니다.

펭귄님의 프로필 이미지

작성한 질문수

질문하기