NestJSとJWT

Intro

isuconの課題アプリケーションがjwtを使っていたので、興味が湧いた。 なので、試しにjwtを使った認証・認可を実装してみることにした。 ついでなので同じく興味のあったNestJSで実装してみる。

JWTとは?

概要

  • Json Web Tokenの略
  • サーバは認証後、jwtをクライアントに返し、クライアントは以後認証済みとしてリクエストにjwtを含め、サーバはjwtを検証・認可する。
  • JWTはHeader, Payload, Signatureから構成される。

https://jwt.io/introduction

JWTのHeader

{
  "alg": "HS256",
  "typ": "JWT"
}

こんな感じでtokenの種類と暗号化アルゴリズムを記録しておくらしい。

JWTのPayload

ユーザの情報などを入れるらしい。生成時間なども入れておくと有効期限を設けて再認証に誘導できるようになる。

JWTのSignature

header, payload, secretを結合した文字列を暗号化して署名としてSignatureに入れる。

JWTのメリット・デメリット

大体この記事を読めば理解できます。

https://fusionauth.io/learn/expert-advice/tokens/pros-and-cons-of-jwts

メリット

  • ペイロードにユーザ情報を入れることでサービスを跨いでユーザの検証ができる。
  • ペイロードにユーザ情報があればKVSやDBなどに問い合わせる必要性がないので、その分サーバの負荷が軽減できる。

https://fusionauth.io/assets/img/blogs/Lets-talk-about-JWTs-Diagram-1.png

jwtを使用した場合はユーザデータを取得する必要なし

jwtでない通常のトークンではユーザデータを内包していないので取得が必要

引用元 : https://fusionauth.io/learn/expert-advice/tokens/pros-and-cons-of-jwts

マイクロサービスアーキテクチャで採用する分には大きなメリットがありそう。

デメリット

  • ログインごとにjwtを新しく発行するため、毎回JSONのserializationと暗号化が必要だが、ユーザが多いとその負荷が無視できなくなる。
  • 一回認証したjwtを無効化することが難しい。期限切れを待つ必要がある。
  • JWTをXSSなどで盗まれるとユーザ情報も盗まれる可能性がある。

NestJSの認証

次の記事で。