[Spring Security] JWT Token은 어디에 담아 발급해야 하는가

·2023년 2월 26일
5

NerdNest

목록 보기
6/6
post-thumbnail

사건의 발단

부트캠프 수료 후, 같은 부트캠프를 수료한 수강생 분들과 토이프로젝트를 진행하였다. 그 와중에 프론트 한 분께서 프리, 메인 프로젝트 때에도 JWT Token 발급 요청을 했을 때 늘 Response HeaderToken이 담겨서 왔다는 말을 하셨다.

🧐 당연함. 클라이언트가 요청을 보낼 때도 Header에 담아서 보내고, 발급도 Header에 담아서 보내라고 배웠음.

순간, 왜 header에 넣어서 보내야 하냐는 질문에는 답변을 할 수 없었다. 당연하게 header에 넣어 보내라고 했으니 그렇게 했을뿐..

의문을 제기하신 분이 친한 백엔드 개발자에게 해당 내용을 여쭤보셨다고 했다. 그러자 개발자 분은 여러 사이트를 보여주시며 Token 발급 시에는 Response Body에 담아 보내는 게 맞다! 하셨다고 한다.

Kakao REST API를 확인한 결과 정말... Body에 담아서 보내고 있었다.

그렇지만 타 사이트들이 이렇게 한다고해서 이유도 모르고 따라하기에는 찝찝하기 때문에 이유를 찾아보기로 했다.

JWT Token은 어디로 반환?

우선 JWT 공식 문서를 확인해봤다. 그 어디에도... 인증, 인가가 필요한 요청일 때 Request Headertoken*을 넣어 보내라는 말 뿐. 반환을 어디로 해야 한다는 말이 없었다.

💡 당연함! JWT Token은 크기가 아주 작기 때문에 Header에 넣어 보내도 큰 문제가 없다! 클라이언트에서 인증이 필요한 요청을 보낼 때도 Header에 보내기도 하고 말이다.

HTTP Header와 Body

간단하게 HTTP HeaderBody의 역할을 생각해보자.

클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 한다.

Body

클라이언트의 요청 또는 클라이언트 요청에 따른 서버의 응답이 전송할 실질적인 데이터가 담기는 공간.

Token 발급은 Body에

클라이언트가 로그인 요청을 보내면 그에 맞는 응답 데이터는 새로 발급된 Token이다.
실질적인 데이터를 전달해야 하므로 Header보다는 body에 담아서 보내는 게 맞다는 생각이 들었다.

심지어 JWT는 JSON Web Token의 약자로 Json 타입의 token을 생성한다.

클라이언트에서 편리하게 Json타입의 Token을 추출하여 사용할 수 있기 때문에 Body에 넣어 반환하는 것을 권장한다.

클라이언트의 요청은 Header에

그럼 왜 클라이언트가 인증이 필요한 요청에서는 token을 Header에 담아 보내는 것일까?

GET, DELETE와 같은 HTTP Method는 Body가 필요하지 않기 때문이고, 요청에 필요한 실질적인 데이터가 아닌 인증을 위해 사용하는 부가적인 정보이기 때문이다.

여전히 찝찝

명쾌하게 답을 얻은 것이 아니기 때문에 찝찝함이 남아있다. 그래도 권장하고, 권장하지 않는 정도이기 때문에 여태까지 Header에 넣어 반환한 것이 잘못된 게 아니라 다행스럽게 생각한다.

토이 프로젝트는 Body에 반환하는 걸로 해보자구!

참고
토큰 기반의 로그인 인증 방법 이해하기 (JWT)
MDN HTTP 메세지
모든 개발자를 위한 HTTP 웹 기본 지식

profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

1개의 댓글

comment-user-thumbnail
2023년 11월 19일

사람마다 다 말이 다른데, 명확한 답을 말해주는 사람은 없어서 매번 답답하군요..ㅋㅋㅋ

답글 달기