Google Cloud의 Compute Engine (이하 GCE) 기반 서버에서 갑자기 Google Login이 제대로 되지 않는 문제가 발생했습니다. 서버에서 반환하는 오류 코드는 403 token is invalid 이었습니다. 코드에 변경점도 없었고, 다른 GCE 기반의 개발 서버에서는 정상적으로 작동하기 떄문에 처음에는 원인을 파악하기 어려웠습니다. 짐작이 가는 원인은 직전에 서버를 한 번 재부팅 했던 것 뿐이었습니다.

서버의 로그를 확인하니 아래와 같은 오류가 발생하고 있었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Traceback (most recent call last):
  File "/app/core/auth_utils.py", line 20, in verify_google_token
    id_info = id_token.verify_oauth2_token(token, requests.Request())
  File "/usr/local/lib/python3.9/site-packages/google/oauth2/id_token.py", line 178, in verify_oauth2_token
    idinfo = verify_token(
  File "/usr/local/lib/python3.9/site-packages/google/oauth2/id_token.py", line 150, in verify_token
    return jwt.decode(
  File "/usr/local/lib/python3.9/site-packages/google/auth/jwt.py", line 302, in decode
    _verify_iat_and_exp(payload, clock_skew_in_seconds)
  File "/usr/local/lib/python3.9/site-packages/google/auth/jwt.py", line 216, in _verify_iat_and_exp
    raise exceptions.InvalidValue(
google.auth.exceptions.InvalidValue: Token used too early, 1742968216 < 1742968218. Check that your computer's clock is set correctly.

Token used too early, 1742968216 < 1742968218. Check that your computer's clock is set correctly.

서버의 시간이 인증 서버의 시간보다 더 빨라서 발생한 문제였습니다. 클라우드 기반의 서비스라 발생할 것이라고 생각해 본적 없는 문제여서 당황했습니다. 아래 명령어로 서버의 시간을 확인했습니다. timedatectl는 리눅스 서버의 시스템 시간과 관련 설정을 확인하는 명령어입니다.

1
timedatectl status

위와 같이 System clock synchronized가 no로 설정되어있는 것을 확인할 수 있었습니다. 해당 옵션은 yes로 설정해 놓으면 자동으로 시간을 동기화해줍니다. 아래 명령어로 자동 시간 동기화를 활성화하려고 시도했습니다. Devian 기반 서버이기 때문에 systemd-timesyncd를 호출했습니다.

1
systemctl status systemd-timesyncd

하지만 chronyd was not met이라는 메세지와 함께 실패하였습니다.

1
2
3
4
5
6
7
8
9
systemctl status systemd-timesyncd
● systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
  Drop-In: /usr/lib/systemd/system/systemd-timesyncd.service.d
           └─disable-with-time-daemon.conf
   Active: inactive (dead)
Condition: start condition failed at Wed 2025-03-26 05:57:32 UTC; 6s ago
           └─ ConditionFileIsExecutable=!/usr/sbin/chronyd was not met
     Docs: man:systemd-timesyncd.service(8)

chronyd가 이미 깔려있었기 떄문에 systemd-timesyncd를 사용할 수 없는 것이었습니다. GCE이기 떄문에 이미 chronyd가 깔려있는 것으로 추측됩니다. 그래서 아래 명령어로 chronyd를 활성화해서 시간 동기화를 하려고 시도했습니다.

1
sudo systemctl enable chronyd --now

하지만 Failed to enable unit: Too many levels of symbolic links 메세지와 함께 실패했습니다. 그래서 아래 명령어로 현재 실행중인지를 먼저 확인하고자 했습니다.

1
chronyc tracking

하지만 506 Cannot talk to daemon 메세지와 함께 실패했습니다. chronyd가 실행 중이 아니라서 실패했다는 메세지였습니다. chronyd가 켜져 있지 않고, 오류로 인해 켤 수 있는 방법도 없으므로 제가 선택할 수 있는 방법은 chronyd를 삭제했다가 재설치해보는 방법 뿐이었습니다.

1
2
sudo apt purge chrony -y
sudo apt install chrony -y

그 이후에 chronyc tracking 명령어를 실행하자 아래와 같이 정상적으로 작동하고 있는 것을 확인할 수 있었습니다.

1
chronyc tracking

timedatectl status 명령어로 확인했을 때도 System clock synchronized가 yes로 표시되고 있는 것을 확인할 수 있었습니다.

1
timedatectl status

시스템 시간이 정상적으로 동기화 되자 구글 로그인도 정상적으로 잘 작동하는 것을 확인할 수 있었습니다.