導入
マイクロサービスアーキテクチャは、複雑なシステムを小さな独立したサービスに分割する手法です。特に、TypeScriptを使用することで、型安全性を保ちながら開発が進められ、開発者はより効率的に作業を行えます。ここでは、実務でよく遭遇する「ユーザー認証サービス」を例に取り、その設計と実装のポイントを解説します。
教科書レベルの解説(マイクロサービス)
重要な概念の整理
マイクロサービスでは、各サービスが独自のビジネス機能を持ち、他のサービスとはAPIを通じて連携します。このアプローチにより、異なるチームが独立して開発やデプロイを行うことが可能になります。ユーザー認証サービスでは、トークンベースの認証やOAuth2.0の実装が一般的です。これにより、セキュリティが強化され、スケーラビリティも向上します。
コード例(TypeScript)
import express from 'express';
import jwt from 'jsonwebtoken';
const app = express();
app.use(express.json());
const SECRET_KEY = 'your_secret_key';
app.post('/login', (req, res) => {
const { username, password } = req.body;
// ユーザー認証ロジック
if (username === 'admin' && password === 'password') {
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
return res.json({ token });
}
return res.status(401).json({ message: '認証失敗' });
});
app.get('/protected', (req, res) => {
const token = req.headers['authorization']?.split(' ')
;
if (!token) return res.status(403).json({ message: 'トークンが必要です' });
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) return res.status(403).json({ message: 'トークンが無効です' });
res.json({ message: '保護された情報', user });
});
});
app.listen(3000, () => {
console.log('サーバーがポート3000で起動しました');
});
コードの行ごとの解説
- まず、Expressフレームワークを使用してアプリケーションを初期化し、JSONボディをパースするためのミドルウェアを設定します。
- ログインエンドポイント(/login)を定義し、ユーザー名とパスワードを受け取ります。
- 認証に成功した場合、JWTトークンを生成し、クライアントに返します。
- 保護されたリソースへのアクセスを制御するため、/protectedエンドポイントを定義します。
- リクエストヘッダーからトークンを取得し、検証を行います。トークンが無効な場合は、403エラーを返します。
- 最後に、アプリケーションをポート3000でリッスンします。
解説編
ユーザー認証サービスの実装において重要な点は、トークンの管理とセキュリティです。トークンが漏洩すると、悪意のあるユーザーが不正アクセスする可能性があります。そのため、トークンの有効期限を設定し、必要に応じてリフレッシュトークンを使用することが推奨されます。また、セキュリティの観点から、HTTPSを使用することも忘れないでください。これにより、データの盗聴を防ぎ、より安全な通信が実現します。
まとめ
- マイクロサービスアーキテクチャでは、サービス間の連携が重要であり、API設計がカギとなります。
- TypeScriptを使用することで、型安全なコードを書くことができ、開発効率が向上します。
- ユーザー認証の実装には、トークンの管理とセキュリティ対策が不可欠です。