← 전체 글로 돌아가기

서버 운영

서버 시간대가 맞지 않을 때 겪는 문제들

서버 시간대를 UTC로 방치하면 cron 스케줄이 틀어지고, 로그 타임스탬프가 9시간씩 어긋난다.

서버를 처음 세팅할 때 시간대 설정을 빠뜨리면 나중에 예상치 못한 곳에서 불편해진다. 특히 cron 잡, 로그 분석, JWT 만료 검증처럼 시간에 의존하는 기능을 다룰 때 잘 드러난다.

현재 서버 시간 확인

timedatectl

Time zone: UTC 또는 Time zone: Asia/Seoul (KST, +0900)처럼 표시된다. date 명령으로도 빠르게 확인할 수 있다.

date
# Mon Jun 23 07:53:00 UTC 2026

KST로 변경하려면 아래처럼 한다.

sudo timedatectl set-timezone Asia/Seoul
timedatectl  # 변경 확인

cron 스케줄이 틀어지는 경우

"매일 오전 9시에 보고서를 생성"하도록 0 9 * * *로 cron을 설정했는데, 서버가 UTC면 실제로는 오후 6시(KST 새벽 3시)에 실행된다. UTC를 기준으로 9시에 해당하는 0 0 * * *로 써야 KST 오전 9시가 된다.

처음부터 0 0 * * * (UTC 자정 = KST 오전 9시)처럼 계산해서 쓰거나, 서버 시간대를 KST로 바꾸거나 둘 중 하나를 선택해야 일관성이 생긴다. 팀이 있다면 UTC 기준으로 맞추는 게 국제 표준이지만, 1인 개발이라면 KST로 맞춰두는 게 직관적이다.

컨테이너 시간대

Docker 컨테이너는 호스트와 별개의 시간대를 가질 수 있다. 기본 이미지(특히 Alpine)는 UTC로 고정된다.

# Dockerfile에서 시간대 설정
RUN apk add --no-cache tzdata && \
    cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
    echo "Asia/Seoul" > /etc/timezone

Debian/Ubuntu 기반 이미지라면:

RUN apt-get install -y tzdata && \
    ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

또는 docker run/docker-compose.yml에서 환경변수로 전달할 수 있다.

environment:
  - TZ=Asia/Seoul

로그 타임스탬프 혼란

앱 로그는 KST로 찍히는데 시스템 로그(journalctl, nginx access log)는 UTC로 남으면 사건을 시간 순으로 재구성하기가 어렵다. journalctl--utc 옵션으로 UTC 기준으로 볼 수 있고, 반대로 현지 시간으로 보려면 아무 옵션도 주지 않으면 된다(시스템 시간대 따라감).

일관성이 중요하다. 모든 서비스가 UTC로 로그를 남기거나, 모두 KST로 남기거나 - 섞이면 장애 분석 때 계속 계산이 필요해진다.