PR

【完全ガイド】JWTとは?初心者でもわかる仕組みと使い方を徹底解説

IT-Skills

Webサービスを利用する際、ログインやデータのやり取りなどで認証を必要とするシーンが存在します。

この記事では認証の方法として広く一般的に利用されているJWT(JSON Web Token)について解説します。

スポンサーリンク

JWTとは?

JWT(JSON Web Token)は、ユーザーの認証情報やその他のデータを安全にやり取りするためのトークン形式の標準規格です。JSON形式でデータを保持し、署名を付けることでデータの改ざんを防止します。

Q
トークンとは?
A

ユーザーやアプリケーションを識別し、認証・認可を実現するための「デジタルな証明書」のようなもの。アクセス権限や有効期限などの情報が含まれます。

Q
JSONとは?
A

JSON(JavaScript Object Notation)は、データを「キーと値のペア」で表現するシンプルなフォーマット。軽量で人間にも読みやすく、プログラム間でのデータ交換に広く使われています。

簡単に言うと、JWTは「安全な情報のやり取りを実現するためのデジタルなパスポート」のようなものです。

JWTを使うメリット

JWTを使うことで、以下のようなメリットがあります。

  • サーバーレスな認証管理:サーバー側でセッション情報を保持する必要がないため、スケーラビリティが向上します。
  • クロスドメインでの利用が容易:異なるドメイン間でもトークンを共有しやすいです。
  • 通信量の削減:必要な情報をトークンに含めることで、追加のデータベースアクセスを減らせます。
  • 柔軟性:カスタムクレーム(属性)を追加することで、さまざまな情報を含められます。

セッション認証との違い

従来のセッション認証では、ユーザーがログインするとサーバー側でセッション情報を保持し、ユーザーにはセッションIDが付与されます。しかし、この方法ではサーバー側に状態を持つため、サーバーの負荷が増えたり、負荷分散が難しくなったりします。

一方、JWTではサーバーが状態を持たないステートレスな認証が可能です。これにより、サーバーの負荷を軽減し、複数のサーバー間での負荷分散が容易になります。

JWTの仕組み

JWTは以下の3つの部分から構成されています:

  1. ヘッダー(Header)
  2. ペイロード(Payload)
  3. 署名(Signature)

これらはそれぞれBase64URLエンコードされ、ピリオド(.)で区切られて結合されます。

Q
Base64URLエンコードとは?
A

Base64エンコードの一種。URLやファイル名で安全に使用できる形式に変換する方法です。
通常のBase64エンコードで使われる文字列の一部を、URLで問題なく扱える文字に置き換えています。

1. ヘッダー(Header)

トークンのタイプ(JWT)と署名アルゴリズムの情報が含まれます。例:

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

2. ペイロード(Payload)

ユーザー情報や有効期限などのクレーム(属性)が含まれます。標準クレームの例:

  • iss:発行者(Issuer)
  • sub:主体(Subject)
  • exp:有効期限(Expiration Time)

例:

{
  "sub": "1234567890",
  "name": "山田太郎",
  "admin": true,
  "iat": 1516239022
}

3. 署名(Signature)

ヘッダーとペイロードを結合し、秘密鍵でハッシュ化したものです。これにより、データの改ざんを検出できます。

参考 共通鍵暗号方式/公開鍵暗号方式とは?初心者向けに3分でわかりやすく解説

JWTの生成と検証の流れ

  1. ユーザー認証:ユーザーがログイン情報を送信します。
  2. トークン生成:サーバーがユーザー情報を元にJWTを生成します。
  3. トークン送信:生成したJWTをユーザーに返します。
  4. リクエスト時のトークン送付:ユーザーは以降のリクエストにJWTを含めます。
  5. トークン検証:サーバーは受け取ったJWTを検証し、リクエストを処理します。

JWTの実装方法

JWTを実装するには、以下の手順を踏みます。

ステップ1:ライブラリの導入

各プログラミング言語には、JWTを扱うためのライブラリがあります。例えば:

  • Node.js:jsonwebtoken
  • Python:PyJWT
  • Java:jjwt
  • PHP:firebase/php-jwt

ステップ2:トークンの生成

ユーザーが認証されたら、サーバー側でトークンを生成します。例(Node.js):

const jwt = require('jsonwebtoken');
const payload = {
  userId: user.id,
  name: user.name
};
const token = jwt.sign(payload, '秘密鍵', { expiresIn: '1h' });

ステップ3:トークンの送信

生成したトークンをユーザーに返します。HTTPヘッダーのAuthorizationに含めるのが一般的です。

res.header('Authorization', 'Bearer ' + token);

ステップ4:トークンの検証

ユーザーからのリクエストを受け取ったら、トークンを検証します。例(Node.js):

const token = req.headers['authorization'].split(' ')[1];
jwt.verify(token, '秘密鍵', (err, decoded) => {
  if (err) {
    return res.status(401).send('トークンが無効です');
  }
  req.user = decoded;
  next();
});

セキュリティ上の注意点

JWTを安全に使用するためには、以下のポイントに注意が必要です。

秘密鍵の管理

署名に使用する秘密鍵は、厳重に管理しましょう。漏洩すると、トークンが偽造されるリスクがあります。

有効期限の設定

トークンの有効期限を適切に設定し、長期間有効なトークンを避けます。短い有効期限にすることで、万が一トークンが盗まれても被害を最小限に抑えられます。

HTTPSの利用

通信を暗号化するために、HTTPSを使用しましょう。これにより、中間者攻撃によるトークンの盗聴を防げます。

不要な情報を含めない

トークンには必要最低限の情報だけを含めましょう。機密性の高い情報を含めると、セキュリティリスクが高まります。

よくある間違いと対策

JWTの実装で陥りやすいミスと、その対策を紹介します。

署名なしのトークンを受け入れてしまう

署名がない、または無効なトークンを受け入れてしまうと、セキュリティが崩壊します。必ず署名の検証を行いましょう。

秘密鍵をコード内にベタ書きする

秘密鍵をコード内に直接記述すると、ソースコード管理システムから漏洩する可能性があります。環境変数や安全な設定ファイルを使用しましょう。

トークンの無効化ができない

JWTは一度発行すると、その有効期限内は有効です。ユーザーがログアウトした場合や、権限が変更された場合でもトークンが使えると問題です。対策として、ブラックリスト方式やトークンの短期化を検討しましょう。

JWTの活用事例

JWTはさまざまな場面で活用されています。

  • WebAPIの認証:RESTful APIでのユーザー認証に利用。
  • シングルサインオン(SSO):一度のログインで複数のサービスにアクセス可能に。
  • モバイルアプリとの連携:サーバーとアプリ間の安全な通信に利用。

まとめ

JWTとは、ユーザー認証と情報の安全なやり取りを可能にするトークン形式の技術です。サーバーが状態を持たないため、スケーラビリティが高く、現代のウェブ開発において重要な役割を果たしています。正しい実装とセキュリティ対策を行うことで、安全で効率的なシステムを構築できます。

この記事を通じて、JWTの基本から実装方法、注意点まで理解していただけたでしょうか。ぜひ実際のプロジェクトでJWTを活用してみてください。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
IT-Skills
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました