JSON Web トークン (JWT) は、API 認証とデータ交換を保護するために広く使用されています。ただし、実装や取り扱いが不適切だと、トークンの偽造やデータ操作につながる脆弱性が露呈する可能性があります。このブログでは、JWT の一般的な弱点、実際の攻撃例、およびこれらのリスクを軽減するためのベスト プラクティスについて説明します。
JWT は、2 者間で転送されるクレームを表現するコンパクトで URL セーフな手段です。これは、Base64 でエンコードされたヘッダー、ペイロード、署名の 3 つの部分で構成されます。
JWT 構造:
{ "header": { "alg": "HS256", "typ": "JWT" }, "payload": { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }, "signature": "SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" }
1.アルゴリズム混乱攻撃:
攻撃者は弱いアルゴリズムを悪用したり、トークン ヘッダーのアルゴリズムをなしに変更したりして、トークンの偽造につながる可能性があります。
例:
{ "alg": "none", "typ": "JWT" }
緩和:
常にサーバー側で alg パラメータを検証し、「なし」または弱いアルゴリズムのトークンを拒否します。
安全な実装:
const jwt = require('jsonwebtoken'); const payload = { sub: "1234567890", name: "John Doe" }; const secret = 'your-256-bit-secret'; const token = jwt.sign(payload, secret, { algorithm: 'HS256' }); jwt.verify(token, secret, { algorithms: ['HS256'] }, function(err, decoded) { if (err) throw new Error('Token verification failed'); console.log(decoded); });
2.キーインジェクション攻撃:
攻撃者はペイロードを操作して新しいキーを含め、不正アクセスにつながる可能性があります。
例:
{ "sub": "1234567890", "name": "John Doe", "admin": true }
緩和:
主張が適切に検証され、機密情報がペイロードに保存されていないことを確認してください。
安全な実装:
const payload = { sub: "1234567890", name: "John Doe" }; const token = jwt.sign(payload, secret, { algorithm: 'HS256' }); jwt.verify(token, secret, function(err, decoded) { if (err) throw new Error('Token verification failed'); if (decoded.admin) throw new Error('Unauthorized access'); console.log(decoded); });
3.弱い秘密キー:
弱い秘密鍵や予測可能な秘密鍵を使用すると、総当たり攻撃につながる可能性があります。
緩和:
ランダムに生成された強力な秘密鍵を使用し、定期的にローテーションします。
安全な実装:
const crypto = require('crypto'); const secret = crypto.randomBytes(64).toString('hex'); const token = jwt.sign(payload, secret, { algorithm: 'HS256' }); jwt.verify(token, secret, function(err, decoded) { if (err) throw new Error('Token verification failed'); console.log(decoded); });
これは、Node.js アプリケーションに JWT を安全に実装する方法の完全な例です:
ステップ 1: 依存関係をインストールする
npm install jsonwebtoken express body-parser
ステップ 2: シンプルなサーバーを作成する
const express = require('express'); const bodyParser = require('body-parser'); const jwt = require('jsonwebtoken'); const crypto = require('crypto'); const app = express(); app.use(bodyParser.json()); const secret = crypto.randomBytes(64).toString('hex'); app.post('/login', (req, res) => { const { username, password } = req.body; // Authenticate user (dummy check for example) if (username === 'user' && password === 'pass') { const payload = { username }; const token = jwt.sign(payload, secret, { algorithm: 'HS256', expiresIn: '1h' }); res.json({ token }); } else { res.status(401).json({ message: 'Invalid credentials' }); } }); app.get('/protected', (req, res) => { const token = req.headers['authorization']; if (!token) return res.status(403).json({ message: 'No token provided' }); jwt.verify(token, secret, { algorithms: ['HS256'] }, (err, decoded) => { if (err) return res.status(500).json({ message: 'Failed to authenticate token' }); res.json({ message: 'Access granted', user: decoded }); }); }); app.listen(3000, () => { console.log('Server running on port 3000'); });
JWT の脆弱性を理解し、軽減することは、アプリケーションのセキュリティを維持するために重要です。ベスト プラクティスに従い、JWT を適切に処理することで、トークンの偽造やデータ操作を防止し、堅牢な API セキュリティを確保できます。
JWT の脆弱性から保護するためのベスト プラクティスを実装して、今すぐ API を保護してください。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3