defaultSuccessUrl 작동 순서
2352
작성한 질문수 19
안녕하세요 수업을 듣고, defaultSuccessUrl 작동 순서가 궁금하여 질문 드립니다.
이번 강의에서 로그인 성공시, 처리하는 API가 2개가 있었습니다.
하나는 defaultSuccessUrl이고 나머지는 successHandler입니다. 예제를 통해 successHandler가 잘 동작하는것은 확인 했습니다. 그럼 defaultSuccessUrl는 언제 동작하는지 궁금하여 테스트를 해봤습니다.
제 가설은 우선순위가 successHandler 가 높고 successHandler가 없을때, 말 그대로 디폴트값인 defaultSuccessUrl가 동작할거라고 가설을 세웠습니다.
테스트 방법은 successHandler를 주석처리하고 defaultSuccessUrl("/aa")라고 설정해두고 해당 경로는 없는 경로로 오류가 나길 기대하고 있었습니다.
그런데 로그인 성공 후, /aa로 가지 않고 루트 경로인 / 여기로 리다이렉트 되었습니다.
그리고 테스트 중에 발견한 것은, 최초 로그인 성공시 / 루트 경로로 리다이렉트가 되고, /logout에서 로그아웃을 하고 다시 로그인 성공을 하면 그제서야 /aa로 리다이렉트 되는것을 확인했습니다.
정확하게 defaultSuccessUrl 이게 어떻게 동작하는것인지 알 수 있을까요?
감사합니다.
답변 2
15
네
defaultSuccessUrl 은 로그인 성공 후에 이동할 경로를 정해주는 것은 맞지만 우선순위는 가장 마지막입니다.
강의 중에 SavedRequest 와 RequestCache 와 관련된 내용이 나오는데 스프링 시큐리티는 기본적으로
로그인을 성공하게 되면 제일 먼저 로그인을 성공하기 직전에 거쳐왔던 Url 정보를 기억하고 있다가 성공하게 되면 그 Url로 리다이렉트 합니다.
위의 경우에는 로그인을 성공하기 전의 Url 이 루트 경로였기 때문에 그렇습니다.
즉 defaultSuccessUrl 보다 더 우선적으로 SavedRequest 와 RequestCache 를 사용해서 나온 경로를 먼저 참조하고 만약 값이 없을 경우 그 다음에 request.getParameter("경로") 의 값이 있는지 확인하고 이 외에도 우선순위에 따라 targetUrl 을 계속 구하다가 아무런 값도 못 얻었을 경우 defaultSuccessUrl 에서 설정한 경로를 참조해서 리다이렉트 합니다.
그리고 로그아웃 한다음 로그인을 했을 경우 /aa 로 간 이유는 로그아웃을 하게 되면 세션 만료로 인해 SavedRequest 와 RequestCache 에서 아무런 Url 정보를 얻을 수 없게 됩니다.
그래서 defaultSuccessUrl 에서 설정한 /aa 로 리다이렉트 한 것이라 보면 됩니다.
참고로 RequestCache 의 구현체인 HttpSessionRequestCache 은 세션을 사용해서 SavedRequest 를 저장하고 SavedRequest 에는 이전의 Url 경로가 저장되어 있습니다.
근데 만약
http
.formLogin()
.defaultSuccessUrl("/aa",true)
처럼 두번째 인자로 항상 기본 값을 사용할 것인지를 설정할 수 있는데 기본값은 false 로 되어 있습니다.
이 값을 true 로 주게 되면 로그인을 성공한 다음 무조건 /aa 로 가게 됩니다.
보통 기본 값이라는 것은 특별한 설정을 하지 않을 경우 오류가 나거나 null 값을 가지지 않도록 하기 위한 목적으로 사용하기 때문에 특별한 이유가 없으면 SuccessHandler 를 사용해서 직접 리다이렉트 하는 방식으로 하면 좋을 것 같습니다.
시큐리티 공부 버전 질문
0
176
1
[해결 방법] MethodSecurityConfig.customMethodSecurityMetadataSource() 호출하지 않는 이슈
0
187
1
AbstractSecurityInterceptor.class.beforeInvocation()를 2번 실행하는 경우
0
178
1
강의 코드가 왜이렇게 뒤죽박죽인가요...
0
251
1
메인 페이지로 접속해도 login url로 리다이렉트가 되지 않습니다..
0
237
1
파라미터값이 넘어가지 않습니다 ....
0
374
1
security filterChain 설정 질문이 있습니다.
0
332
1
소스 부분 질문 드립니다.
0
210
2
섹션4 7번 강의 문제가 있는거 같네요.
0
345
2
파일이 수시로 이름이 바껴있네요 ㄷㄷ
0
306
1
HttpSessionSecurityContextRepository를 사용안하는 문제
0
557
2
error , exception 이 잘 안됩니다.
0
284
2
thymeleaf tag 질문합니다.
0
198
2
버전업하면서 deprecated된 것들이 너무많아요
0
478
1
spring security 패치 관련
0
437
1
모바일을 사용할때 토큰말고 세션
0
848
2
DB 연동한 인가 부분에 대한 질문입니다!
0
265
1
Ajax방식도 똑같이 Session방식을 사용하는건가요?
0
308
1
Config 파일 생성 시 질문이 있습니다.
0
228
1
강사님 몇일동안 구글 검색만 100개 했는데도 이유를 모르겠습니다..
1
432
2
403 에러 뜹니다.
0
813
2
login_proc의 존재에 대한 간략한 설명입니다
0
277
1
top.html에 로그인 링크를 만들어서 로그인을 해봤습니다
0
287
2
안녕하세요. DB에 저장될 때 이해 안 가는 값이 있어서 질문드립니다!
0
191
1





