node.js JWT token 적용

Tack's·2022년 1월 25일
0
post-thumbnail

node.js JWT Token 적용

✔️ jwt란?

JWT(Json Web Token)란 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달한다. 주로 회원 인증이나 정보 전달에 사용!!

✔️ token 구조

  • header
    • typ : 토큰의 타입을 지정(JWT)
    • alg : 해싱 알고리즘을 지정, 보통 HMAC SHA256/RSA 사용
  • payload
    • registered 클레임
      • 토큰에 대한 정보를 담기위해 이미 이름이 정해진 클레임
    • public 클레임
      • 충돌이 방지된 이름을 가지고 있는 클레임
    • private 클레임
      • 클라이언트 <-> 서버 간의 협의 후 사용되는 클레임
  • signature
    • header의 인코딩 값과 payload의 인코딩값을 합친후 주어진 비밀키



💿 jwt 예제 구현

📝 router/base.js

const jwt = require('jsonwebtoken');
const SECRET_KEY = 'MY-SECRET-KEY';

// POST /login 요청 body에 id와 password를 함께 실어서 요청으로 가정 (사실 id와 password는 암호화 되어있음)
router.post('/login', (req, res, next) => {

  //받은 요청의 id와 password로 DB에서 프로필사진, 닉네임 등 로그인 정보를 가져온다.
  const nickname = "CharmingKyu";
  const profile = 'imageURL';

  //jwt.sign(payload, secretOrPrivateKey, [options, callback])
  token = jwt.sign({
    type: 'JWT',
    nickname: nickname,
    profile: profile
  }, SECRET_KEY, {
    expiresIn: '15m', // 만료시간 15분
    issuer: '토큰발급자',
  });

  //response
  return res.status(200).json({
    code: 200,
    message: '토큰이 발급되었습니다.',
    token: token
  });
});

router에 존재하는 js 파일에 위 코드를 작성했다면 이제 미들웨어 파일인 jwt.js 파일을 작성해준다.

📝 jwt.js

const jwt = require('jsonwebtoken');
const SECRET_KEY = 'MY-SECRET-KEY';
exports.verifyToken = (req, res, next) => {
    // 인증 완료
    try {
        // 요청 헤더에 저장된 토큰(req.headers.authorization)과 비밀키를 사용하여 토큰을 req.decoded에 반환
        req.decoded = jwt.verify(req.headers.authorization, SECRET_KEY);
        return next();
    }
    // 인증 실패
    catch (error) {
        // 유효시간이 초과된 경우
        if (error.name === 'TokenExpiredError') {
            return res.status(419).json({
                code: 419,
                message: '토큰이 만료되었습니다.'
            });
        }
        // 토큰의 비밀키가 일치하지 않는 경우
        if (error.name === 'JsonWebTokenError') {
            return res.status(401).json({
                code: 401,
                message: '유효하지 않은 토큰입니다.'
            });
        }
    }
}

token 값이 유요하다면 status 200이 출력되며 토큰이 유효하지 않다면 401, 만료됬다면 419가 출력된다.

postman에서는 authorization에 토큰값을 입력하여 확인이 가능하다.

profile
바쁘다바빠

0개의 댓글