JWT verification error: The edge runtime does not support Node.js 'crypto' module.
원인: 미들웨어는 Node.js 런타임 기능을 사용하지만, Edge 런타임은 Node.js 모듈을 지원하지 않는다.
- 토큰 검증
jwt.verify(token, <PASSWORD>);
- 토큰 발행
jwt.sign(payload, secretOrPrivateKey, [options, callback]) jwt.sign({ email: test@test.com }, process.env.JWT_SECRET_KEY, {algorythm: "HS256", expiresIn: '1h'})
- 토큰 검증
await jwtVerify(<TOKEN>, new TextEncoder().encode(<PASSWORD>)); ex) await jwtVerify(token, new TextEncoder().encode(process.env.JWT_SECRET_KEY));
- 토큰 발행
await new SignJWT(<PAYLOAD>) .setProtectedHeader({ alg: <ALGORITHM> }) .setIssuedAt() .setIssuer(<issuer>) .setAudience(<audience>) .setExpirationTime(<expirationTime>) .sign(new TextEncoder().encode(<SECRTE_KEY>));
예시)
await new SignJWT({email: test@test.com}) .setProtectedHeader({ alg: algorithm, typ: "JWT" }) .setIssuedAt() .setIssuer("issuer") .setAudience("user") .setExpirationTime("1h") .sign(new TextEncoder().encode(process.env.JWT_SECRET_KEY));
if (err.code === 'ERR_JWT_EXPIRED') { // 토큰 만료 로직 }
if (err instanceof jose.errors.JWTExpired) { // 토큰 만료 로직 }
예시
try { const decoded = await jwtVerify(token, new TextEncoder().encode(secret)); return { ok: true, data: decoded, msg: "토큰 검증 완료", }; } catch (error: any) { return { ok: false, data: "", msg: error.code, }; }
토큰 검증 결과 값 예시
- Access Token 만료
{ code: "ERR_JWT_EXPIRED", name: "JWTExpired", claim: "exp", reason: "check_failed" }
- Access Token 성공
payload: { ...payload, // ex) {email: test@test.com}, iat: iat 값, iss: iss 값, aud: aud 값, exp: exp 값, }
https://github.com/panva/jose/blob/main/docs/classes/util_errors.JWTExpired.md