본문 바로가기
Node.js

Node.js - jwt(Json Web Token)

by J-non 2024. 8. 19.

<목차>

1. jwt란?

2. 토큰의 유형

3. 어떻게 생겼을까?

4. 토큰 만들기

5. 쿠키 사용?

 


 

1. jwt란?

 

Json Web Token
권한 인증을 위해 유저의 정보를 SHA-256 해시알고리즘으로 암호화한 값으로 권한인증을 하는 토큰 기반 인증 방식


기존의 권한인증은 세션 정보를 서버에 저장하여 사용자가 요청할 때 헤더에 포함된 세션을 비교하여 인증을 하는 방식이었다. 하지만 이는 세션 정보가 많아짐에 따라 서버에 부담을 줄 수 있다. 하지만 토큰은 서버가 아닌 클라이언트가 토큰을 가지고 있도록 하여 서버에 부담을 줄여줄 수 있다. 

 


 

2. 토큰의 유형

토큰은 사용 목적에 따라 2가지가 있다.

Access Token
서버에 통신할 때 권한 인증을 위해 사용되는 토큰으로 짧은 유효시간을 갖는다. 유효시간이 짧다고 해서 무조건 계속 로그인을 해주어야 하는 것은 아니고 이미 인증이 된 사용자라면 Refresh token에 의해 계속 token을 재발급받는다. 

 

Refresh Token
Access Token을 재발급하기 위한 토큰으로 며칠, 몇 개월 단위로 유지된다. Access Token이 만료되었을 때 Refresh token에 의해 재발급이 된다. 하지만 Refresh token도 만료가 되면 반드시 다시 권한 인증을 위해 로그인을 해야 한다. 

 

 


 

3. 어떻게 생겼을까?

 

토큰은 header, payload, signature로 나누어지며 "."으로 구분된다.

header payload signature
타입과 암호 알고리즘의 정보 검증할 유저의 정보 및 발금,만료시간 등을 포함 전자서명

 


 

4. 토큰 만들기

토큰은 외부 모듈이므로 설치 후 사용해야 한다.

npm i jsonwebtoken

 

1. 토큰 생성

토큰에는 패스워드 등의 민감한 정보 대신 유저의 ID나 닉네임같이 노출되어도 크게 상관없는 정보를 포함시키는 것이 좋다.

또한 토큰을 생성할 때 필요한 비밀키는 노출되면 안 되는 정보이기 때문에 환경변수로 저장하여 사용하는 편이 좋다.

const jwt = require("jsonwebtoken");
const key = "비밀키";
jwt.sign({
    type: "JWT",
    name: "kim"
}, key, {
    expiresIn: "5m",
    issuer: "발급자"
});

 

2. 토큰 복호화

const jwt = require("jsonwebtoken");
const token = "복호화할 토큰값";
const key = "비밀키";
jwt.verify(token, key);

 


 

5. 쿠키 사용?

JWT는 쿠키에 암호화한 토큰값을 저장하고 요청을 했을 때 해당 토큰을 검증하여 사용자의 권한 유무를 판별한다.

쿠키를 조작하여 토큰을 변조할 수 있어 신뢰성의 문제가 있다.

따라서, 브라우저에서 해당 토큰을 다루지 못하도록 서버에서 토큰을 발급해 응답할 때 httpOnly 옵션을 true로 지정해 요청과 응답에만 사용되고, 클라이언트가 직접 쿠키를 조작할 수 없게 해야 한다.

res.cookie("token", token, { httpOnly: true });

 

 

 


참고자료

https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Access-Token-Refresh-Token-%EC%9B%90%EB%A6%AC-feat-JWT

https://do-devel.tistory.com/88

 

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

Node.js - ORM, sequelize  (0) 2024.08.20
Node.js - bcrypt  (0) 2024.07.11
Node.js - MySQL 연결하기  (0) 2024.07.01
Node.js - ejs  (0) 2024.06.30
Node.js - REST란?  (0) 2024.06.29