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

김관욱님의 프로필 이미지
김관욱

작성한 질문수

스프링 시큐리티

7) Ajax 로그인 구현 & CSRF 설정

Ajax로그인 - loginProcessingUrl("/api/login") 관련 질문있습니다

해결된 질문

작성

·

741

·

수정됨

0

안녕하세요 강사님. 강의를 따라 실습하는데 강사님과 다르게 동작합니다. 이유를 못찾아서 도움이 필요합니다 ㅠㅠ

7) Ajax로그인 구현 & CSRF설정 15:00 부분

강의에서는 브라우저에서 window.location = '/api/login?error=true&exception=' + xhr.responseJSON.message;
호출이후 서버에서 로그인 컨트롤러가 호출되는데,

저는 window.location 이후 AjaxLoginAuthenticationEntryPoint 가 다시 호출됩니다.

그래서 AjaxSecurityConfig 클래스에 .antMatchers("/api/login/**").permitAll() 를 추가해서 테스트 해보았더니 컨트롤러가 호출 되었습니다.

왜 강사님과 다르게 저는 window.location 이후 AjaxLoginAuthenticationEntryPoint가 왜 다시 호출되는지 알 수 있을까요?

https://github.com/GwanUk/basicsecurity.git

스크린샷 2023-05-24 오전 12.11.44.png스크린샷 2023-05-23 오후 11.57.54.png스크린샷 2023-05-24 오전 12.09.02.png

답변 2

0

김관욱님의 프로필 이미지
김관욱
질문자

선생님 계속 질문해서 죄송합니다 ㅠㅜ
그런데 이해가 되지 않는게 하나 있어서 그러는데요...
login.html 에서 url: "/api/login" 주소로 로그인 요청을 디버깅 해보니까 서버에서 필터가
UsernamePasswordAuthenticationFilter -> CustomAuthenticationProvider -> AjaxLoginProcessingFilter -> AjaxAuthenticationProvider 순으로 진행되는데 왜 이렇게 되는지 알 수 있을까요? ㅜㅜ 저는 이렇게 되는 이유를 전혀 모르겠어요 ㅠㅠ

김관욱님의 프로필 이미지
김관욱
질문자

login.html에서 button type="submit" 에서 type="button" 으로 수정하니 해결되었습니다 ㅎㅎ

0

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

antMatchers("/api/login/**", "/api/login**").permitAll() 으로 변경 해 보시겠어요?

김관욱님의 프로필 이미지
김관욱
질문자

영상에서 antMatchers("/api/login/**", "/api/login**").permitAll() 부분이 빠진건가요?

antMatchers("/api/login/**", "/api/login**").permitAll() 추가하고 나서 문제가 있어요.

  1. login.html의 ${_csrf.token} 이 null 참조로 오류나서 ${_csrf?.token} 로 수정햇는데요, window.location은 get방식이여서 csrf토큰이 없는건가요?

  2. function formLogin(e) 함수를 호출해도 로그인이 되지않고 서버에서 계속 login.html을 응답하는데 왜그런지 모르겠어요 ㅜㅜ
    $.ajax까진 디버깅 되는데 success:, error: 은 디버깅도 안타져요 ㅠㅠ

image

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

소스 공유 가능하실까요?
제가 테스트 해 봐야 알 것 같습니다

김관욱님의 프로필 이미지
김관욱
질문자

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

소스를 다운받아 실행해 보니 정확한 원인을 알 수 없지만 최초 로그인 화면으로 이동하게 되면 서버에서 발급한 csrftoken 값이 클라이언트로 전달되지 않고 있습니다. 이 오류부터 잡아내야 할 것 같습니다.
정상적이라면 로그인 화면으로 접속하게 되면 csrftoken 값이 null 일 수 없습니다.

그리고 로그인을 실행하게 되면 폼 로그인과 Ajax 로그인이 동시에 실행되는 듯한 현상이 발견되고 있는 것 같습니다.
이 부분은 좀 더 면밀히 살펴봐야 할 것 같습니다.

제가 강의 소스인 04-20 브랜치를 받아서 실행해 보면 login.html 의 소스가 관욱님의 소스와 동일한데도 서버에서 발급한 csrftoken 값이 정상적으로 전달되고 있고 특별한 문제가 발생하지 않고 있어서 어디서 문제의 원인이 있는지 좀 더 봐야 할 것 같습니다

시큐리티 혹은 jdk 버전문제일 수 있지만 이 가능성은 낮아 보입니다.

다만 버전을 동일하게 맞추어서 실행했을 때 문제가 발생하지 않는다면 이 역시도 원인이 될 수 있습니다.

한가지 권해 드리는 방법은 저의 04-20 브랜치를 받아 실행해 보고 오류가 발생하지 않는다면 관욱님의 소스와 어떤 차이가 있는지를 비교해 가며 원인을 찾아내는 것입니다.

현재로서는 눈에 금방 띌 만한 원인이라기 보다는 소스 레벨에서 어떤 부분에 원인이 있을 것 같습니다.

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

원인을 찾았습니다.

AjaxSecurityConfig 설정클래스에서

http.csrf().disable(); 로 되어 있었습니다.

이 부분을 주석하거나 삭제하시면 됩니다.

김관욱님의 프로필 이미지
김관욱
질문자

계속 원인을 찾으셨나보네요 ㅠㅠ
강사님 말씀대로 강의 소스인 04-20 브랜치를 다운 받은 후 소스 작성해서 강좌 따라 테스트를 완료하고 테스트 완료했다고 말씀드리러 왔는데 문제 해결을 해주셨네요 ㅜㅜ
감사합니다!!
http.csrf().disable(); 삭제하고 다시 테스트 해보겠습니다
원인 찾느라 정말 고생하셨습니다 ㅠㅠㅠㅠ

김관욱님의 프로필 이미지
김관욱

작성한 질문수

질문하기