본문 바로가기

Development/TIL

JsonWebToken

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