access token을 생성하는 방법 중 하나가 JWT
다.
'토큰'이란 단어를 가상화폐 등에서 많이 들을 수도 있지만,
그보다 과거에 화폐 개념으로 사용했던 토큰 개념에 더 가깝다.
유저가 웹에 접속을 한다.
로그인 창에 ID
와 PW
를 입력했을 것이다.
로그인 API를 통해 백엔드 서버에 해당 유저가 기 가입된 유저인지 확인절차를 거친다.
간단히, {user_id :6}처럼 보내면 될텐데 말이다.
1) 해킹 가능성에 대비해야 한다.
비밀번호 때와 같이 암호에 대한 개념이 들어 있지 않다. BASE64 인코딩으로 처리가 된 방식이기에 유출이 되었을때, 해독이 가능하다.
따라서, 토큰에는 유저아이디, 유저 비밀번호와 같이 중요한 데이터를 함께 보내면 안된다.
2) http 통신의 특징은 stateless다.
그렇다고 해서 클라이언트가 로그인을 했는지, 안했는지를
클라이언트에게 매번 물을 수가 없다.
유저가 댓글을 달거나 장바구니에 물품을 담거나 주문을 하는 등
특정 권한이 있는 클라이언트에게만 오픈해야만 한다.
따라서, 토큰을 통해 현재 사용자가 기 로그인한 유저인지 확인해야 한다.
xxxxx.yyyyy.zzzzz
1) header : x 부분
2) payload : y 부분
3) signature : z 부분
기본적으로 위와 같이 세 개의 구조로 구성돼 있다.
{
'alg':'HS256',
'typ':'JWT'
}
토큰의 타입은 무엇이며, 사용된 알고리즘(HS256)이 있다.
실제로 서버 간 데이터가 전송될때, Base64URL 코드화되어서 보내진다.
실제 데이터가 있는 부분이다.
{
'user_id':'6,
'exp' : 1539517391
}
헤더와 페이로드 부분은 Base64URL 방식으로 데이터가 오고간다.
즉, 절대 암호의 개념이 아니다. 따라서, 강조하지만 중요한 정보가
담겨서는 안된다.
JWT의 마지막 부분이다.
이게 필요한 이유는 무엇일까.
'당신이 작성한 부동산 계약서가 원본
인지 확인해 봅시다' 와 같은 맥락이다.
특징 중 하나는 signature 부분을 암호화되어 있다는 점이다.
하지만 복호화가 가능하다.