NestJSとJWT
Intro
isuconの課題アプリケーションがjwtを使っていたので、興味が湧いた。 なので、試しにjwtを使った認証・認可を実装してみることにした。 ついでなので同じく興味のあったNestJSで実装してみる。
JWTとは?
概要
- Json Web Tokenの略
- サーバは認証後、jwtをクライアントに返し、クライアントは以後認証済みとしてリクエストにjwtを含め、サーバはjwtを検証・認可する。
- JWTはHeader, Payload, Signatureから構成される。
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
メリット
jwtを使用した場合はユーザデータを取得する必要なし
jwtでない通常のトークンではユーザデータを内包していないので取得が必要
引用元 : https://fusionauth.io/learn/expert-advice/tokens/pros-and-cons-of-jwts
マイクロサービスアーキテクチャで採用する分には大きなメリットがありそう。
デメリット
- ログインごとにjwtを新しく発行するため、毎回JSONのserializationと暗号化が必要だが、ユーザが多いとその負荷が無視できなくなる。
- 一回認証したjwtを無効化することが難しい。期限切れを待つ必要がある。
- JWTをXSSなどで盗まれるとユーザ情報も盗まれる可能性がある。
NestJSの認証
次の記事で。