Antigravity CLI 로그인이 반복되는 문제 해결하기

#antigravity-cli

안녕하세요. 최근 Google I/O에서 공개된 Antigravity CLI를 WSL에서 써보다가, 종료 후 다시 들어가면 새로 로그인해야 하는 문제가 있어서 이에 대한 문제 해결 과정을 공유하고자 작성했습니다.

문제 상황#

agy에 한 번 로그인한 뒤 종료하고 다시 실행하면, 매번 로그인 메뉴부터 다시 떴습니다.

Pasted image 20260521113103.png

agy -p "..." --dangerously-skip-permissions 형태로 비대화형 자동화에 쓰려고 한 상황이었는데, 매번 OAuth URL이 떠서 30초 타임아웃 안에 브라우저로 인증을 마쳐야 했습니다. 자동화가 안 되는 상태였습니다.

Pasted image 20260521113031.png

원인 진단#

데스크톱 리눅스에서 OAuth 토큰처럼 영속화가 필요한 시크릿은 보통 Secret Service API(org.freedesktop.secrets)에 저장합니다. 이건 D-Bus로 노출된 표준 인터페이스이고, gnome-keyring이나 KWallet 같은 데몬이 이 이름을 점유해서 실제 저장을 처리합니다.

WSL2는 데스크톱 환경이 없으니 기본적으로 어떤 Secret Service 데몬도 떠 있지 않습니다. 그러면 agy가 토큰을 저장하려고 D-Bus를 호출해도 받아줄 데몬이 없어 실패하고, 토큰은 메모리에만 남았다가 종료 시 사라진다는 가설을 세우고 검증했습니다.

agy가 정말 Secret Service를 쓰는지 확인#

먼저 libsecret을 링크하는지 확인합니다.

ldd $(which agy) | grep -i secret
# (출력 없음)

링크는 안 합니다. 하지만 Node/Rust/Go로 작성된 CLI는 libsecret을 거치지 않고 D-Bus를 직접 호출하는 경우가 많아, 이것만으로는 결론이 안 납니다. D-Bus 트래픽을 직접 봐야 합니다.

busctl --user monitor org.freedesktop.secrets &
agy login

agy login 실행 직후 잡힌 호출 두 개:

Sender=:1.43  Destination=org.freedesktop.secrets
Path=/org/freedesktop/secrets
Interface=org.freedesktop.DBus.Properties  Member=Get
  STRING "org.freedesktop.Secret.Service"
  STRING "Collections"

Sender=:1.43  Destination=org.freedesktop.secrets
Path=/org/freedesktop/secrets
Interface=org.freedesktop.Secret.Service  Member=Unlock
  OBJECT_PATH "/org/freedesktop/secrets/aliases/default"
  • Collections 속성 조회 — 저장된 컬렉션 목록 가져오기
  • default 컬렉션 잠금 해제 시도

이건 Secret Service 명세에 정의된 표준 호출 시퀀스입니다. agy가 토큰을 저장하려고 정확히 키링에 말을 걸고 있는데, WSL에는 org.freedesktop.secrets 이름을 점유한 프로세스가 없어서 호출이 전달되지 못하는 상태였습니다.

busctl --user list | grep secret
# (응답 없음)

해결 방향#

Secret Service API를 구현한 데몬을 띄우면 됩니다. 같은 증상이 보고된 Reddit 스레드의 댓글에서 grimsteel/pass-secret-service를 추천받아 사용했습니다. pass(passwordstore.org)를 백엔드로 쓰는 Secret Service 구현체입니다.

  • 시크릿을 ~/.password-store/secret-service 아래에 GPG 암호화 파일로 저장
  • x86_64-unknown-linux-gnu prebuilt 바이너리 제공 (소스 빌드 불필요)
  • systemd user unit + D-Bus session activation 파일 동봉 (데몬을 상시 띄울 필요 없음)

설치 과정#

사전 확인#

이 해결책이 동작하려면 WSL 측 환경이 갖춰져 있어야 합니다.

# 1. systemd 활성화 확인
cat /etc/wsl.conf
# [boot]
# systemd=true

# 2. systemd --user 동작 확인
systemctl --user is-system-running
# running

# 3. D-Bus session bus 확인
echo $DBUS_SESSION_BUS_ADDRESS
# unix:path=/run/user/1000/bus

WSL2에서 systemd를 켜려면 /etc/wsl.conf[boot]\nsystemd=true를 넣고 wsl --shutdown 후 재시작해야 합니다.

1. pass 설치#

sudo apt-get update
sudo apt-get install -y pass

2. GPG 키 생성#

pass는 GPG 키로 암호화합니다. 키가 없으면 생성합니다.

자동화 목적이라 passphrase 없이 생성했습니다. 디스크 읽기 권한을 가진 사용자라면 토큰을 복호화할 수 있다는 트레이드오프가 있으니, 운영 환경에서는 별도 판단이 필요합니다.

gpg --batch --passphrase '' --quick-generate-key \
  "your-email@example.com" default default never
gpg --list-secret-keys --keyid-format=long
# sec   ed25519/XXXXXXXXXXXXXXXX 2026-05-21 [SC]
# uid                 [ultimate] your-email@example.com

3. pass 초기화#

pass init your-email@example.com
# Password store initialized for your-email@example.com

4. pass-secret-service 바이너리 설치#

작성 시점 기준 최신 릴리스는 v0.7.0입니다. x86_64 바이너리를 받아 ~/.local/bin에 둡니다.

mkdir -p ~/.local/bin
gh release download v0.7.0 \
  --repo grimsteel/pass-secret-service \
  --pattern 'pass-secret-service-x86_64' \
  --output ~/.local/bin/pass-secret-service
chmod +x ~/.local/bin/pass-secret-service

~/.local/bin/pass-secret-service --version
# pass-secret-service v0.7.0

5. systemd user unit & D-Bus activation 설정#

저장소가 제공하는 unit 파일은 바이너리가 /usr/bin/pass-secret-service에 있다고 가정합니다. ~/.local/bin에 설치한 경우 경로를 맞춰서 직접 작성합니다.

~/.config/systemd/user/pass-secret-service.service:

[Unit]
Description=org.freedesktop.secrets agent for pass
PartOf=graphical-session.target

[Service]
Type=dbus
BusName=org.freedesktop.secrets
ExecStart=%h/.local/bin/pass-secret-service

~/.local/share/dbus-1/services/org.freedesktop.secrets.service:

[D-BUS Service]
Name=org.freedesktop.secrets
Exec=/home/<user>/.local/bin/pass-secret-service
SystemdService=pass-secret-service.service

Type=dbus + BusName=org.freedesktop.secrets로 D-Bus activation을 받게 하고, D-Bus 측 서비스 파일은 SystemdService=로 systemd unit에 위임합니다. 이렇게 두면 호출이 들어올 때만 데몬이 뜹니다.

설정 반영:

systemctl --user daemon-reload

검증#

D-Bus activation 동작 확인#

busctl --user list | grep secret
# org.freedesktop.secrets  - -  -  (activatable) -  -  -

(activatable) — 등록은 되어 있지만 아직 안 떠 있는 상태입니다. 첫 호출이 들어오면 자동 기동됩니다.

agy가 처음 호출했던 그 메서드(Get Collections)를 직접 호출해서 응답이 오는지 봅니다.

dbus-send --session --print-reply \
  --dest=org.freedesktop.secrets \
  /org/freedesktop/secrets \
  org.freedesktop.DBus.Properties.Get \
  string:org.freedesktop.Secret.Service \
  string:Collections

응답:

method return time=... sender=:1.50
   variant       array [
         object path "/org/freedesktop/secrets/collection/Default"
      ]

Default 컬렉션이 응답으로 돌아왔습니다. 이전엔 호출만 나가고 응답이 없었던 부분입니다.

서비스 상태 확인:

systemctl --user status pass-secret-service.service
# ● pass-secret-service.service - org.freedesktop.secrets agent for pass
#      Active: active (running)
# pass-secret-service: D-Bus session connection established.
# pass-secret-service: Acquired well-known name: `org.freedesktop.secrets`

agy로 최종 확인#

agy login   # 브라우저로 OAuth 진행
exit
agy         # 재실행 — 로그인 요구 없이 바로 진입

Pasted image 20260521115018.png

limwoohyun01@gmail.com (Google AI Pro)로 로그인된 상태가 그대로 유지되고, agy -p "안녕"agy -p "안녕" --dangerously-skip-permissions 둘 다 인증 화면 없이 바로 응답합니다.

저장된 시크릿은 pass ls로 확인할 수 있습니다.

pass ls
# Password Store
# └── secret-service
#     └── ...

정리#

  • agy는 OAuth 토큰을 Secret Service API(org.freedesktop.secrets)에 저장하려고 한다.
  • WSL2는 기본적으로 이 API를 구현한 데몬이 없어, 호출이 실패하고 토큰이 영속화되지 않는다.
  • pass-secret-service를 systemd user 서비스 + D-Bus activation으로 등록하면 빈자리가 채워지고, agy는 정상적으로 토큰을 디스크에 남길 수 있다.

같은 증상을 다른 CLI에서 만나도 진단 절차는 동일합니다. busctl --user monitor org.freedesktop.secrets로 호출이 가는지 보고, 가는데 응답이 없으면 백엔드 데몬을 띄우면 됩니다.

참고 자료#

댓글