클라우드 컴퓨팅 & NoSQL/Vert.x & Node.js

REST JWT(JSON Web Token)소개 - #2 node.js에서 JWT 사용하기

Terry Cho 2015. 2. 3. 21:41

REST JWT(JSON Web Token)소개 - #2 node.js에서 JWT 사용하기

조대협 (http://bcho.tistory.com)


Jwt-simple을 이용한 node.js에서 JWT 토큰 사용하기

앞에서 http://bcho.tistory.com/999 JWT 토큰에 대한 개념에 대해서 간략하게 알아보았다. 그러면,실제로 JWT 토큰을 어떻게 생성하고 파싱하는 지를 node.js를 샘플을 통해서 알아보도록 하자.

시작부터 말하자면. 너무 쉽다. 쉬워도 너무..!!

node.js에는 여러가지 JWT 라이브러리가 있지만 그중에서 가장 사용이 편리한 라이브러리는 jwt-simple 이라는 라이브러리가 있다. 먼저 npm을 이용해서 해당 패키지를 설치한 후에

 


<그림. npm을 이용하여, jwt-simple 모듈을 설치>

다음과 같은 코드를 작성한다.

var jwt = require('jwt-simple');

var body= { name:'terry.cho',id:'terry',company:'coca'}

var secret ='mysecret';


var token = jwt.encode(body,secret);

console.log('token :'+token);


var decoded = jwt.decode(token,secret);

console.log('decoded:'+JSON.stringify(decoded));


위의 코드에서 body에 해당하는 부분이 JWT 토큰안에 들어갈 실제 claim이다. 그리고 secret은 HMAC-SHA1-256 을 생성하기 위한 비밀 키로, jwt.encode에 이 claim JSON과, secret을 주면, token이 생성된다.

반대로, decode에 encoding된 토큰과 secret을 인자로 넘겨주면 claim을 디코딩할 수 있다.

 


<그림. 예제 실행 결과>

디폴트로 HMAC-SHA1256 (HS256이라고 함)을 지원하며, HS384,HS512와 RS256도 지원한다.

자바,파이썬등의 JWT 라이브러리

그외에 다른 프로그래밍 언어에도 여러가지 JWT 라이브러리가 제공된다. 아래는 Atlassian 홈페이지에서 참고한 JWT 라이브러리 목록이다.

Language

Library

Java

atlassian-jwt and jsontoken

Python

pyjwt

Node.js

node-jwt-simple

Ruby

ruby-jwt

PHP

firebase php-jwt and luciferous jwt

.NET

jwt

Haskell

haskell-jwt


<그림. 다른 프로그래밍 언어의 JWT 라이브러리>

※ 출처 : https://developer.atlassian.com/static/connect/docs/concepts/understanding-jwt.html

이외에도 http://jwt.io/ 사이트에 가면, 각종 언어에 대한 JWT 라이브러리를 제공한다.


문제점

사용이 쉽고, 서버의 개발 부담을 덜어줄 수 있다는 여러가지 장점을 가지고 있으나, 그만큼 또 단점도 가지고 있다.


길이

Claim에 넣는 데이터가 많아질 수 록, JWT 토큰의 길이가 길어진다. API 호출등에 사용할 시에,매 호출마다 헤더에 붙어서 가야하기 때문에, 길이가 길다는 것은 그만큼 네트워크 대역폭 낭비가 심하다는 의미이다.


한번 발급된 토큰은 값을 수정하거나 폐기가 불가

JWT는 토큰 내에 모든 정보를 다 가지고 있기 때문에, 한번 발급된 토큰에 대한 변경은 서버에서는 더 이상 불가능하다. 예를 들어 토큰을 잘못 발행해서 삭제하고 싶더라도, Signature만 맞으면 맞는 토큰으로 인식을 하기 때문에, 서버에서는 한번 발급된 토큰의 정보를 바꾸는 일등이 불가능하다.

그래서 만약에 JWT를 쓴다면, Expire time을 꼭 명시적으로 두도록 하고, refresh token등을 이용해서, 중간중간 토큰을 재발행하도록 해야 한다. (하루 단위 정도?) 


보안

JWT는 기본적으로 Claim에 대한 정보를 암호화 하지 않는다. 단순히 BASE64로 인코딩만 하기 때문에, 중간에 패킷을 가로채거나, 기타 방법으로 토큰을 취득했으면 토큰 내부 정보를 통해서 사용자 정보가 누출 될 수 있는 가능성이 있다. 특히 자바스크립트 기반의 웹 클라이언트의 경우 브라우져상의 디버거등을 통해서 토큰이 노출될 가능성이 높다.

그래서, 이를 보완하는 방법으로는 토큰 자체를 암호화 하는 방법이 있다. JSON을 암호화 하기 위한 스펙으로는 JWE(JSON Web Encryption)


그리드형