JSON Web Token (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 を保護してください!
以上がJWT トークンをトークン偽造やデータ操作攻撃から保護の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。