Backend/JavaScript,NodeJS, Express

JWT(json web token) 다뤄보기

jellylucy 2021. 5. 2. 14:38

1. JWT 구조

Header . Payload . Signature

(1) Header 

두가지 요소로 구성된다.

token의 type과 서명에 사용된 알고리즘이 들어간다. (3번 서명값에 사용될 알고리즘이 들어간다)

이 JSON 은 base64로 인코딩되어 첫번째 파트에 들어가게 된다.

 

(2) Payload 

토큰에 담을 클레임(Claims)을 포함한다. 여러 클레임 포함가능

클레임 : Payload에 담는 정보의 한 조각, 객체나 추가적인 데이터를 표현한다.

클레임 형태 : name - value 한 쌍으로 구성

 

3가지의 유형으로 나뉜다.

1. 등록된 클레임 (registered claims)

 

권장하고 있는 클레임

iss (issuer 토큰 발행자)

exp (expriation time 토큰 만료시간)

sub (subject 토큰 제목)

aud (audience 토큰 대상자)

 

2. 공개된 클레임 (public claims)

 

3. 비공개 클레임 (private claims)

 

(3) Signature

secret key를 포함하여 암호화되어 있다.

 

 


2. JWT Process

 

토큰 유효기간을 주는 이유

:

세션은 stateful로 사용자가 폰에서 로그인한 상태를 알고 있어, 다른 웹페이지에서 로그인할 경우 폰 로그인 세션을 종료할 수 있다. 

토큰은 발급만 하는 stateless라서 n 가지에서 동일 아이디로 로그인해도 종료시킬 방법이 없다

따라서 유효기간을 만들어 단점을 보완한다.

 

accessToken을 짧게 주고, refreshToken은 2주정도로 잡는다.

accessToken 만료시, 사용자는 가지고 있는 refreshToken을 서버에게 보낸다

서버는 refreshToken을 데이터 베이스에 저장을 해두어서, 값 비교를 통해 accessToken 재발급을 결정한다.

 


로그인을 했을 때 토큰을 생성해야한다. 

 

 

토큰 생성 완료.

생성시, 두개의 토큰을 생성한다

acesss token 생성하기 ( 기간을 짧게 설정 ) 

refresh token 생성하기 (상대적으로 길게 설정 ) 


토큰이 필요한 예시 상황 (인증이 필요한 상황) : 사용자가 좋아요를 누른다.

좋아요를 누를 때 토큰을 확인한다.

 

토큰 확인법 : jwt의  1,2 번 값을 서버의 비밀 키와 함께 돌려봐서 계산한 뒤 그 값이 jwt 3번 서명값과 같은 지 확인한다.

그렇다면, 서버의 비밀 키는 무엇일까.

 

만약 access token이 만료가 됨을 확인할 시,

사용자는 refresh, access 토큰을 서버로 보낸다.

access 가 조작되지 않았는지를 확인 한 후, refresh비교한다. 

refresh가 동일하고, 유호기간도 지나지 않았으면 access token 새로 발급해준다.