😀JWT로 인증을 진행하면서 항상 들던생각을 찾아서 정리해 보려고 한다.
🙄JSON Web Token은 왜 헤더로 주고받을까? 개발 초기에 처음 JWT를 사용할 때는 뭣도 모르고 body에 JWT를 집어넣어서 프론트와 주고 받으며 개발을 진행했었다.
하지만 JWT인증에 대해서 좀 더 알아가면서 이를 Authorizetion헤더
에 Bearer ...
의 형태로 토큰을 주고 받아야하며, PostMan이나 Thunder Client와 같은 API테스트용 툴을 쓸때도 따로 Authorizetion헤더
에 Bearer ...
의 형태를 가지고 테스트를 진행한다. 대체 왜 그럴까?
🙄일단 GPT4 모델을 탑제한 뤼튼(wrtn)에게 물어보았다.
1번 항목에 대해서는 의문점이 남는다. 이미 규격화 되어 버렸기 때문에 헤더에 담는다니? 그렇다면 규격화가 된 이유가 있을 것 아닌가?
2번 항목은 동의할 수 없다. JWT는 헤더에 담든 Body에 담든 F12를 눌러 개발자탭에서 잘 뒤져보면 어떻게든 노출될 수 밖에 없다.
3번 항목은 결국 1번 항목과 동일하다. RESTful API또한 규격화 된 API작성 방법일 뿐이다.
😀결국 내가 원하는 답을 가르쳐 주지는 못했다. 그리고 구글링을 통해 여기저기 돌아보았다.
어떤 포스팅에서는 JWT가 데이터량이 많기 때문에 헤더에 넣어야 한다는 주장을 보여주었다.
그런데 또 다른 블로그 포스팅에서는 HTTP헤더로 JWT를 전달할 때 헤더에 용량이 커지면 일부 서버에서는 받아들여지지 않는다는 내용 또한 있었다.
😀여러 블로그를 돌아보았지만 내가 원하는 시원한 답변을 받지 못했다. 개발자 커뮤니티 질문방에 같은 질문이 있나 찾아보았더니 존재했었다. 해당 글의 답변은 아래와 같았다.
처음 IETF에 의해 JWT 가 제안된 RFC7519 문서에서 Authorization Header를 통해 encrypted jwt 를 주고 받도록 protocol 로서 규정했기 때문입니다. 동작상의 이상은 없지만 “약속” 인거죠. 아래 사진은 해당 문서의 발췌본이며 링크는 아래와 같습니다. https://datatracker.ietf.org/doc/html/rfc7519#section-1
결국 처음부터 JWT는 Authorization Header통해서 전달하자고 "약속"을 했기 때문에 Header에 실어서 보내주고, 실질적으로 body를 통해 보내주어도 동작에 문제가 생기지는 않는다는 것이다.
JWT는 HTTP의 Authorization Header나 URI Query Parameters와 같은 공간이 제한된 환경을 위한 간결한 클레임 표현 형식입니다. 라고 소개하고있다.
❓클레임 이란?
😀하지만 원문 전체의 Ctrl + f 를 눌러 Authorization에 대한 찾기를 분석해 보면 가장처음 소개하는 부분밖에 존재하지 않는다. 그렇다면 Authorization Header가 아닌 URI Query Parameters에 담아도 상관 없다는 건가?
여기서 뤼튼의 가장 첫번째 답변에 공감할 수 있을 것 같다. 처음 JWT가 나왔을 때는 Authorization Header와 URI Query Parameters에 모두 담아서 사용했었지만 Authorization Header에 담아 쓰는 방법이 굳어지면서 규격화 되버린게 아닐까? 라는 추측을 하게 된다.
참고자료(출처)
brunchstory 최진영 블로그 포스팅 JWT(Json Web Token) 알아가기
티스토리 제이크 서 블로그 포스팅 JWT(Json Web Token) 이란 무엇이며 왜 사용하는가?
궁금했던 내용인데 재밌게 잘써주셔서 감사합니다