Dev Study
NestJS コース

21. JWT — トークンによる認証

JWT(JSON Web Token)は、認証情報を1つの文字列に詰め込んで持ち運べる仕組みです。トークンは header.payload.signature の3部構成で、payload にユーザー ID や権限を入れ、signature はサーバーの秘密鍵で作った署名です。NestJS では @nestjs/jwt の JwtModule を登録し、jwtService.sign() で発行、jwtService.verify() で検証します。

実務ではログイン成功時に sign() でトークンを作って返し、クライアントは以降のリクエストの Authorization ヘッダに Bearer <トークン> を付けて送ります。サーバーは verify() で署名と有効期限を確認するだけで本人だと判断でき、セッション情報をサーバー側に保持しなくて済むのが利点です。下のコードは JWT の構造解析と検証の考え方をプレーン TypeScript で再現したものです。

つまずきポイントは、payload は署名されているだけで暗号化はされていないことです。base64 をデコードすれば誰でも中身を読めるため、パスワードなどの秘密情報を入れてはいけません。また秘密鍵が漏れると誰でも正規のトークンを偽造できるため、鍵は環境変数で厳重に管理し、有効期限(exp)も必ず設定します。

▶ サンプルコードを実行してみよう(自由に書き換えてOK)

TypeScript
サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗