JSON Web Token(JWT)は、Node.jsアプリにおける認証と認可を処理するためによく利用される方法としています。JWTはシンプルでコンパクトなトークンで、ユーザーを認証し情報を安全に送信するためにHTTPリクエストで簡単に渡すことができます。
この記事では、JWTの動作の概要、そのメリットの説明、Node.jsでJWTベースの認証を実装するための操作手順を皆さんに紹介します。この記事から、Node.jsで開発されたAPIでの保護されたリソースにシームレスにアクセスするために、JWT認証を簡単に実装するワークフローを手に入れましょう。
JWT (Json Web Token)とは
JWT (JSON Web Token) とは、JSON形式で記述されたトークンの一種です。JWTには3つの要素が含まれています。
- ヘッダー (Header): トークンのタイプとハッシュアルゴリズムなどのメタデータ
- ペイロード (Payload): トークンに含まれる実際のデータ
- 署名 (Signature): ヘッダーとペイロードを元に計算される電子署名
これらはドット(.)で区切った文字列として表現されます。
xxxxx.yyyyy.zzzzz
JWT の特徴として、独自の署名機能によりデータの改ざん検知が可能であることがあげられます。またトークン単体でデータを含むため、サーバーでのデータ参照が不要なステートレスな認証が実現できます。これらの利点から、Web API等での認証・認可によく利用されるようになっています。
JWTの利用シーン
JWTは、ステートレスでドメイン間対応の認証方式として、多くのwebアプリケーションでJWTが活用されています。次は、JWTの主な利用シーンを紹介します。
- API認証
- SPA(Single Page Application)の認証
- マイクロサービス間での認証
- クロスドメインシングルサインオン(SSO)
API認証では、クライアントからアクセストークンとしてJWTを送信することで、APIサーバー側でユーザーの認証/認可を実現できます。
SPAでは、WebアプリケーションのフロントエンドとバックエンドでCORS対応の認証が必要になりますが、JWTならクロスドメインでも利用できます。
マイクロサービス間では、各サービスがユーザー情報を直接管理せずとも、JWTに含まれる情報を利用できるため有用です。
SSOでは異なるドメイン間でのシームレスな認証が必要で、ドメイン間でJWTを共有することで実現できます。
このように、様々な認証・認可のユースケースでJWTが活用されています。ステートレスでスケーラブルなのが特徴です。
Node.jsでJWT認証と認可の実装方法
Node.jsの公式サイトから、Node.jsでJWT認証と認可を行うために、次の手順に従って操作することができると思います。
JWTの生成
jsonwebtoken
ライブラリを使用してJWTを生成します。 まずは次のコマンドでライブラリをインストールします。
npm install jsonwebtoken
そして、次のようなJWTを生成します:
const jwt = require('jsonwebtoken');
const payload = { userId: 123, role: 'admin' };
const secretKey = 'your-secret-key';
const token = jwt.sign(payload, secretKey, { expiresIn: '1h' });
JWTの検証
サーバー側はJWTを受け取る場合は、JWTの真実性が検証されます。次のコマンドでJWTの検証を行うことができます:
const jwt = require('jsonwebtoken');
const token = 'your-jwt-token';
const secretKey = 'your-secret-key';
try {
const decoded = jwt.verify(token, secretKey);
console.log(decoded);
} catch (error) {
console.error('JWT verification failed');
}
Middlewareを作成
Express.jsフレームワークの場合、JWT検証のmiddlewareを作成して、ルート(routes)を保護できます:
const jwt = require('jsonwebtoken');
const secretKey = 'your-secret-key';
function authenticateToken(req, res, next) {
const token = req.header('Authorization');
if (!token) return res.status(401).send('Access denied');
try {
const decoded = jwt.verify(token, secretKey);
req.user = decoded;
next();
} catch (error) {
res.status(403).send('Invalid token');
}
}
実用例
次は、JWT認証と認証を行うためのExpress.jsのアプリのサンプルになります:
// Import libraries
const express = require('express');
const jwt = require('jsonwebtoken');
// App setup
const app = express();
const secretKey = 'your-secret-key';
// Login route, generate JWT
app.post('/login', (req, res) => {
// Authenticate credentials and create token
const token = jwt.sign({ username: 'user' }, secretKey);
res.json({ token });
});
// Protected route, verify JWT
app.get('/protected', authenticateToken, (req, res) => {
res.json({ message: 'Protected data' });
});
// JWT verification middleware
function authenticateToken(req, res, next) {
// Verify JWT and decode payload
const decoded = jwt.verify(token, secretKey);
req.user = decoded;
next();
}
app.listen(3000);
Apidog:JWT認証を数クリックで行う
もしより簡単にJWT認証を行う必要がある場合、Apidogという非常に使いやすいAPI管理ツールがおすすめです。Apidogは、JWT認証を完璧に対応できるので、リクエストをサーバー側に送信する前に、直感的な操作でJWT認証を行えるAPIクライアントツールです。使い方は非常に簡単です:

上記の画面で示されているように、Apidogを開き、APIリクエストの送信画面で「Auth」タブに切り替えると、タイプを「JWT」に指定することができます。そして、同じ画面でJWTの詳細情報を記入して、「送信」ボタンをクリックすれば、簡単にJWT認証を行うことができます。
また、APIをより効率的に管理したり、テストしたりする必要がある場合は、Apidogはそれをサポートできます。
まとめ
Node.jsでのアプリケーション開発において、JWT(JSON Web Token)を用いた認証はセキュリティ確保のために非常に重要な技術です。しかしながら、JWT自体の仕組みや、コードベースでの実装方法は複雑で、開発者にとっての導入障壁が高いという課題がありました。
この問題を解決するために、近年GUIベースのAPI開発プラットフォーム「Apidog」が注目されています。Apidogを利用することで、いくつかのクリック操作だけで直感的にJWTの発行や検証を試すことができます。