본문 바로가기

개발일지

도커 컨테이너 tz 설정

서버에서 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로 변경하면서 문제를 해결할 수 있었다.