Vercel Edge에서 jwt 사용하기


Vercel에 웹사이트를 배포하면 기본적으로 serverless function을 사용한다. 하지만 serverless function의 경우 내부적으로 AWS Lambda를 사용하기 때문에 트래픽이 적은 경우 cold start 이슈가 발생한다. 이 때 vercel edge function을 활성화하면 cold start 문제를 다소 해결할 수 있다. 하지만 여기서 또 다른 문제가 발생하는데 vercel의 edge 환경은 node 환경이 아니라는 것이다. Vercel edge runtime은 Node API의 일부 기능만을 지원하기 때문에 특정 라이브러리 사용이 불가능하다.

jwt

인증을 위해 많이 사용되는 jwt 라이브러리중 가장 많이 쓰이는 라이브러리는 ~~놀랍게도~~jsonwebtoken인데 이 라이브러리도 edge 런타임에서 실행이 안된다.

이 때 해결법은 상당히 간단한데 Node API에 의존하지 않는 라이브러리를 사용하는 것이다. 사실 vercel에서 이미 예제도 제공하고 있는데 jose라는 패키지를 사용해서 jwt 인증을 사용한다.

기존에 jsonwebtoken 패키지를 jose로 바꾸는 것은 어렵지 않다.

jwt.verify(token, <PASSWORD>);

await jwtVerify(token, new TextEncoder().encode(<PASSWORD>));

로 그리고

jwt.sign({ authorized: true }, <PASSWORD>, { expiresIn: '1d' });

const token = await new SignJWT()
    .setProtectedHeader({ alg: 'HS256' })
    .setExpirationTime('1d')
    .sign(new TextEncoder().encode(<PASSWORD>));

이렇게 바꿔주면 된다.