From b6badbb464de65ebf0f38b69afcf83710cf5f4ed Mon Sep 17 00:00:00 2001 From: jmj Date: Mon, 15 Jun 2026 21:16:57 +0900 Subject: [PATCH] =?UTF-8?q?fix(infra):=20=EC=95=A1=EC=84=B8=EC=8A=A4=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20=EC=88=98=EB=AA=85=2015=EB=B6=84=E2=86=921?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20(=EB=A9=B4=EC=A0=91=20=EC=A4=91=20?= =?UTF-8?q?=EB=A7=8C=EB=A3=8C=20=ED=8A=95=EA=B9=80=20=EB=B0=A9=EC=A7=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit application.yml 기본 900s(15분)이라 면접 진행 중 토큰이 만료돼 401 → 답변 작성 중 튕기는 문제 발생(서버 로그: AUTH_EXPIRED_TOKEN on /api/sessions/{id}/messages, 세션 시작 3분 만에도 발생). - docker-compose backend env 에 JWT_ACCESS_TTL_SECONDS 매핑 추가 (기존엔 미매핑이라 .env 만으론 컨테이너에 전달 안 됨), 배포 기본 3600s - .env.example / docs/environment.md 동기화 refresh 경로 견고화(근본 수정)는 후속. 우선 만료 자체를 면접 길이 밖으로. Co-Authored-By: Claude Opus 4.8 --- .env.example | 2 ++ docker-compose.yml | 3 +++ docs/environment.md | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 6bde5532..6bee1598 100644 --- a/.env.example +++ b/.env.example @@ -50,6 +50,8 @@ SPRING_PROFILES_ACTIVE=local # JWT/암호화는 base64 32바이트. 운영은 반드시 GitHub Secrets(JWT_SECRET, ENCRYPTION_KEY)로 덮어쓸 것. JWT_SECRET=c3RhY2t1cC1zcHJpbnQxLWxvY2FsLWp3dC1zZWNyZXQtMzItYnl0ZXMtbG9uZw== ENCRYPTION_KEY=c3RhY2t1cC1zcHJpbnQxLWVuY3J5cHRpb24ta2V5QUI= +# 액세스 토큰 수명(초). 기본 3600(1시간) — 면접 진행 중 토큰 만료로 튕기는 문제 방지. +JWT_ACCESS_TTL_SECONDS=3600 # AI 서버와 공유. 운영은 GitHub Secrets(CORE_INTERNAL_API_KEY)로 덮어쓸 것. CORE_INTERNAL_API_KEY=local-development-internal-api-key # GitHub OAuth (운영은 GitHub Secrets(GH_OAUTH_CLIENT_ID/SECRET)로 덮어쓸 것) diff --git a/docker-compose.yml b/docker-compose.yml index 749b379e..7f3ce5e7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -169,6 +169,9 @@ services: # 비밀값은 .env 또는 GitHub Secrets 로 주입. 값이 비면 application-local.yml 의 dev default 적용. JWT_SECRET: ${JWT_SECRET:-} ENCRYPTION_KEY: ${ENCRYPTION_KEY:-} + # 액세스 토큰 수명. application.yml 기본 900s(15분)은 면접 진행 중 만료로 이어져 + # 배포 기본을 3600s(1시간)로 상향. 필요 시 .env(JWT_ACCESS_TTL_SECONDS)로 override. + JWT_ACCESS_TTL_SECONDS: ${JWT_ACCESS_TTL_SECONDS:-3600} CORE_INTERNAL_API_KEY: ${CORE_INTERNAL_API_KEY:-local-development-internal-api-key} GITHUB_OAUTH_CLIENT_ID: ${GITHUB_OAUTH_CLIENT_ID:-} GITHUB_OAUTH_CLIENT_SECRET: ${GITHUB_OAUTH_CLIENT_SECRET:-} diff --git a/docs/environment.md b/docs/environment.md index c47932f8..58cf672d 100644 --- a/docs/environment.md +++ b/docs/environment.md @@ -69,7 +69,7 @@ SERVER_PORT=8080 # ===== Auth ===== JWT_SECRET= # base64-encoded 32+ bytes (필수, default 없음) -JWT_ACCESS_TTL_SECONDS=900 # 15min +JWT_ACCESS_TTL_SECONDS=3600 # 1h (배포 기본; app.yml fallback 900). 면접 중 토큰 만료 방지용 상향 JWT_REFRESH_TTL_SECONDS=1209600 # 14d ENCRYPTION_KEY= # AES-256 key, base64 32 bytes (필수)