inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

폼 인증 - formLogin()

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

273

펭귄

작성한 질문수 3

0

1.png

 

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

 

2.png

 

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

 

그런데

 

3.png

 

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

 

4.png

 

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

 

 

 

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

 

spring spring-boot spring-security security web-security

답변 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("/")));

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

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

0

펭귄

좋은 답변 감사합니다.

로그아웃-logout()-2 강에서 겟방식 로그아웃 호출 후 화면이동 질문입니다.

0

36

2

단원별 소스코드

0

65

2

CustomAuthenticationProvider 추가 관련 문의

0

78

2

AOP 의존성 명칭 변경

0

77

1

빈 1개 등록 시 다른 해결 방법

0

70

1

@Bean으로 AuthenticationProvider를 등록 시 http.authenticationProvider 함수를 이용해서 추가해줘야되나요?

0

87

2

OIDC의 id token에 담긴 데이터에 대해

0

78

1

loginPage("/loginPage") 질문드립니다.

0

69

1

@EnableWebSecurity

0

148

1

트랜잭션과 롤백

0

100

1

68. 인증 이벤트 - AuthenticationEventPublisher 활용 강좌 음성 문제

0

91

2

AuthenticationManager 사용 방법

0

153

2

HttpSecurity.authorizeHttpRequests() - 2 강의 부분에 대한 질문

0

108

2

spring security 6.3에서는 HttpSecurity가 만들어지기 전 WebSecurity가 먼저 만들어지는게 맞나요??

0

192

1

init(B Builder), configure(B builder) 에 대하여 질문 드립니다.

0

109

2

메타 주석 질문

0

69

1

동시세션제어 기능에서 로그아웃하기

0

152

3

로그인 후, redirect 에서 error

0

141

3

Session 생성 타이밍에 대한 질문

0

86

2

강의 참고 내용을 개발 로그로 작성해도 될지 문의드립니다.

0

135

2

customAuthentication 관련

0

132

2

authenticationManagerBuilder 주입받은거 vs 만든 거

0

114

1

UserDetailsService()에서 UserDetail이 아닌 타입을 반환할 수 있나요?

0

101

1

9:28 패턴 3의 경우 마지막으로 설정한 것만 적용되는 것 같습니다.

0

162

2