본문 바로가기
삽질일기/트러블 슈팅

HTTP multipart/form-data에 jwt token 포함 시켜 전송하기

by 권성호 2021. 11. 3.

1.  서론

일반적으로, api 서버는 api를 모든 사용자에게 노출시키지 않는다. 

인증된 사용자를 기본으로 인가된 api만 노출시킨다.(그 수단으로 세션이나 토큰을 주로 사용한다.)

사내에서 개발되는 api 서버는 로그인된 사용자에 한에서 jwt token을 발급하고, 사용자는 매 요청마다 헤더에 token을 포함시킨다. 그럼, 서버에선 token의 유효성, 권한 등을 확인해 유효한 사용자에 대해서만 api에 접근할 수 있도록 한다.

 

그런데, 특정 api의 경우 ui에서 요청 시 헤더 값을 커스텀하게 세팅하지 못하는 경우가 발생했다.

(파일 다운로드 api의 경우, 단순 ajax를 사용한 비동기 통신으로 서버에 요청하게 되면 파일이 모두 다운로드될 때까지 아무것도 표시되지 않는다. form.sumit 방식을 활용하면 다운로드 현황을 브라우저에서 알아서 보여준다고 한다. 그런데, form.sumit을 사용하면 커스텀 헤더 값을 지정할 수 없기 때문에 토큰을 헤더에 넣을 수 없다는 UI 개발자 분의 이야기가 있었다.)

 

2.  본론

HTTP multipart/form-data로 보내는 요청 바디에 token을 넣어 보내면 서버에서 이를 처리해야 했다.

api서버는 spring security 프레임워크의 지원을 받아 인증 처리를 하고 있다.

 

문제를 해결하기 위해 처음 접근한 방식은, spring security 프레임워크가 토큰을 헤더에서 꺼내 유효성 검사하는 로직을 그대로 베껴 form-data에서 token을 꺼내 적용하는 것이었다. 그래서 spring security 프레임워크가 어떻게 토큰을 처리하는지 디버깅해 보았다. 그런데...?!?! 아래와 같은 코드를 발견했다.

 ServletRequest로 부터 Authentication 객체를 꺼내는 부분
타고 들어가 보니 우선 헤더에서 확인하고 없으면 바디까지도 확인한다..?!?!
form-data를 보낼 때 key값이 "access_token"인 필드에 토큰을 보내면 헤더에 보내는 것과 동일하게 security 프레임워크에서 처리해 주는구나!

 

결국 spring security에서도 헤더에 토큰을 넣지 못하는 경우에 대한 방어 코드를 작성해 두었고, 우리는 그에 맞게 토큰을 보내기만 하면 되는 간단한 문제였다.

 

3.  느낀점

spring 관련 프레임워크 정도의 성숙한 프레임워크면, 노말 한 문제에 대한 방어는 대부분 되어 있다고 다시 느꼈다. 그럴수록 프레임워크를 잘 이해하고 적절히 활용하는 것이 중요하다는 것도 느꼈다.

댓글