서버에서 jwt 토큰을 사용하려 했는데, jwt.io에서 정상인 것을 확인해도 이상하게 verify에서 에러가 발생했다. 기존에 쓰던 코드를 썼던 터라 문제가 없을 것이라 생각했는데, 예외처리가 잘 되어 있지 않아 어디가 문제인지 확인하기 힘들었다.
예외처리에서 error를 받아보니 TokenExpiredError: jwt expired 이 에러가 떴다. 하지만 만료시간은 3600s로 환경변수도 정상적으로 받아오는 것을 확인했다. 알고보니 docker 컨테이너의 time-zone 문제였다. redis 이미지를 사용하기 위해 로컬에서 redis, backend의 컨테이너를 compose로 구동중이었는데, 호스트 컴퓨터와 컨테이너 내부의 시간이 달라서 발생하는 만료에러였다.
일단 이렇게 docker-compose.yml 파일을 수정해줬다.
backend:
environment:
DATABASE_URL: ${DATABASE_URL}
REDIS_HOST: ${REDIS_HOST}
REDIS_PORT: ${REDIS_PORT}
JWT_SECRET: ${JWT_SECRET}
JWT_EXPIRES_IN: ${JWT_EXPIRES_IN}
TZ: "Asia/Seoul"
그리고 또 해야하는 것이 backend의 Dockerfile을 수정해주는 것이다. 아래의 인트스럭션을 추가해줬다. 나는 node22-alpine을 사용중인데, alpine 이미지는 경량화된 패키지라 추가로 tz 패키지를 설치하는 것이라고 한다.
RUN apk add tzdata
일단 backend의 time-zone 설정을 올바르게 정의되었다.
하지만 여전히 토큰이 유효하지 않다는 에러를 받아 jwt.io를 확인해보니 만료시간이 고작 3초 후로 설정되어 있는 것이다. 왜 그런가 찾아보니 expiresIn을 3600으로 설정했는데, 그것을 밀리초로 해석한 모양이었다. 이전에 redis의 만료시간을 이런 단위로 설정했던 기억이 있어 당연히 기본단위가 seconds라고 생각한 바람에 일어난 일이었다. 원래 의도했던대로 3600s로 변경하면서 문제를 해결할 수 있었다.
'개발일지' 카테고리의 다른 글
깃허브 이슈 템플릿 작성하기 (1) | 2024.11.07 |
---|---|
[에러] 포트넘버 에러 (0) | 2024.11.03 |
Error: failed to process byte index 6 is out of bounds of `\ude` (0) | 2024.08.23 |
npm cache error (0) | 2024.08.13 |
Error: ER_BAD_DB_ERROR: Unknown database 'db-name' (0) | 2024.08.05 |