JWTの基本構造と実装
JWT(JSON Web Token)は、認証と認可を実現するためのオープン標準(RFC 7519)です。JSONベースの軽量なセキュリティトークンで、ヘッダー、ペイロード、署名の3部分で構成されます。システム間での安全なクレーム情報の伝達に利用されます。
JWTのメリット
- 軽量性: JSON形式のため、XMLよりも軽量で解析が容易
- 自己完結性: ユーザークレームを含むため、認証時にデータベース参照が不要
- ステートレス性: サーバー側で状態を保持する必要がなく、拡張性が高い
- 安全性: 署名による改ざん検知が可能
JWTの構成要素
// JWT生成の基本例
public void generateTokenExample() {
JwtBuilder tokenBuilder = Jwts.builder()
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS256")
.claim("userId", 10001)
.claim("userName", "サトウタロウ")
.setExpiration(new Date(System.currentTimeMillis() + 3600000));
}
マイクロサービス間通信方式
HTTP/RESTful API呼び出し
各マイクロサービスがRESTful APIを提供し、HTTPリクエストで相互に呼び出します。Spring BootではSpring MVCやWebFluxを使用して実装します。
Feignクライアントの実装
@FeignClient(name = "order-service")
public interface OrderClient {
@GetMapping("/orders/{id}")
Order getOrder(@PathVariable("id") Long orderId);
}
// 使用例
@RestController
public class OrderController {
@Autowired
private OrderClient orderClient;
@GetMapping("/order-info/{id}")
public Order getOrderInfo(@PathVariable Long id) {
return orderClient.getOrder(id);
}
}
RPC(リモートプロシージャコール)
gRPC、Apache Thrift、Dubboなどのフレームワークを使用して、直接的なメソッド呼び出しを実現します。
メッセージキュー
RabbitMQやKafkaを使用した非同期通信で、サービス間の結合度を低減します。
RESTful APIの設計原則
RESTful APIは以下の原則に基づいて設計されます:
- リソースのURIによる識別
- HTTPメソッドによる操作の表現(GET、POST、PUT、DELETE)
- ステートレスな通信
- 統一されたインターフェース
OpenFeignの核心コンポーネント
| コンポーネント | 役割 | デフォルト実装 |
|---|---|---|
| Contract | メソッド注釈の解析 | Contract.Default |
| Encoder | リクエストボディのシリアライズ | Encoder.Default |
| Decoder | レスポンスボディのデシリアライズ | Decoder.Default |
| Client | HTTPリクエストの実行 | Client.Default |
実装上の注意点
JWTを使用する際は、以下の点に注意が必要です:
- 秘密鍵の適切な管理
- トークンの有効期限の設定
- センシティブ情報のペイロードへの含め方
- 署名アルゴリズムの適切な選択