Multi Developer SuHo

Node js JWT 토큰(JSON Web Token)이란 본문

Node.js 기록

Node js JWT 토큰(JSON Web Token)이란

Dreaming Developer Student 2025. 3. 13. 09:51
SMALL

안녕하세요 이번에는 JWT 토큰에 대해 알아볼려고 합니다. JWT 토큰이 무엇인지, 이것을 어떻게 활용할 수 있는지 알아볼려고 합니다.

📑목차
1. 토큰 (Token)

1-1. 토큰이란?
2. JWT 토큰
2-1. JWT 토큰이란?
2-2. 토큰의 인증 방식
2-3. JWT 토큰의 형태
2-4. JWT 토큰의 장점
2-5. JWT 토큰의 단점
2-6. JWT 문법


서론

 

본문으로 들어가기전 "토큰" 이라는 것을 들어보셨나요?  어디서 한 번쯤은 "토큰"이라는 단어를 들어보셨을 겁니다. 게임이라던지 영화라던지 어디에서나 언급되는 키워드이기도 합니다. 오늘은 사용자 인증 방식중 "JWT 토큰" 에 대해 살펴보고자 합니다.

 

 


본론

1. 토큰(Token)

 

1-1. 토큰이란?

클라이언트가 인증 정보를 보관하고 서버와 인증된 상태를 유지하는 방식을 말합니다.

 

2. JWT 토큰

2-1. JWT 토큰이란?

인증에 필요한 정보들을  JSON 형태 객체의 데이터를 담아서 인코딩한 후 클라이언트에게 전달하는 방식

 

 

2-2. 토큰의 인증 방식

## 토큰의 인증 방식
> 유저가 로그인을 하면 토큰을 발급받아서 클라이언트에서 쿠키나 스토리지에 저장하고
> 이후에 웹을 이용할 때 요청 헤더로 포함시켜서 유저의 인증을 검증한다
> 서버에 상태를 저장하는 방식이 아닌 토큰 인증방식으로 자원도 절약, 확장성도 뛰어났다.
> 토큰의 인증 방식 규칙, 카카오나, 구글 로그인을 구현하는데에도 토큰의 인증방식을 사용하게 되었다.
> 표준화된 인증 방식이 요구되어서 보안성과 확장성을 생각하고 탄생하게 토큰 기반의 인증 방식


2-3. JWT 토큰의 형태 

/*
    Header.payload.signature
*/
// Header : 서명에 사용되는 알고리즘 이름, 토큰의 타입의 내용이 포함. 객체
// payload : 토큰에 담을 데이터의 내용, 유저 정보와 토큰의 발행 시간의 만료 시간을 표현
// payload는 값의 복원이 가능하다. 안녕 -> 항상 같은 값으로 해시화
// 해시의 문자열이 내용이 중요한게 아니고, 서명이 중요하다
// signature : JWT을 인증할 때 사용하는 값으로 헤더와 페이로드의 값을 base64URL 인코딩을 해서 더한뒤
// 비밀키를 가지고 서명값을 만든다.
// 서명을 만들때 헤더,페이로드, 비밀키를 가지고 만드는데 서명의 값이 달라진다. 그럼 인증을 하지못해서
// 검증이 안되는 토큰의 값이 탄생
// 서명의 값으로 원본 복원 불가

// sha246 :  데이터를 고정, 해시 문자열로 변환
// HMAC : 해시기반의 인증 코드, 비밀키를 사용해서 데이터를 해시 값으로 만들고 데이터가 변조되지 않았다는 것을 검증
let header = {
    "alg" : "HS256", 
    "typ" : "JWT",
}

let payload = {
    lat :  "생성 시간 밀리세컨드 생성시간은 이미 포함된 값",
    uid : "suho",
    name : "suho"
}

// signature 에는 base64URL(header) + base64URL(payload) 
let signature = base64URL(header) + base64URL(payload) 
// 비밀키를 사용해서 서명을 생성
// base64 : 해시 문자열로 변환
// URL 부분은 + _ 등등의 문자열은 표현했을 때 문제가 되니 해시 문자열로 변환
// exp : 해당 토큰의 만료시간

// iss : 토큰의 발급자
// and : 발급 받는 사람

 

2-4. JWT 토큰의 장점

> 무상태 인증을 해서 서버에 세션을 저장할 필요가 없다.
> 확장성 여러 서버의 즉, 카카오나, 구글 이런 플랫폼에서 인증 정보를 공유할 수 있다.
> 표준화 여러 프로그램에서 호환성이 좋다

 

2-5. JWT 토큰의 단점

### JWT의 단점
> JWT는 자체적으로 정보를 포함하기 때문에 세션보다 크기가 커질 수 있다.
> 한 번 발급된 JWT는 유효기간이 끝날 때까지 무효화 하기 어렵다.
> 토큰이 탈취되면 유효기간 동안 무단으로 사용될 가능성이 있다.

 

2-6. JWT 토큰 문법

### JWT 문법
```sh
# jsonwebtoken 라이브러리 설치
npm i jsonwebtoken
```
```js
// jsonwebtoken 모듈 가져오기
const jwt = require('jsonwebtoken');

// 검증에 사용할 비밀키 
const KEY  = "MYKEY"

// JWT 토큰을 생성
// sign() : 토큰 생성 메서드
// sign({}) 
// 1. 페이로드의 담을 값 {} 객체 형태로 전달
// 2. 비밀키
// 3. 만료시간을 전달
const token = jwt.sign({uid : "suho", name : "suho"}, KEY , {expiresIn : "1h"});

console.log(token);

 

결론

JWT 토큰을 사용하면 사용자의 인증방식을 효율적으로 사용할 수 있고,  서버의 확장성이 높고, 대량의 트래픽을 처리할 수 있다는 점이 있습니다. 

 

LIST