JWT(Json Web Token)

2023. 11. 21. 20:22Developer/Node.js

 JWT  

- 서버와 클라이언트 사이에서 정보를 안전하게 전송하기 위해 도움을 주는 웹 토큰(Web Token)이다.

- JSON 형태의 데이터를 안전하게 전송하고 검증할 수 있는 기능을 제공한다.

- 다양한 암호화 알고리즘을 사용할 수 있어, 신뢰성을 보장한다.

- header.payload.signature의 형식으로 3가지의 데이터를 포함한다.(JWT형식으로 변환된 데이터는 2개의 ' . ' 이 포함)

 

 JWT 구조  

 

HEADER : 헤더는 토큰의 타입과 어떤 암호화를 사용하여 생성된 데이터인지 정의되어 있다.

PAYLOAD : 페이로드는 실제 전달하려는 데이터를 담고 있다. 대표적으로 개발자가 원하는 데이터를 저장한다.

SIGNATURE :

명은 헤더와 페이로드, 그리고 비밀 키(Secret Key)를 이용하여 생성된다. 이 서명은 토큰이 변조되지 않은 정상적인 토큰인지 확인할 수 있게 도와준다.

 

 JWT 사용 가이드  

1. 프로젝트로 이용할 폴더를 생성 후 명령어로 필요한 모듈 설치

// npm을 이용해 프로젝트를 초기화
yarn init -y

// jsonwebtoken, express 라이브러리를 설치
npm i jsonwebtoken express

 

 

2. jsonwebtoken 라이브러리의 sign메서드를 사용해 JWT 생성

import jwt from 'jsonwebtoken';

const token = jwt.sign({ myPayloadData: 1234 }, 'mysecretkey');
console.log(token); 
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2OTA4NzM4ODV9.YUmYY9aef9HOO8f2d6Umh2gtWRXJjDkzjm5FPhsQEA0

 

 

3. 코드로 복호화 해서 출력 해보기

const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2OTA4NzM4ODV9.YUmYY9aef9HOO8f2d6Umh2gtWRXJjDkzjm5FPhsQEA0";
const decodedValue = jwt.decode(token);

console.log(decodedValue); // { myPayloadData: 1234, iat: 1690873885 }

 

 

4. 복호화가 아닌 변조되지 않은 데이터인지 검증

const decodedValueByVerify = jwt.verify(token, "mysecretkey");

console.log(decodedValueByVerify); // { myPayloadData: 1234, iat: 1690873885 }

 

 

5. 잘못된 비밀키를 입력해서 데이터를 검증 (잘못된 비밀키를 이용해 JWT 검증하면 에러 발생함)

import jwt from 'jsonwebtoken';

const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2OTA4NzM4ODV9.YUmYY9aef9HOO8f2d6Umh2gtWRXJjDkzjm5FPhsQEA0";
const decodedValueByVerify = jwt.verify(token, "secretkey");

console.log(decodedValueByVerify);

// JsonWebTokenError: invalid signature

 

 

6. jwt.io 에서 복호화하여 확인

 

 

 JWT 의 사용  

  1. 회원가입: 회원권 구매
    • 클라이언트는 회원가입에서 이메일, 패스워드와 같은 정보를 제공
    • 이 정보는 서버에 저장되어, 이후 인증 과정에서 사용
  2. 로그인: 회원권으로 놀이공원 입장
    • 클라이언트는 이메일, 패스워드로 로그인
    • 서버는 이 정보를 검증한 후, 유효하다면 JWT를 생성하여 클라이언트에게 제공
  3. 로그인 확인: 놀이기구 탑승 전마다 유효한 회원권인지 확인
    • 클라이언트는 로그인 후 모든 API 요청에 JWT를 포함하여 전송
    • 서버는 JWT를 확인하고, 유효하다면 요청된 API를 수행
  4. 내 정보 조회: 내 회원권이 목에 잘 걸려 있는지 확인하고, 내 이름과 사진, 바코드 확인
    • 클라이언트는 JWT를 사용해 자신의 정보를 조회할 수 있다.
    • 서버는 JWT를 복호화하여 내부에 저장된 정보를 확인하고, 이 정보를 바탕으로 사용자의 세부 정보를 조회하여 전달

 

마지막으로, JWT의 중요한 두가지 특징
JWT가 인증서버에서 발급되었는지 위변조 여부를 확인할 수 있는 것이고, 누구든지 JWT 내부에 들어있는 정보를 확인할 수 있는 것이다.(복호화)

 

그래서 민감한 정보는 담지 않도록 한다.

이상.

'Developer > Node.js' 카테고리의 다른 글

Prisma (ORM)  (1) 2023.12.04
Sequelize  (0) 2023.11.29
미들웨어 (Middleware)  (0) 2023.11.13
쿠키와 세션  (0) 2023.11.08
[Express.js] Router  (0) 2023.11.01