🌟
JWT認証について整理する
JWTとは
JSON Web Tokenの略です。
認証情報を決まったルールに基づいて、変換した文字列のことです。
サーバーサイドからクライアントサイドにトークンを発行し、定められた期間の間であればトークンの検証のみでユーザーを認証することができます。
JWTの構造について
JWTは下記の3つの要素で作成されます
ヘッダー | ペイロード | 署名 |
---|---|---|
JWTのトークンのタイプ、署名のアリゴリズムを決める | 取り扱いたいデータを指定、userのidやnameなど | ヘッダーとペイロードとシークレットキーを元にハッシュ化したもの |
3つの要素を . で連結した文字列がクライアントサイドに渡されます
ヘッダー = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
ペイロード = eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
署名 = SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
用途
シンプルに ユーザーの認証、APIの認証などに使えます。
ログインをした際のログイン情報をJWTに変換して保持しておくというイメージです。
(ユーザー情報、有効期限etc...)
メリット
- セッションのようにデータベースに保存することなく、使うことができる
- 改ざんされていないか、署名を通すことでチェックできる
- サーバー側でユーザーの認証状態を管理しなくても良い
- 必要な情報をトークンに含めることでDBへのクエリを減少させることができる
デメリット
- 一度認証したJWTを無効化することができない
- 有効期限の取り扱い:短い有効期限を設定するとセキュリティは強化されますが、ユーザーにとって不便になる可能性がある
- JWTは簡単にデコード(復号)することができるため、機密情報をトークンに含めることは避けるべき
まとめ
JWTは容易に実装でき、基本的なセキュリティを備えた認証方法のようです。が、デメリットとなる部分もありエンジニア界隈では日々議論が重ねられているらしいです。
しっかりと得手不得手を理解したうえで実装するのが大切ですね(戒め)
Discussion