Contents
プロジェクト初期化と依存ライブラリの導入
Node.js環境構築からプロジェクトディレクトリ作成、必要なパッケージインストールまでの手順を整理します。この段階では、技術的な前提条件や導入に際するポイントを押さえます。
プロジェクト初期化の手順
以下は、Express.jsプロジェクトを開始する際の基本的な流れです。
-
Node.js環境構築
Node.jsをインストールし、node -vコマンドでバージョン確認を行います。同時にnpmも含まれていることを確認してください(公式サイトより最新版を導入推奨)。 -
プロジェクトディレクトリ作成
開発用フォルダを作成し、npm init -yコマンドでpackage.jsonファイルを自動生成します。これにより、依存管理やスクリプト定義が可能になります。 -
必要なパッケージのインストール
JWT認証に必要なライブラリとして、Express.jsとjsonwebtokenを導入します。以下のコマンドで最新版を取得可能です。
|
1 2 |
npm install express jsonwebtoken |
注意: npmからインストールされるバージョンは最新版です(バージョン指定が必要な場合は
@latestや特定バージョンを追記してください)。
JWTトークンの発行処理(signメソッドの実装)
ユーザー認証ロジックでは、ユーザー情報をもとにJWTトークンを生成する必要があります。このセクションでは、POSTリクエストを受け取って秘密鍵と有効期限を設定したトークン発行処理を解説します。
ユーザー認証ロジックの作成
ユーザー情報はデータベース経由で取得するのが一般的ですが、本記事では簡単な例としてハードコーディングで実装します。以下のようにルートにPOSTリクエストを定義し、ユーザー名とパスワードを受け取ります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
app.post('/login', (req, res) => { const { username, password } = req.body; // ハードコーディングによるユーザー認証(実際にはデータベースで検証) if (username === 'admin' && password === 'password') { const payload = { username }; const secretKey = process.env.SECRET_KEY || 'your-secret-key'; // 環境変数で管理推奨 const token = jwt.sign(payload, secretKey, { expiresIn: '1h' }); res.json({ token }); } else { res.status(401).json({ error: 'Invalid credentials' }); } }); |
秘密鍵(secretKey)と有効期限の設定
JWTトークンは、秘密鍵(secretKey)と有効期限(expiresIn)を指定して生成されます。表に示すように、これらのパラメータの内容や管理方法について整理します。
| パラメータ | 内容 |
|---|---|
| payload | トークンに含めるユーザー情報をJSON形式で指定(例: { username: "user1" }) |
| secretKey | トークンの署名に使用する文字列。本番環境では絶対にハードコーディングせず、環境変数で管理することを推奨 |
| expiresIn | 有効期限(例: '1h'は1時間、'7d'は7日) |
重要:
secretKeyの管理について再度強調します。本番環境では必ず.envファイルやクラウドSecret Managerなどを使って外部から参照できない状態に保つことがセキュリティ上必須です。
JWT検証ミドルウェアの作成
トークンが送信された場合、それを検証するための独自ミドルウェアを作成します。ここでは、Authorizationヘッダーからトークンを抽出し、jsonwebtoken.verify()メソッドで検証する処理を解説します。
Authorizationヘッダーからのトークン抽出
クライアントが送信したトークンを抽出するロジックは以下の通りです。Authorization: Bearer <token>という形式のヘッダーからトークン部分を取り出します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function authMiddleware(req, res, next) { const token = req.headers.authorization?.split(' ')[1]; if (!token) return res.status(401).json({ error: 'Missing token' }); try { const secretKey = process.env.SECRET_KEY || 'your-secret-key'; const decoded = jwt.verify(token, secretKey); req.user = decoded; // ユーザー情報をリクエストオブジェクトに保存 next(); } catch (err) { res.status(401).json({ error: 'Invalid token' }); } } |
verify関数のカスタマイズと注意点
jsonwebtoken.verify()はトークンの署名検証や有効期限チェックを行うメソッドです。以下のポイントを必ず確認してください。
- 秘密鍵の一貫性:
authMiddlewareと/loginルートの両方で同じsecretKeyを使用する必要があります。 - エラーハンドリング: 不正なトークンに遭遇した場合でも適切に対応できるよう、
try-catchブロックを必ず記述してください。
保護されたルートへのアクセス制御
JWT検証ミドルウェアを作成した後は、特定のエンドポイントにのみ認証を適用します。本セクションでは、authMiddlewareを使用して保護されたルートにアクセスする際の処理フローとエラーハンドリングについて解説します。
認証が必要なエンドポイントの設定
トークンが有効であることを確認できるルートにはauthMiddlewareを適用します。以下はユーザー情報を取得する保護されたルートの例です。
|
1 2 3 4 |
app.get('/protected', authMiddleware, (req, res) => { res.json({ message: `Welcome ${req.user.username}` }); }); |
認証要否別のエンドポイント一覧
以下のように、認証が必要かどうかを表にまとめます。
| エンドポイント | 認証要否 | ミドルウェア適用例 |
|---|---|---|
/login |
❌不要 | - |
/protected |
✅必要 | authMiddleware |
セキュリティ対策の実装
JWTは軽量で使いやすい技術ですが、セキュリティ面での配慮が不可欠です。本節では、トークン有効期限のベストプラクティスとHTTPS通信強制の方法を解説します。
トークン有効期限の設定ガイド
有効期限はexpiresInパラメータで指定しますが、短い時間(1時間〜30分)に設定するのがセキュリティ上推奨されます。以下の表に用途別の有効期間を示します。
| 経過時間 | 推奨用途 |
|---|---|
1h |
一時的なAPIアクセス(例: プロフィール情報取得) |
7d |
長期にわたるセッション管理(注意が必要) |
HTTPS通信の強制と設定方法
トークンの通信中に盗聴されるリスクを防ぐために、HTTPSで通信する必要があります。Expressでは以下のように証明書ファイルを指定してサーバーを作成します。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
const https = require('https'); const fs = require('fs'); const options = { cert: fs.readFileSync('./path/to/cert.pem'), key: fs.readFileSync('./path/to/privkey.pem') }; https.createServer(options, app).listen(443, () => { console.log('Server running on https://localhost'); }); |
注意: HTTPS証明書はLet's Encryptなどから無料で取得可能です。本番環境では必ずHTTPS通信を導入してください。
技術的表記の統一と補足事項
表記ルールの見直し
- ライブラリ名:
jsonwebtoken(小文字・ハイフン無し)を使用 - フレームワーク名:
Express.js(公式名称を尊重) - 環境変数:
process.env.SECRET_KEYなど、Node.jsの標準的な記述法
まとめと補足事項
JWTの実装は簡単ですが、セキュリティ対策や設計に配慮することが重要です。秘密鍵管理、トークン有効期限、HTTPS通信の導入を必ず行い、ユーザー情報が適切に保護されるようにしてください。