# ========================================== # 백엔드 고유 시크릿 (development) # # ⚠️ DB / Redis / CORS / PORT 는 루트 .env.development 에서 docker-compose 가 주입한다. # 여기에 중복 작성하지 말 것 (SSOT: 루트 .env — .claude/rules/env-structure.md). # 이 파일에는 "루트에서 내려주지 않는 값"만 작성한다. # # 사용법: cp .env.development.example .env.development # docker-compose 의 env_file 지시자 때문에 파일은 비어 있어도 존재해야 한다. # ========================================== # JWT 서명 키 — 액세스·리프레시 토큰을 서명한다. 환경마다 다른 값을 쓰고 절대 커밋하지 않는다. # 반드시 **무작위로 만든다.** 사람이 지은 문장·단어 조합·회사명·날짜 등은 쓰지 않는다 # (토큰 하나만 손에 넣으면 오프라인에서 키를 대입해 볼 수 있고, 맞히면 모든 직원의 토큰을 위조할 수 있다). # 만드는 법: openssl rand -base64 48 # (openssl 이 없으면) node -e "console.log(require('crypto').randomBytes(48).toString('base64url'))" # 운영은 32자 이상이 아니면 기동하지 않는다 (src/shared/config/env.validation.ts). JWT_SECRET=change-me-generate-a-long-random-string # 만료 — 액세스 5분~1시간, 리프레시(미사용 만료) 30일 이하이며 액세스보다 길어야 한다 (env 검증). # 세션 절대 만료(로그인 후 30일)는 코드 상수다. JWT_ACCESS_EXPIRES_IN=1h JWT_REFRESH_EXPIRES_IN=14d # 앱 새 메일 알림 (FCM — 앱 1단계, 선택) — Firebase 서비스 계정 키 JSON 파일을 통째로 base64 한 줄로 넣는다. # 비우면 앱 알림만 끈다(기동은 한다 — app-config 의 pushAvailable: false). 실제 키 값은 이 예시 파일에 적지 않고 커밋하지 않는다. # 알림 전용 서비스 계정(역할 "Firebase Cloud Messaging API Admin" 하나)의 키를 개발 · 운영 따로 만든다(하나만 막을 수 있게). # 만드는 법: base64 -w0 key.json # (PowerShell) [Convert]::ToBase64String([IO.File]::ReadAllBytes("key.json")) # 모양이 틀리면 기동하지 않는다 (src/shared/config/env.validation.ts — 어느 칸이 틀렸는지만 알린다). 키가 새면 Google Cloud 콘솔에서 지우고 새 키로. FCM_SERVICE_ACCOUNT_KEY=