JWT가 무엇?
웹 어플리케이션에서 사용자 인증 정보를 안전하게 전송하기 위해 JSON 형식으로 만들어진 암호화된 문자열이다.
일반적으로 서버에서 클라이언트로 인증을 할 때 토큰 기반 인증 방식으로 많이 사용된다.
JWT의 구조
Header.Payload.Signature 세 부분으로 이루어져있다.
따라서, JWT 형식으로 변환된 데이터는 항상 2개의 '.'이 포함된 데이터여야 한다.
- hearder에는 signature 데이터에 어떤 암호화를 사용했는지 표현한다.
- payload에는 우리가 원하는 데이터를 저장한다.
- signature는 이 토큰이 정상적인 토큰인지 확인할 수 있게 도와준다.
JWT의 특성
- 비밀키를 모르더라도 복호화(decode)가 가능하다.
- 그래서 민감한 정보는 담지 않도록 해야한다.
- 특정 언어에서만 사용할 수 있는 기술이 아니라 데이터를 암호화하는 하나의 개념이다.
- JWT를 사용하면 서버에서 세션을 유지하지 않아도 되므로 서버 부하가 감소한다.
- 쿠키에 담아서 사용할 수 있기 때문에 여러 서버에서도 쉽게 공유할 수 있다.
JWT를 사용해보자!
데이터 암호화
const jwt = require("jsonwebtoken");
const token = jwt.sign({ myPayloadData: 1234 }, "mysecretkey");
// payload에 담을 데이터와 설정한 비밀키를 넣는다.
console.log(token); // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2Njc1NjE0NDB9.nvYSsLsT8jp7IfkbB2seCNeuLqRBgrrzDjKRFXjvoUE
jwt 형식으로 인코딩(암호화)하면 header.payload.signature 형태의 문자열로 변환된다.
데이터 복호화
const jwt = require("jsonwebtoken");
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2Njc1NjE0NDB9.nvYSsLsT8jp7IfkbB2seCNeuLqRBgrrzDjKRFXjvoUE";
const decodedValue = jwt.decode(token);
console.log(decodeValue); // { myPayloadData: 1234, iat: 1667561440 }
암호화된 문자열을 jwt로 복호화(디코딩)하면 담아두었던 정보를 볼 수 있다.
iat는 토큰이 생성된 시간 정보를 담고 있다.
데이터 검증
const jwt = require("jsonwebtoken");
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2Njc1NjE0NDB9.nvYSsLsT8jp7IfkbB2seCNeuLqRBgrrzDjKRFXjvoUE";
const decodedValueByVerify = jwt.verify(token, "mysecretkey");
console.log(decodedValueByVerify); // { myPayloadData: 1234, iat: 1667561440 }
JWT 방식으로 암호화된 데이터는 누구든지 복호화 할 수 있지만 시크릿 키를 통한 검증으로 변조 여부를 확인할 수 있다.
JWT를 적용한 로그인 API 예시
const express = require('express');
const JWT = require("jsonwebtoken");
const app = express();
app.post('/login', async (req, res) => {
// 사용자 정보
const user = {
userId: 203,
email: "nodeJeans@gmail.com",
name: "레드준",
}
// 사용자 정보를 JWT로 생성
const userJWT = await JWT.sign(user, // user 변수의 데이터를 payload에 할당
"secretOrPrivateKey", // JWT의 비밀키를 secretOrPrivateKey라는 문자열로 할당
{ expiresIn: "1h" } // JWT의 인증 만료시간을 1시간으로 설정
);
// userJWT 변수를 sparta 라는 이름을 가진 쿠키에 Bearer 토큰 형식으로 할당
res.cookie('nodeJeans', `Bearer ${userJWT}`);
return res.status(200).end();
});
app.listen(5002, () => {
console.log(5002, "번호로 서버가 켜졌어요!");
});
- 사용자 정보를 payload에 저장한 JWT를 nodeJeans라는 이름을 가진 쿠키에 할당한다.
- JWT를 생성할 때 위변조 여부를 확인할 수 있는 비밀키를 사용한다.
- 쿠키의 만료시간과 별개로 JWT의 만료 시간을 설정했다.
보안과 관련된 개념이므로,
JWT의 특성과 장점, 단점을 확실히 파악하고 사용해야겠다.
'Development > TIL' 카테고리의 다른 글
Sequelize 탐구 (0) | 2023.04.26 |
---|---|
Sequelize (0) | 2023.04.25 |
내가 만든 Cookie (0) | 2023.04.21 |
try catch를 이용한 예외 처리 (0) | 2023.04.20 |
schema.virtual (0) | 2023.04.20 |