feat: 환경변수 단일 진입점 추가
Co-Authored-By: Claude Opus 5
@11eb46fd9085107c809ce1c58d18291be8f1246f
+++ lib/env.ts
... | ... | @@ -0,0 +1,45 @@ |
| 1 | +import 'server-only' | |
| 2 | + | |
| 3 | +/** | |
| 4 | + * 환경변수 검증·export 단일 진입점. | |
| 5 | + * | |
| 6 | + * 값은 실제로 필요해지는 시점(함수 호출 시)에만 읽고 검증한다 — 모듈 최상단에서 즉시 검증하면 | |
| 7 | + * `force-dynamic` 라우트라도 `next build`의 페이지 데이터 수집 단계에서 이 모듈이 먼저 로드되어 | |
| 8 | + * 운영 배포 전 로컬 빌드가 SESSION_SECRET 미설정만으로 실패할 수 있기 때문이다. | |
| 9 | + * 대신 각 접근자 함수 자체가 "호출 시점" fail-fast를 보장한다 — 기본값 폴백은 없다. | |
| 10 | + */ | |
| 11 | + | |
| 12 | +function readRequiredEnv(key: string): string { | |
| 13 | + const value = process.env[key]; | |
| 14 | + if (!value) { | |
| 15 | + throw new Error( | |
| 16 | + `환경변수 ${key}가 설정되지 않았습니다. 배포 환경에 값을 주입하세요.` | |
| 17 | + ); | |
| 18 | + } | |
| 19 | + return value; | |
| 20 | +} | |
| 21 | + | |
| 22 | +/** 세션 토큰 서명에 사용하는 HMAC 시크릿. 누락 시 즉시 throw(fail-fast). */ | |
| 23 | +export function getSessionSecret(): string { | |
| 24 | + return readRequiredEnv('SESSION_SECRET'); | |
| 25 | +} | |
| 26 | + | |
| 27 | +export type MockAdminCredentials = { | |
| 28 | + loginId: string; | |
| 29 | + password: string; | |
| 30 | +}; | |
| 31 | + | |
| 32 | +/** | |
| 33 | + * mock 관리자 시드 계정. 운영 환경(.env.production)에는 키를 두지 않아 | |
| 34 | + * 누락 시 null을 반환 — mock 로그인이 항상 실패하도록(fail-closed) 한다. | |
| 35 | + */ | |
| 36 | +export function getMockAdminCredentials(): MockAdminCredentials | null { | |
| 37 | + const loginId = process.env.MOCK_ADMIN_LOGIN_ID; | |
| 38 | + const password = process.env.MOCK_ADMIN_PASSWORD; | |
| 39 | + | |
| 40 | + if (!loginId || !password) { | |
| 41 | + return null; | |
| 42 | + } | |
| 43 | + | |
| 44 | + return { loginId, password }; | |
| 45 | +} |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?