alan
1k
2018-01-14 20:08:44
0
480

spring-security csrf filter 처리하다 생긴 문제


spring-security로 로그인을 구현하던 중 몇가지 문제가 발생했습니다.

ajax post로 전송하면 403에러가 발생합니다.

CSRF때문인데요.

X-CSRF-TOKEN 헤더를 보내주면 해결이 됩니다.

그런데 문제가 제가 jquery ajax가 아니라 ecmascript fetch를 이용해서 발생합니다.

fetch는 header 이름을 모두 소문자로 강제 변환을 시킵니다.

X-CSRF-TOKEN은 대문자로 보내야만 spring에서 인식을 합니다.

그래서 security filter전에 다른 필터를 두고 거기서 소문자를 대문자로 바꿔주려고 했습니다.

그런데 필터로는 x-csrf-token을 소문자로 읽으나 대문자로 읽으나 다 가져올 수 있습니다.

어째든 헤더 이름을 대문자로 넣어 주려고

serveltRequest를 HttpServletRequestWrapper로 감싸서 대문자 X-CSRF-TOKEN을 헤더이름으로

넣어줬습니다.

로그인 테스트를 해보면

HttpServletRequestWrapper.getHeader 에 로그 출력해 놓은 곳에서

X-CSRF-TOKEN을 대문자로 요청하고 token도 잘 찾아갑니다.

그런데도 403 forbidden이 뜨네요.

failureHandler를 401로 해났고 $.ajax로 요청하면 401이 제대로 뜹니다.

CSRF filter를 좀 뜯어 보고 싶은데 어디있는 지도 모르겠고

커스터마이징은 matcher 바꾸는 것만 검색되네요.

더 찾아보려니 지쳤습니다 ㅜㅜ

헤더 대문자로 추가해줘도 이런거 보면 스프링이 처음 헤더 내용을 어딘가로 부터 따로 가져오나 봅니다.

개발자 도구보면 대문자 추가해주면 header이름도 대문자로 바껴있는데 이것도 신기하네요.





0
0
  • 답변 0

  • 로그인을 하시면 답변을 등록할 수 있습니다.