JWTの基本
ウェブアプリケーションやモバイルアプリケーションの開発において、セキュリティは非常に重要な要素です。
ユーザーの認証や権限管理を行う際に、JWT(JSON Web Token)はよく使われる仕組みの一つです。
本記事では、JWTの基本的な概念と使い方について初心者向けに解説します。
JWTとは?
JWTは、JSON形式で情報を安全にやり取りするためのオープンな標準(RFC 7519)です。
主に認証や情報のやり取りに使用され、特にウェブ開発においてトークンベースの認証に広く利用されています。
JWTは3つのセクションから構成されています。
Header(ヘッダー):
トークンの種類や使用するアルゴリズムなどのメタデータが格納されます。
ヘッダーはBase64でエンコードされます。
{
"alg": "HS256",
"typ": "JWT"
}
Payload(ペイロード):
実際に運ぶデータが格納されます。
ユーザーIDや権限、発行日時など、任意のデータが含まれます。
ペイロードもBase64でエンコードされます。
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Signature(シグネチャ):
ヘッダーとペイロード、さらに秘密鍵を使用して生成される署名です。
シグネチャにより、トークンが改ざんされていないことが確認できます。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
最終的に、これらのセクションがピリオド(.
)で結合されてJWTが構成されます。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWTの利用シーン
JWTは主に以下のようなシーンで利用されます。
- 認証:
- ユーザーがログインした際に、サーバーがJWTを発行し、それをユーザーに返します。ユーザーはこのJWTを保持し、サーバーへの各リクエストに付与して認証を行います。
- 情報の安全なやり取り:
- ウェブアプリケーション内で情報を安全にやり取りするためにも使用されます。例えば、クライアントとサーバー間で情報をやり取りする場合、JWTを使ってデータを安全に梱包し送信することができます。
JWTの基本的な使い方
1. ライブラリの導入:
まず最初に、JWTを生成・検証するためのライブラリを導入します。
例えば、Node.jsでの場合、jsonwebtoken
パッケージが利用できます。
npm install jsonwebtoken
2. JWTの生成:
サーバーでユーザーがログインした際に、JWTを生成してユーザーに返します。
const jwt = require('jsonwebtoken');
const secretKey = 'your_secret_key';
const payload = {
userId: '123456',
username: 'john_doe'
};
const options = {
expiresIn: '1h'
};
const token = jwt.sign(payload, secretKey, options);
console.log(token);
3. JWTの検証:
クライアントがリクエストを送信する際に、JWTをサーバーに添付し、サーバーでそのJWTが有効か検証します。
const jwt = require('jsonwebtoken');
const secretKey = 'your_secret_key';
const tokenFromClient = '...'; // クライアントからのトークン
try {
const decodedToken = jwt.verify(tokenFromClient, secretKey);
console.log(decodedToken);
} catch (error) {
console.error('Invalid token');
}
このように、verify
メソッドを使用してJWTを検証します。もし検証に失敗した場合は例外が発生します。
JWTのセキュリティ注意点
- 秘密鍵の管理:
- JWTの署名は秘密鍵を使用するため、秘密鍵の安全な管理が重要です。秘密鍵が漏洩すると、JWTが改ざんされる可能性があります。
- 有効期限の設定:
- JWTには有効期限を設定できますが、あまりにも長い期間を指定すると、トークンが漏洩した際の被害が大きくなります。適切な有効期限を設定しましょう。
- SSL/TLSの使用:
- JWTを使用する際には、通信をSSL/TLSで暗号化することが推奨されます。これによりトークンの盗聴が防げます。
まとめ
JWTはセキュアな認証や情報のやり取りに有用な仕組みです。
そのシンプルで柔軟な性質から、多くのウェブアプリケーションで採用されています。
ただし、セキュリティ上の注意点を理解し、適切に使用することが重要です。
JWTを利用することで、セキュアでスマートな認証システムを構築できます。