NEXTjs (jose)

👀·2024년 5월 27일
0

next.js에서 jsonwebtoken 에러

  • JWT verification error: The edge runtime does not support Node.js 'crypto' module.

  • 원인: 미들웨어는 Node.js 런타임 기능을 사용하지만, Edge 런타임은 Node.js 모듈을 지원하지 않는다.

토큰 발행 및 검증

jsonwebtoken 예시

  • 토큰 검증
	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'}) 

jose 예시

  • 토큰 검증
	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));

토큰 결과 값

Token 만료

  1. if (err.code === 'ERR_JWT_EXPIRED') {
    	// 토큰 만료 로직
    }
  1. 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://cloudless.blog/post/Vercel%20Edge%EC%97%90%EC%84%9C%20jwt%20%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

https://github.com/panva/jose/blob/main/docs/classes/util_errors.JWTExpired.md

0개의 댓글