TypeScriptć§JWTć使ēØććå ē¢ć§åå®å ØćŖčŖčؼććæć¼ć³ćę¤čØććå®å Øć§äæå®åÆč½ćŖć°ćć¼ćć«ć¢ććŖć±ć¼ć·ć§ć³ć確äæćć¾ććåå®å Øę§ćé«ćć¦ćć¦ć¼ć¶ć¼ćć¼ćæććć¼ć«ćććć³ęØ©éćē®”ēććććć®ćć¹ććć©ćÆćć£ć¹ćå¦ć³ć¾ćć
TypeScriptčŖčؼļ¼ć°ćć¼ćć«ć¢ććŖć±ć¼ć·ć§ć³åćć®JWTåå®å Øććæć¼ć³
ä»ę„ć®ēøäŗę„ē¶ćććäøēć§ćÆćå®å Øć§äæ”é ¼ę§ć®é«ćć°ćć¼ćć«ć¢ććŖć±ć¼ć·ć§ć³ćę§ēÆććććØćęćéč¦ć§ććčŖčؼćÆćć¦ć¼ć¶ć¼ć®IDćę¤čؼććććć»ć¹ć§ćććę©åÆćć¼ćæćäæč·ććęæčŖćććć¢ćÆć»ć¹ć確äæććäøć§éč¦ćŖå½¹å²ćęććć¾ććJSON Web Tokenļ¼JWTļ¼ćÆććć®ć·ć³ćć«ććØē§»ę¤ę§ćććčŖčؼćå®č£ ććććć®äøč¬ēćŖéøęč¢ćØćŖć£ć¦ćć¾ććTypeScriptć®å¼·åćŖåć·ć¹ćć ćØēµćæåćććććØć§ćJWTčŖčؼćÆćē¹ć«å¤§č¦ęØ”ćŖå½éćććøć§ćÆćć®å “åćććć«å ē¢ć§äæå®ćććććć®ć«ćŖćć¾ćć
JWTčŖčؼć«TypeScriptć使ēØććēē±
TypeScriptćÆćčŖčؼć·ć¹ćć ćę§ēÆććéć«ććć¤ćć®å©ē¹ćććććć¾ćć
- åå®å Øļ¼TypeScriptć®éēåä»ććÆćéēŗććć»ć¹ć®ę©ćꮵéć§ćØć©ć¼ćęęććć®ć«å½¹ē«ć”ćć©ć³ćæć¤ć ć®äŗęćć¬äŗę ć®ćŖć¹ćÆć軽ęøćć¾ćććććÆćčŖčؼćŖć©ć®ć»ćć„ćŖćć£ć«ęęćŖć³ć³ćć¼ćć³ćć«ćØć£ć¦éåøøć«éč¦ć§ćć
- ć³ć¼ćć®äæå®ę§ć®åäøļ¼åćÆę確ćŖå„ē“ćØććć„ć”ć³ććęä¾ććē¹ć«č¤ę°ć®éēŗč ćé¢äøććåÆč½ę§ć®ććč¤éćŖć°ćć¼ćć«ć¢ććŖć±ć¼ć·ć§ć³ć«ććć¦ćć³ć¼ćć®ēč§£ćå¤ę“ćććć³ćŖćć”ćÆćæćŖć³ć°ć容ęć«ćć¾ćć
- ć³ć¼ćč£å®ćØćć¼ć«ć®å¼·åļ¼TypeScript対åæć®IDEćÆćććåŖććć³ć¼ćč£å®ćććć²ć¼ć·ć§ć³ćććć³ćŖćć”ćÆćæćŖć³ć°ćć¼ć«ćęä¾ććéēŗč ć®ēē£ę§ćåäøććć¾ćć
- ćć¤ć©ć¼ćć¬ć¼ćć®åęøļ¼ć¤ć³ćæć¼ćć§ć¼ć¹ććøć§ććŖćÆć¹ćŖć©ć®ę©č½ćÆććć¤ć©ć¼ćć¬ć¼ćć³ć¼ććåęøććć³ć¼ćć®åå©ēØę§ćåäøćććć®ć«å½¹ē«ć”ć¾ćć
JWTć®ēč§£
JWTćÆć2č éć§č»¢éććććÆć¬ć¼ć ć蔨ē¾ććććć®ćć³ć³ććÆćć§URLć»ć¼ććŖęꮵć§ćććććÆćꬔć®3ć¤ć®éØåć§ę§ęććć¦ćć¾ćć
- ćććć¼ļ¼ć¢ć«ć“ćŖćŗć ćØćć¼ćÆć³ć®ēØ®é”ćęå®ćć¾ćć
- ćć¤ćć¼ćļ¼ć¦ć¼ć¶ć¼IDććć¼ć«ćęå¹ęéćŖć©ć®ćÆć¬ć¼ć ćå«ć¾ćć¦ćć¾ćć
- ē½²åļ¼ē§åÆéµć使ēØćć¦ćć¼ćÆć³ć®ę“åę§ćäæčؼćć¾ćć
JWTćÆćåćŖćÆćØć¹ćć§ćć¼ćæćć¼ć¹ć«ćÆćØćŖćå®č”ććåæ č¦ććŖćććµć¼ćć¼å“ć§ē°”åć«ę¤čؼć§ćććććéåøøćčŖčؼć«ä½æēØććć¾ćććć ććę©åÆę å ±ćJWTćć¤ćć¼ćć«ē“ę„äæåććććØćÆäøč¬ēć«ęØå„Øććć¾ććć
TypeScriptć§åå®å ØćŖJWTčŖčؼćå®č£ ćć
TypeScriptć§åå®å ØćŖJWTčŖčؼć·ć¹ćć ćę§ēÆććććć®ććć¤ćć®ććæć¼ć³ćč¦ć¦ćæć¾ćććć
1. ć¤ć³ćæć¼ćć§ć¼ć¹ć使ēØćććć¤ćć¼ćåć®å®ē¾©
JWTćć¤ćć¼ćć®ę§é ć蔨ćć¤ć³ćæć¼ćć§ć¼ć¹ćå®ē¾©ććććØććå§ćć¾ććććć«ććććć¼ćÆć³å ć®ćÆć¬ć¼ć ć«ć¢ćÆć»ć¹ćććØćć«åå®å Øę§ć確äæććć¾ćć
interface JwtPayload {
userId: string;
email: string;
roles: string[];
iat: number; // ēŗč”ę„ęļ¼ćæć¤ć ć¹ćæć³ćļ¼
exp: number; // ęå¹ęéļ¼ćæć¤ć ć¹ćæć³ćļ¼
}
ćć®ć¤ć³ćæć¼ćć§ć¼ć¹ćÆćJWTćć¤ćć¼ćć®äŗę³ćććå½¢ē¶ćå®ē¾©ćć¾ćććć¼ćÆć³ć®ęå¹ę§ćē®”ēććććć«éč¦ćŖć`iat`ļ¼ēŗč”ę„ęļ¼ć`exp`ļ¼ęå¹ęéļ¼ćŖć©ć®ęØęŗēćŖJWTćÆć¬ć¼ć ćå«ć¾ćć¦ćć¾ććć¦ć¼ć¶ć¼ćć¼ć«ć権éćŖć©ćć¢ććŖć±ć¼ć·ć§ć³ć«é¢é£ćććć®ä»ć®ćÆć¬ć¼ć ćčæ½å ć§ćć¾ćććć¼ćÆć³ćµć¤ćŗćęå°éć«ęććć»ćć„ćŖćć£ćåäøćććććć«ććÆć¬ć¼ć ćåæ č¦ćŖę å ±ć®ćæć«å¶éććććØććå§ććć¾ćć
ä¾ļ¼ć°ćć¼ćć«eć³ćć¼ć¹ćć©ćććć©ć¼ć ć§ć®ć¦ć¼ć¶ć¼ćć¼ć«ć®å¦ē
äøēäøć®é”§å®¢ć«ćµć¼ćć¹ćęä¾ććeć³ćć¼ć¹ćć©ćććć©ć¼ć ćčćć¦ćæć¾ććććē°ćŖćć¦ć¼ć¶ć¼ćÆē°ćŖććć¼ć«ćęć£ć¦ćć¾ćć
- ē®”ēč ļ¼č£½åćć¦ć¼ć¶ć¼ćććć³ę³Øęćē®”ēććććć®ćć«ć¢ćÆć»ć¹ęØ©ćććć¾ćć
- 販売č ļ¼čŖåć®č£½åćčæ½å ććć³ē®”ēć§ćć¾ćć
- 锧客ļ¼č£½åćé²č¦§ććć³č³¼å „ć§ćć¾ćć
`JwtPayload`ć®`roles`é åć使ēØćć¦ććććć®ćć¼ć«ć蔨ćććØćć§ćć¾ćć`roles`ććććć£ćććč¤éćŖę§é ć«ę”å¼µćć¦ćć¦ć¼ć¶ć¼ć®ć¢ćÆć»ć¹ęØ©ć詳瓰ćŖę¹ę³ć§č”Øē¾ć§ćć¾ććććØćć°ćć¦ć¼ć¶ć¼ć販売č ćØćć¦ęä½ć§ććå½ć®ćŖć¹ćććć¦ć¼ć¶ć¼ćē®”ēč ć¢ćÆć»ć¹ęØ©ćęć¤åŗčć®é åćęć¤ććØćć§ćć¾ćć
2. åä»ćJWTćµć¼ćć¹ć®ä½ę
JWTć®ä½ęćØę¤čؼćå¦ēćććµć¼ćć¹ćä½ęćć¾ćććć®ćµć¼ćć¹ćÆćåå®å Øę§ć確äæććććć«`JwtPayload`ć¤ć³ćæć¼ćć§ć¼ć¹ć使ēØććåæ č¦ćććć¾ćć
import jwt from 'jsonwebtoken';
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key'; // å®å
Øć«äæē®”ćć¦ćć ććļ¼
class JwtService {
static sign(payload: Omit, expiresIn: string = '1h'): string {
const now = Math.floor(Date.now() / 1000);
const payloadWithTimestamps: JwtPayload = {
...payload,
iat: now,
exp: now + parseInt(expiresIn) * 60 * 60,
};
return jwt.sign(payloadWithTimestamps, JWT_SECRET);
}
static verify(token: string): JwtPayload | null {
try {
const decoded = jwt.verify(token, JWT_SECRET) as JwtPayload;
return decoded;
} catch (error) {
console.error('JWT verification error:', error);
return null;
}
}
}
ćć®ćµć¼ćć¹ćÆćꬔć®2ć¤ć®ć”ć½ćććęä¾ćć¾ćć
- `sign()`ļ¼ćć¤ćć¼ćććJWTćä½ęćć¾ćć`iat`ćØ`exp`ćčŖåēć«ēęćććććć«ć`Omit
`ćåćåćć¾ćć`JWT_SECRET`ćÆå®å Øć«äæē®”ććććØćéč¦ć§ććēę³ēć«ćÆćē°å¢å¤ę°ćØć·ć¼ćÆć¬ććē®”ēć½ćŖć„ć¼ć·ć§ć³ć使ēØćć¾ćć - `verify()`ļ¼JWTćę¤čؼććęå¹ćŖå “åćÆćć³ć¼ćććććć¤ćć¼ććčæććē”å¹ćŖå “åćÆ`null`ćčæćć¾ććę¤čؼå¾ć«åć¢ćµć¼ć·ć§ć³`as JwtPayload`ć使ēØćć¾ćććććÆć`jwt.verify`ć”ć½ććććØć©ć¼ćć¹ćć¼ļ¼`catch`ććććÆć§ćć£ććļ¼ććććå®ē¾©ćććć¤ćć¼ćę§é ć«äøč“ćććŖććøć§ćÆććčæććććå®å Øć§ćć
éč¦ćŖć»ćć„ćŖćć£ć«é¢ććčę ®äŗé ļ¼
- ē§åÆéµć®ē®”ēļ¼JWTē§åÆéµćć³ć¼ćć«ćć¼ćć³ć¼ćććŖćć§ćć ćććē°å¢å¤ę°ć¾ććÆå°ēØć®ć·ć¼ćÆć¬ććē®”ēćµć¼ćć¹ć使ēØćć¦ćć ććććć¼ćå®ęēć«ćć¼ćć¼ć·ć§ć³ćć¦ćć ććć
- ć¢ć«ć“ćŖćŗć ć®éøęļ¼HS256ćRS256ćŖć©ć®å¼·åćŖē½²åć¢ć«ć“ćŖćŗć ćéøęćć¦ćć ććć`none`ć®ćććŖå¼±ćć¢ć«ć“ćŖćŗć ćÆéæćć¦ćć ććć
- ćć¼ćÆć³ć®ęå¹ęéļ¼ä¾µå®³ććććć¼ćÆć³ć®å½±éæćå¶éććććć«ćJWTć«é©åćŖęå¹ęéćčØå®ćć¦ćć ććć
- ćć¼ćÆć³ć®ć¹ćć¬ć¼ćøļ¼JWTććÆć©ć¤ć¢ć³ćå“ć§å®å Øć«äæē®”ćć¦ćć ććććŖćć·ć§ć³ć«ćÆćHTTPå°ēØCookieć¾ććÆXSSę»ęć«åƾććé©åćŖäŗé²ęŖē½®ćč¬ćććć¼ć«ć«ć¹ćć¬ć¼ćøćå«ć¾ćć¾ćć
3. ććć«ć¦ć§ć¢ć使ēØććAPIćØć³ććć¤ć³ćć®äæč·
`Authorization`ćććć¼ć®JWTćę¤čؼććććØć«ćććAPIćØć³ććć¤ć³ććäæč·ććććć«ć¦ć§ć¢ćä½ęćć¾ćć
import { Request, Response, NextFunction } from 'express';
interface RequestWithUser extends Request {
user?: JwtPayload;
}
function authenticate(req: RequestWithUser, res: Response, next: NextFunction) {
const authHeader = req.headers.authorization;
if (!authHeader) {
return res.status(401).json({ message: 'Unauthorized' });
}
const token = authHeader.split(' ')[1]; // Bearerćć¼ćÆć³ćę³å®
const decoded = JwtService.verify(token);
if (!decoded) {
return res.status(401).json({ message: 'Invalid token' });
}
req.user = decoded;
next();
}
export default authenticate;
ćć®ććć«ć¦ć§ć¢ćÆć`Authorization`ćććć¼ććJWTćę½åŗćć`JwtService`ć使ēØćć¦ę¤čؼćććć³ć¼ćććććć¤ćć¼ćć`req.user`ćŖććøć§ćÆćć«ć¢ćæćććć¾ććć¾ććExpress.jsć®ęØęŗć®`Request`ć¤ć³ćæć¼ćć§ć¼ć¹ćę”å¼µćć`RequestWithUser`ć¤ć³ćæć¼ćć§ć¼ć¹ćå®ē¾©ćć`JwtPayload | undefined`åć®`user`ććććć£ćčæ½å ćć¾ććććć«ćććäæč·ćććć«ć¼ćć§ć¦ć¼ć¶ć¼ę å ±ć«ć¢ćÆć»ć¹ćććØćć«åå®å Øę§ćęä¾ććć¾ćć
ä¾ļ¼ć°ćć¼ćć«ć¢ććŖć±ć¼ć·ć§ć³ć§ć®ćæć¤ć ć¾ć¼ć³ć®å¦ē
ć¢ććŖć±ć¼ć·ć§ć³ć§ćē°ćŖććæć¤ć ć¾ć¼ć³ć®ć¦ć¼ć¶ć¼ćć¤ćć³ććć¹ć±ćøć„ć¼ć«ć§ćććØćć¾ććć¦ć¼ć¶ć¼ć®åŖå ćæć¤ć ć¾ć¼ć³ćJWTćć¤ćć¼ćć«äæåćć¦ćć¤ćć³ćęéćę£ćć蔨示ććåæ č¦ćććå “åćććć¾ćć`JwtPayload`ć¤ć³ćæć¼ćć§ć¼ć¹ć«`timeZone`ćÆć¬ć¼ć ćčæ½å ć§ćć¾ćć
interface JwtPayload {
userId: string;
email: string;
roles: string[];
timeZone: string; // ä¾ļ¼'America/Los_Angeles'ć'Asia/Tokyo'
iat: number;
exp: number;
}
ꬔć«ćććć«ć¦ć§ć¢ć¾ććÆć«ć¼ććć³ćć©ć¼ć§ć`req.user.timeZone`ć«ć¢ćÆć»ć¹ćć¦ćć¦ć¼ć¶ć¼ć®å„½ćæć«å¾ć£ć¦ę„ä»ćØęå»ććć©ć¼ćććć§ćć¾ćć
4. ć«ć¼ććć³ćć©ć¼ć§ć®čŖčؼęøćæć¦ć¼ć¶ć¼ć®ä½æēØ
äæč·ćććć«ć¼ććć³ćć©ć¼ć§ćåå®å Øę§ćå®å Øć«åćć`req.user`ćŖććøć§ćÆććä»ćć¦ćčŖčؼęøćæć¦ć¼ć¶ć¼ć®ę å ±ć«ć¢ćÆć»ć¹ć§ććććć«ćŖćć¾ććć
import express, { Request, Response } from 'express';
import authenticate from './middleware/authenticate';
const app = express();
app.get('/profile', authenticate, (req: Request, res: Response) => {
const user = (req as any).user; // ć¾ććÆRequestWithUserć使ēØ
res.json({ message: `ććć«ć”ćÆć${user.email}ććļ¼`, userId: user.userId });
});
ćć®ä¾ć§ćÆć`req.user`ćŖććøć§ćÆćććčŖčؼęøćæć¦ć¼ć¶ć¼ć®ć”ć¼ć«ćØIDć«ć¢ćÆć»ć¹ććę¹ę³ć示ćć¦ćć¾ćć`JwtPayload`ć¤ć³ćæć¼ćć§ć¼ć¹ćå®ē¾©ćććććTypeScriptćÆ`user`ćŖććøć§ćÆćć®äŗę³ćććę§é ćčŖčććåćć§ććÆćØć³ć¼ćč£å®ćęä¾ć§ćć¾ćć
5. ćć¼ć«ćć¼ć¹ć®ć¢ćÆć»ć¹å¶å¾”ļ¼RBACļ¼ć®å®č£
ććććē“°ććć¢ćÆć»ć¹å¶å¾”ć®ććć«ćJWTćć¤ćć¼ćć«äæåććć¦ćććć¼ć«ć«åŗć„ćć¦RBACćå®č£ ć§ćć¾ćć
function authorize(roles: string[]) {
return (req: RequestWithUser, res: Response, next: NextFunction) => {
const user = req.user;
if (!user || !user.roles.some(role => roles.includes(role))) {
return res.status(403).json({ message: 'Forbidden' });
}
next();
};
}
ćć®`authorize`ććć«ć¦ć§ć¢ćÆćć¦ć¼ć¶ć¼ć®ćć¼ć«ć«åæ č¦ćŖćć¼ć«ćå«ć¾ćć¦ćććć©ććć確čŖćć¾ććććć§ćŖćå “åćÆć403 ForbiddenćØć©ć¼ćčæćć¾ćć
app.get('/admin', authenticate, authorize(['admin']), (req: Request, res: Response) => {
res.json({ message: 'ćććććē®”ēč
ļ¼' });
});
ćć®ä¾ć§ćÆć`/admin`ć«ć¼ććäæč·ććć¦ć¼ć¶ć¼ć`admin`ćć¼ć«ćęć£ć¦ććåæ č¦ćććć¾ćć
ä¾ļ¼ć°ćć¼ćć«ć¢ććŖć±ć¼ć·ć§ć³ć§ć®ē°ćŖćé貨ć®å¦ē
ć¢ććŖć±ć¼ć·ć§ć³ć§éčåå¼ćå¦ēććå “åćÆćč¤ę°ć®é貨ććµćć¼ćććåæ č¦ćććå “åćććć¾ććć¦ć¼ć¶ć¼ć®åŖå é貨ćJWTćć¤ćć¼ćć«äæåć§ćć¾ćć
interface JwtPayload {
userId: string;
email: string;
roles: string[];
currency: string; // ä¾ļ¼'USD'ć'EUR'ć'JPY'
iat: number;
exp: number;
}
ꬔć«ććććÆćØć³ćććøććÆć§`req.user.currency`ć使ēØćć¦ćåæ č¦ć«åæćć¦ä¾”ę ¼ććć©ć¼ćććććé貨ęē®ćå®č”ć§ćć¾ćć
6. ćŖćć¬ćć·ć„ćć¼ćÆć³
JWTćÆčØčØäøćē寿å½ć§ććć¦ć¼ć¶ć¼ć«é »ē¹ć«ćć°ć¤ć³ćč¦ę±ććććØćéæććććć«ććŖćć¬ćć·ć„ćć¼ćÆć³ćå®č£ ćć¾ćććŖćć¬ćć·ć„ćć¼ćÆć³ćÆćć¦ć¼ć¶ć¼ćč³ę ¼ę å ±ćåå „åććŖćć¦ććę°ććć¢ćÆć»ć¹ćć¼ćÆć³ļ¼JWTļ¼ćåå¾ććććć«ä½æēØć§ććé·åÆæå½ćć¼ćÆć³ć§ćććŖćć¬ćć·ć„ćć¼ćÆć³ććć¼ćæćć¼ć¹ć«å®å Øć«äæåććć¦ć¼ć¶ć¼ć«é¢é£ä»ćć¾ććć¦ć¼ć¶ć¼ć®ć¢ćÆć»ć¹ćć¼ćÆć³ćęéåćć«ćŖććØććŖćć¬ćć·ć„ćć¼ćÆć³ć使ēØćć¦ę°ćććć¼ćÆć³ćč¦ę±ć§ćć¾ćććć®ććć»ć¹ćÆćć»ćć„ćŖćć£ć®čå¼±ę§ćåéæććććć«ę éć«å®č£ ććåæ č¦ćććć¾ćć
é«åŗ¦ćŖåå®å Øęč”
1. ććē“°ććå¶å¾”ć®ććć®čå„åÆč½ćŖć¦ććŖć³
å “åć«ćć£ć¦ćÆćć¦ć¼ć¶ć¼ć®ćć¼ć«ć¾ććÆćŖćÆćØć¹ćć®ćæć¤ćć«åŗć„ćć¦ćē°ćŖćJWTćć¤ćć¼ććåæ č¦ć«ćŖćå “åćććć¾ććčå„åÆč½ćŖć¦ććŖć³ćÆćåå®å Øę§ćå®ē¾ććć®ć«å½¹ē«ć”ć¾ćć
interface AdminJwtPayload {
type: 'admin';
userId: string;
email: string;
roles: string[];
iat: number;
exp: number;
}
interface UserJwtPayload {
type: 'user';
userId: string;
email: string;
iat: number;
exp: number;
}
type JwtPayload = AdminJwtPayload | UserJwtPayload;
function processToken(payload: JwtPayload) {
if (payload.type === 'admin') {
console.log('ē®”ēč
ć®ć”ć¼ć«:', payload.email); // ć”ć¼ć«ć«å®å
Øć«ć¢ćÆć»ć¹ć§ćć¾ć
} else {
// typeććuserćć§ćććććpayload.emailćÆććć§ćÆć¢ćÆć»ć¹ć§ćć¾ćć
console.log('ć¦ć¼ć¶ć¼ID:', payload.userId);
}
}
ćć®ä¾ć§ćÆć2ć¤ć®ē°ćŖćJWTćć¤ćć¼ććæć¤ć`AdminJwtPayload`ćØ`UserJwtPayload`ćå®ē¾©ććććććčå„åÆč½ćŖć¦ććŖć³`JwtPayload`ć«ēµåćć¾ćć`type`ććććć£ćÆčå„åćØćć¦ę©č½ćććć¤ćć¼ććæć¤ćć«åŗć„ćć¦ććććć£ć«å®å Øć«ć¢ćÆć»ć¹ć§ćć¾ćć
2. åå©ēØåÆč½ćŖčŖčؼććøććÆć®ććć®ćøć§ććŖćÆć¹
ćć¤ćć¼ćę§é ćē°ćŖćč¤ę°ć®čŖčؼć¹ćć¼ć ćććå “åćÆććøć§ććŖćÆć¹ć使ēØćć¦åå©ēØåÆč½ćŖčŖčؼććøććÆćä½ęć§ćć¾ćć
interface BaseJwtPayload {
userId: string;
iat: number;
exp: number;
}
function verifyToken(token: string): T | null {
try {
const decoded = jwt.verify(token, JWT_SECRET) as T;
return decoded;
} catch (error) {
console.error('JWT verification error:', error);
return null;
}
}
const adminToken = verifyToken('admin-token');
if (adminToken) {
console.log('ē®”ēč
ć®ć”ć¼ć«:', adminToken.email);
}
ćć®ä¾ć§ćÆć`BaseJwtPayload`ćę”å¼µćććøć§ććŖććÆå`T`ćåćåć`verifyToken`é¢ę°ćå®ē¾©ćć¾ććććć«ććććć¹ć¦ć®ćć¼ćÆć³ć«å°ćŖććØć`userId`ć`iat`ćććć³`exp`ććććć£ćå«ć¾ćć¦ććććØćäæčؼććŖćććē°ćŖććć¤ćć¼ćę§é ć§ćć¼ćÆć³ćę¤čؼć§ćć¾ćć
ć°ćć¼ćć«ć¢ććŖć±ć¼ć·ć§ć³ć«é¢ććčę ®äŗé
ć°ćć¼ćć«ć¢ććŖć±ć¼ć·ć§ć³ć®čŖčؼć·ć¹ćć ćę§ēÆććå “åćÆć仄äøćčę ®ćć¦ćć ććć
- ćć¼ć«ćŖć¼ć¼ć·ć§ć³ļ¼ćØć©ć¼ć”ćć»ć¼ćøćØć¦ć¼ć¶ć¼ć¤ć³ćæć¼ćć§ć¤ć¹č¦ē“ ćććć¾ćć¾ćŖčØčŖćØå°åć«åććć¦ćć¼ć«ć©ć¤ćŗććć¦ććććØć確čŖćć¾ćć
- ćæć¤ć ć¾ć¼ć³ļ¼ćć¼ćÆć³ć®ęå¹ęéćčØå®ććććę„ä»ćØęå»ćć¦ć¼ć¶ć¼ć«č”Øē¤ŗććććććØććÆććæć¤ć ć¾ć¼ć³ćę£ććå¦ēćć¾ćć
- ćć¼ćæćć©ć¤ćć·ć¼ļ¼GDPRćCCPAćŖć©ć®ćć¼ćæćć©ć¤ćć·ć¼č¦å¶ćéµå®ćć¾ććJWTć«äæåćććåäŗŗćć¼ćæć®éćęå°éć«ęćć¾ćć
- ć¢ćÆć»ć·ććŖćć£ļ¼čŖčؼććć¼ććé害ć®ććć¦ć¼ć¶ć¼ćć¢ćÆć»ć¹ć§ććććć«čØčØćć¾ćć
- ęåēćŖęę§ļ¼ć¦ć¼ć¶ć¼ć¤ć³ćæć¼ćć§ć¤ć¹ćØčŖčؼććć¼ćčØčØćććØććÆćęåēćŖéćć«ę³Øęćć¦ćć ććć
ēµč«
TypeScriptć®åć·ć¹ćć ćę“»ēØććććØć§ćć°ćć¼ćć«ć¢ććŖć±ć¼ć·ć§ć³åćć®å ē¢ć§äæå®åÆč½ćŖJWTčŖčؼć·ć¹ćć ćę§ēÆć§ćć¾ććć¤ć³ćæć¼ćć§ć¼ć¹ć使ēØćććć¤ćć¼ćåć®å®ē¾©ćåä»ćJWTćµć¼ćć¹ć®ä½ęćććć«ć¦ć§ć¢ć使ēØććAPIćØć³ććć¤ć³ćć®äæč·ćććć³RBACć®å®č£ ćÆćć»ćć„ćŖćć£ćØåå®å Øę§ć確äæććććć®éč¦ćŖć¹ćććć§ćććć¼ć«ćŖć¼ć¼ć·ć§ć³ććæć¤ć ć¾ć¼ć³ććć¼ćæćć©ć¤ćć·ć¼ćć¢ćÆć»ć·ććŖćć£ćęåēćŖęę§ćŖć©ć®ć°ćć¼ćć«ć¢ććŖć±ć¼ć·ć§ć³ć«é¢ććčę ®äŗé ćčę ®ććććØć§ćå¤ę§ćŖå½éēćŖč¦č“č ć«ćØć£ć¦å ę¬ēć§ć¦ć¼ć¶ć¼ćć¬ć³ććŖć¼ćŖčŖčؼćØćÆć¹ććŖćØć³ć¹ćä½ęć§ćć¾ććå®å ØćŖćć¼ē®”ēćć¢ć«ć“ćŖćŗć ć®éøęććć¼ćÆć³ć®ęå¹ęéćććć³ćć¼ćÆć³ć®ć¹ćć¬ć¼ćøćå«ććJWTćå¦ēććå “åćÆćåøøć«ć»ćć„ćŖćć£ć®ćć¹ććć©ćÆćć£ć¹ćåŖå ććććØćåæććŖćć§ćć ćććTypeScriptć®åćę“»ēØćć¦ćć°ćć¼ćć«ć¢ććŖć±ć¼ć·ć§ć³åćć®å®å Øć§ć¹ć±ć¼ć©ćć«ć§äæ”é ¼ę§ć®é«ćčŖčؼć·ć¹ćć ćę§ēÆćć¦ćć ććć