node.js JWT tokenの適用


node.js JWT Tokenの適用


✔jwtとは何ですか。


JWT(Json Web Token)は、Json形式でユーザ属性を格納するClaimベースのWeb Tokenである.JWTはタグ自体を情報として用い,自己包含的に安全に情報を伝達する.主に会員認証や情報伝達に使われています!!

✔市token構造

  • header
  • タイプ:トークンタイプ(JWT)
  • を指定
  • alg:ハッシュアルゴリズムを指定し、通常HMAC SHA 256/RSA
  • を使用する
  • payload
  • 登録クレーム
    名前付きクレーム
  • トークンに関する情報を提供
  • 公共クレーム
  • クレーム
  • プライベートクレーム
  • クライアント<->サーバ間で協議した後に使用するクレーム
  • signature
  • ヘッダの符号化値とペイロードの符号化値とを加算した後、指定鍵

  • 💿 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では、認証にトークン値を入力することで確認できます.