Akamai EdgeWorkersを活用したJWT検証の実装方法
はじめに
JWT(JSON Web Token) はWeb APIのリクエストを検証するための軽量なトークンベースの認証方式で、セキュアで拡張性の高い認証方法として多くのシステムで利用されています。
JWTに関する情報はhttps://jwt.io/ などで確認することが可能です。
本記事では、JWTを使ったAPI認証処理をAkamaiのエッジで行う方法について紹介します。
JWTを使ったAPI認証処理をアカマイのエッジで行うことで、APIサーバーの負荷を減らし、認証プロセスを高速化できます。AkamaiのエッジでJWT検証を行う方法は、Akamai API Gatewayを使う方法とEdgeWorkersを利用する方法がありますが、ここではEdgeWorkersを使って実装する方法について紹介します。
実装の手順
①EdgeWorkersの実装
JWTの検証には以下のドキュメントを参照し、EdgeWorkers内で外部モジュール(JWT)を活用します。https://techdocs.akamai.com/edgeworkers/docs/jwt
なお、サンプルコードはgithubにあります。https://github.com/akamai/edgeworkers-examples/tree/master/delivery/common/jwt/examples

今回はその中でRS256アルゴリズムを使ったサンプルコードを試してみます。
import { logger } from 'log';
import { JWTValidator} from './jwt.js';
import { crypto, pem2ab } from 'crypto';
//advanced options for jwt validator
const jwtOption = {
//check token expiry
ignoreExpiration: false,
//check token nbf
ignoreNotBefore: false
};
const jwtValidator = new JWTValidator(jwtOption);
export async function onClientRequest (request) {
try {
// Fetch RSA public key from Propery Manager used for verification of JWT token
const secretKey = request.getVariable('PMUSER_JWT_RSA_PUBKEY');
const iKey = await crypto.subtle.importKey(
'spki',
pem2ab(secretKey),
{
name: 'RSASSA-PKCS1-v1_5',
hash: 'SHA-256'
},
false,
['verify']
);
//Fetch the Authorization header from request
let jwt = request.getHeader('Authorization');
if (jwt){
jwt = jwt[0];
//replace auth scheme before validating
jwt = jwt.replace('Bearer ','');
const jwtJSON = await jwtValidator.validate(jwt,[iKey]);
logger.log('jwtJSON %s: ',JSON.stringify(jwtJSON));
const result = {
jwt: jwtJSON,
verifed: true
};
request.respondWith(200, {}, JSON.stringify(result));
} else {
//Return bad request of authorization header is not found
request.respondWith(400, {}, 'Authorization header is missing!');
}
} catch (error) {
logger.log(error);
request.respondWith(400, {}, error);
}
}
サンプルコードではPublicキーをPropertyの変数に格納しているので、Property側に変数を作成し、JWTのPublicキーの値に設定しておきます。

②Propertyの作成
EdgeWorkersで参照する変数の作成
変数名:PMUSER_JWT_RSA_PUBKEY
今回はテスト目的のためPublicキーはhttps://jwt.io/のサンプルをそのまま利用してみます。

次にEdgewWorkersを呼び出す設定を追加します。
③JWTの検証
アカマイのエッジでは、リクエストに含まれるAuthorizationヘッダーに正しいJWTトークンがある場合、200 OKのレスポンスが返されます。もしJWTトークンの検証に失敗した場合は、400エラーが返され、リクエストがブロックされます。
3. EdgeWorkersでのJWT検証のメリット
EdgeWorkersでJWTを検証することで、以下の利点があります:
- オリジンサーバーの負荷軽減: エッジで認証処理を行うため、APIサーバーは検証済みのリクエストのみを処理することができ、負荷が減ります。
- 応答時間の短縮: リクエストがエッジで検証されるため、ユーザーに近い場所で処理が完了し、応答速度が向上します。
- セキュリティの強化: EdgeWorkersとあわせて、エッジで高度なセキュリティを適用することにより、攻撃リスクの軽減や不正アクセスの防止が可能です。
おわりに
JWTを使った認証は、APIのセキュリティ強化における標準的な手法です。また、AkamaiのEdgeWorkersを使うことで、APIサーバーに負荷をかけることなく、エッジで効率的に処理を行えます。ただし、JWTの脆弱性やセキュリティのベストプラクティスを理解し、適切に運用することが重要です。
https://www.akamai.com/ja/blog/security-research/owasp-authentication-threats-for-json-web-token
APIセキュリティ全般についても確認することをおすすめします。
https://www.akamai.com/ja/products/api-security

