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)

 



출처: https://bcho.tistory.com/search/REST JWT(JSON Web [조대협의 블로그]

 

 

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

 

 

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)

 



출처: https://bcho.tistory.com/search/REST JWT(JSON Web [조대협의 블로그]

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
31 [web개발] [jQuery] Select박스 option 값 선택하기 졸리운_곰 2021.10.20 652
30 [web개발][javascript][JQuery] textarea 값 설정및 값 가져오기 졸리운_곰 2021.10.19 441
29 [javascript][jQuery] 제이쿼리(jQuery) 선택자 - #1 file 졸리운_곰 2021.09.07 571
28 [HTML5, Javascript, Jquery] Add item from array to list when button is clicked in jQuery 졸리운_곰 2021.06.01 739
27 textarea 태그에 값을 넣고 뺄때 아니면 개행문자 '\n'이 혼란이 온다 졸리운_곰 2019.04.08 692
26 jQuery ready와 load의 차이 file 졸리운_곰 2019.03.29 733
25 How can I detect if a selector returns null? 졸리운_곰 2019.03.25 454
24 jQuery.isEmptyObject() 졸리운_곰 2019.03.24 793
23 [jQuery]요소를 추가하는 메소드(append, prepend, after, before) 졸리운_곰 2019.03.10 575
22 jQuery / Method / .text() - 선택한 요소 안의 내용을 가져오거나, 다른 내용으로 바꾸는 메서드 file 졸리운_곰 2019.03.10 599
21 How do you convert a jQuery object into a string? 졸리운_곰 2019.03.10 454
20 JQuery 오브젝트 셀렉트한 select object의 내용 확인 졸리운_곰 2019.03.10 601
19 JQuery Object 선언 : jQuery creating objects [duplicate] 졸리운_곰 2019.03.06 542
18 [제이쿼리] 태그 및 요소 삭제, Remove() file 졸리운_곰 2019.03.06 850
17 jQuery .each문(for문) 사용시 break, continue를 하려면? file 졸리운_곰 2019.03.06 743
16 jQuery / Method / .removeClass() - 선택한 요소의 클래스 값을 제거하는 메서드 file 졸리운_곰 2019.03.06 543
15 [jQuery] 선택자에 변수 넣기 졸리운_곰 2019.03.04 642
14 JQuery로 radio 버튼의 값 가져오기 : How to get the value of selected radio button in a group using jQuery 졸리운_곰 2019.01.10 532
13 Ajax replace instead of append 그리고 jquery .append(Html). 에서 class 적용 적용 졸리운_곰 2019.01.07 625
12 [jQuery] Ajax 방법 졸리운_곰 2018.08.03 656
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED