JWT란 Json Web Token의 약어로 json객체로 정보를 안전하게 전송하기 위한 메소드이다. 정보를 안전하게 전송하기 위해 알고리즘을 이용하여 암호화시킨다.
사용자가 로그인에 성공한 경우 access token을 이용하여 암호화된 유저 정보를 첨부해서 request를 보내게 된다. access token 방법 중 하나가 JWT이다.
JWT의 구조는 크게 세가지로 나눌 수 있다.
각 구조별로 '.'을 이용하여 구분한다.
Header - 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있다.
토큰의 유형, 해시 알고리즘을 나타낸다.
Payload - 토큰에 담을 claim을 포함한다. claim에는 name과 value가 한쌍으로 들어가있다.
claim에는 세가지 유형이 있다.
- registered
- public : JWT를 사용하는 사람에 의해 마음대로 정의될 수 있다. 그러나 충돌을 방지하려면 JWT 레지스트리에 정의하거나 충돌 내성 네임스페이스를 포함하는 URI로 정의해야 한다.
- private : 이용에 동의하고 등록 또는 공개 청구권이 아닌 당사자 간에 정보를 공유하기 위해 만들어진 청구권이다.
Signature - Signature을 작성하려면 인코딩된 header와 payload, Secret_Key, 지정된 Algorithm을 가져와야한다.
Signature은 도중에 정보가 변경되지 않았음을 확인하는 데 사용되며, 개인 키로 서명한 토큰의 경우 JWT의 발신인이 누구인지 확인할 수도 있다.
JWT의 기본적인 발급 방법으로
jwt.encode({'id':id},SECRET_KEY,algorithm='ALGORITHM종류')
'id' 뒤에 있는 id 는 유저의 개인적인 id가 아닌 databases에 순서된 id를 입력한다.
token을 분해하며 개인정보가 노출될 수 있기 때문에 개인정보는 절대 담아선 안된다.