ログイン機能の実装には、JWT認証とセッション判定(Cookie判定)の2種類の方法がある。セッション判定の方が仕組として簡単なのだが、今回はAPI設計をすることを見越してJWT認証について分かる範囲で解説してみる。私なんかはトークンと聞くと難しそうだなと思うけれど、ユーザー側のudfcnsod (token)がシステム側のudfcnsod(token)と一致しているかどうかで、正規ユーザーかどうかを判断するだけだと思えば、割と簡単な概念ではある。
前提知識:トークンってなに?
JWTはJSON web Tokenの略。つまりトークンの一種。ではトークンとは何か?
トークンは識別や認証を行うために使用される一意の文字列や符号のこと。例:01dcdv。
①トークンは一意であり重複しない。
②トークンは有効期限が切れると無効になる。
③システムへのアクセスを許可するかどうかを決定するアクセス権などの機能を持つ。
トークンはこれらの特性を満たし、セキュリティやアクセス制御など様々な用途で用いられる。
色んなトークンがある。
①認証トークン:ユーザーがログインする際に発行されるトークン。その後のその後のリクエストに対してユーザーを認証するために使用される。OAuthやJWTなどが認証トークンの一例。
②セキュリティトークン:システムへのアクセスを許可するか否かに使用されるトークン。ワンタイムパスワードやアクセス制御トークンが該当する。
③CSRFトークン:CSRF(Cross-Site Request Forgeries)攻撃からユーザーを守る。CSRF-Token。
④アクセストークン:サードパーティのアプリケーションがAPIにアクセスするために使用されるトークン。OAuthプロトコルでよく使われる。
→JWTはトークンの中でも認証トークンの一種で、ログインする際に発行するトークンである。
JWT(JSON Web Token)ってなに?
JWT(JSON Web Token)は、ウェブアプリケーションやAPIなどの間でセキュアな情報を安全にやり取りするための仕組み。JWTは3つの部分で構成される。
①ヘッダー(Header)
JWTのタイプと使用するハッシュアルゴリズムが記述されている。
②ペイロード(Payload)
JWTに含む情報。ユーザーの識別子(user ID)やユーザー名、管理者か否かの権限などを含む。
③署名(Signature)
ヘッダーとペイロードを結合し、秘密の鍵を使ってハッシュ化したもの。トークンの改ざんを確認する
JWT認証の流れ
- ユーザーが認証情報を提供してログインする
- サーバーはユーザーの情報をもとにJWTを生成する
- 生成されたJWTはユーザーに対して応答として返される
- ユーザーはこのJWTを保持し、サーバーへのリクエストに含めて送信する
通常、HTTPヘッダーのAuthorization
フィールドにBearerトークンとして含められる - サーバーは受け取ったJWTを検証する。
ヘッダーとペイロードの内容を確認し、署名を検証してトークンの改ざんを防ぐ - 検証が成功した場合、サーバーはユーザー認証し、リクエストに対して適切な応答を返す
JWT認証を使うメリット
- サーバーがセッション管理する必要がないのでスケーラビリティに優れている。
JWT認証を使うデメリット
- 情報がトークンに含まれているため、必要な情報以外もクライアントに見えてしまう可能性がある。機密性の高い情報を含める場合は適切な対策が必要である。
コメント