306 lines
6.7 KiB
Markdown
306 lines
6.7 KiB
Markdown
|
|
# API Key 관리 가이드
|
|||
|
|
|
|||
|
|
## 📋 개요
|
|||
|
|
|
|||
|
|
PHP 백엔드에서 발급하는 API Key의 안전한 관리 및 주기적 갱신 대응 방법
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔑 현재 API Key 정보
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
개발용 API Key:
|
|||
|
|
키 값: 42Jfwc6EaRQ04GNRmLR5kzJp5UudSOzGGqjmdk1a
|
|||
|
|
발급일: 2025-11-07
|
|||
|
|
용도: 개발 환경 고정 키
|
|||
|
|
갱신: 주기적으로 변동 가능
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔐 보안 원칙
|
|||
|
|
|
|||
|
|
### ✅ DO (반드시 해야 할 것)
|
|||
|
|
- `.env.local`에만 실제 키 저장
|
|||
|
|
- 서버 사이드 코드에서만 사용
|
|||
|
|
- Git에 절대 커밋 금지
|
|||
|
|
- 팀 공유 문서로 키 관리
|
|||
|
|
|
|||
|
|
### ❌ DON'T (절대 하지 말 것)
|
|||
|
|
- 하드코딩 금지
|
|||
|
|
- `NEXT_PUBLIC_` 접두사 사용 금지
|
|||
|
|
- 브라우저 코드에서 사용 금지
|
|||
|
|
- 공개 저장소에 업로드 금지
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📁 파일 구성
|
|||
|
|
|
|||
|
|
### .env.local (실제 키 - Git 제외)
|
|||
|
|
```env
|
|||
|
|
# API Key (서버 사이드 전용 - 절대 공개 금지!)
|
|||
|
|
# 개발용 고정 키 (주기적 갱신 예정)
|
|||
|
|
# 발급일: 2025-11-07
|
|||
|
|
# 갱신 필요 시: PHP 백엔드 팀에 새 키 요청
|
|||
|
|
API_KEY=42Jfwc6EaRQ04GNRmLR5kzJp5UudSOzGGqjmdk1a
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### .env.example (템플릿 - Git 커밋 OK)
|
|||
|
|
```env
|
|||
|
|
# API Key (⚠️ 서버 사이드 전용 - 절대 공개 금지!)
|
|||
|
|
# 개발팀 공유: 팀 내부 문서에서 키 값 확인
|
|||
|
|
# 주기적 갱신: PHP 백엔드 팀에서 새 키 발급 시 업데이트 필요
|
|||
|
|
API_KEY=your-secret-api-key-here
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### .gitignore 확인
|
|||
|
|
```bash
|
|||
|
|
# 라인 100-101에 이미 포함됨
|
|||
|
|
.env.local
|
|||
|
|
.env*.local
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔄 API Key 갱신 프로세스
|
|||
|
|
|
|||
|
|
### 1️⃣ PHP 팀에서 새 키 발급
|
|||
|
|
```
|
|||
|
|
PHP 백엔드 팀 → 새 API Key 발급
|
|||
|
|
↓
|
|||
|
|
팀 공유 문서 업데이트
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2️⃣ 로컬 개발 환경 업데이트
|
|||
|
|
```bash
|
|||
|
|
# .env.local 파일 열기
|
|||
|
|
vi .env.local
|
|||
|
|
|
|||
|
|
# 또는
|
|||
|
|
code .env.local
|
|||
|
|
|
|||
|
|
# API_KEY 값만 변경
|
|||
|
|
API_KEY=새로운키값여기에입력
|
|||
|
|
|
|||
|
|
# 개발 서버 재시작
|
|||
|
|
npm run dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3️⃣ 프로덕션 환경 업데이트
|
|||
|
|
|
|||
|
|
#### Vercel 배포
|
|||
|
|
```bash
|
|||
|
|
# CLI로 업데이트
|
|||
|
|
vercel env add API_KEY production
|
|||
|
|
|
|||
|
|
# 또는 대시보드에서
|
|||
|
|
# Settings → Environment Variables → API_KEY 편집
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### AWS/기타 환경
|
|||
|
|
```bash
|
|||
|
|
# 환경 변수 업데이트
|
|||
|
|
export API_KEY=새로운키값
|
|||
|
|
|
|||
|
|
# 또는 배포 설정에서 환경 변수 수정
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4️⃣ 검증
|
|||
|
|
```bash
|
|||
|
|
# 개발 서버 시작 시 자동으로 검증됨
|
|||
|
|
npm run dev
|
|||
|
|
|
|||
|
|
# 콘솔 출력 확인:
|
|||
|
|
# 🔐 API Key Configuration:
|
|||
|
|
# ├─ Configured: ✅
|
|||
|
|
# ├─ Valid Format: ✅
|
|||
|
|
# ├─ Masked Key: 42Jf********************dk1a
|
|||
|
|
# └─ Length: 48 chars
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🛠️ API Key 검증 유틸리티
|
|||
|
|
|
|||
|
|
### 자동 검증 기능
|
|||
|
|
```typescript
|
|||
|
|
// lib/api/auth/api-key-validator.ts
|
|||
|
|
import { apiKeyValidator } from '@/lib/api/auth/api-key-validator';
|
|||
|
|
|
|||
|
|
// 개발 서버 시작 시 자동 실행
|
|||
|
|
console.log(apiKeyValidator.getDebugInfo());
|
|||
|
|
|
|||
|
|
// 출력 예시:
|
|||
|
|
// API Key Status:
|
|||
|
|
// ├─ Configured: ✅
|
|||
|
|
// ├─ Valid Format: ✅
|
|||
|
|
// ├─ Masked Key: 42Jf********************dk1a
|
|||
|
|
// └─ Length: 48 chars
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 수동 검증
|
|||
|
|
```typescript
|
|||
|
|
import { apiKeyValidator } from '@/lib/api/auth/api-key-validator';
|
|||
|
|
|
|||
|
|
// API Key 존재 확인
|
|||
|
|
if (!apiKeyValidator.isConfigured()) {
|
|||
|
|
console.error('API Key not configured!');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 형식 검증
|
|||
|
|
if (!apiKeyValidator.isValid()) {
|
|||
|
|
console.error('Invalid API Key format!');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 디버그 정보 출력
|
|||
|
|
console.log(apiKeyValidator.getDebugInfo());
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 사용 예시
|
|||
|
|
|
|||
|
|
### 서버 사이드 (Next.js API Route)
|
|||
|
|
```typescript
|
|||
|
|
// app/api/sync/route.ts
|
|||
|
|
import { createApiKeyClient } from '@/lib/api/auth/api-key-client';
|
|||
|
|
|
|||
|
|
export async function GET() {
|
|||
|
|
try {
|
|||
|
|
// 환경 변수에서 자동으로 키를 가져옴
|
|||
|
|
const client = createApiKeyClient();
|
|||
|
|
|
|||
|
|
const data = await client.fetchData('/api/external-data');
|
|||
|
|
|
|||
|
|
return Response.json({ success: true, data });
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('API request failed:', error);
|
|||
|
|
return Response.json(
|
|||
|
|
{ error: 'Failed to fetch data' },
|
|||
|
|
{ status: 500 }
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 백그라운드 스크립트
|
|||
|
|
```typescript
|
|||
|
|
// scripts/sync-data.ts
|
|||
|
|
import { createApiKeyClient } from '@/lib/api/auth/api-key-client';
|
|||
|
|
import { apiKeyValidator } from '@/lib/api/auth/api-key-validator';
|
|||
|
|
|
|||
|
|
async function syncData() {
|
|||
|
|
// 1. 환경 변수 확인
|
|||
|
|
console.log(apiKeyValidator.getDebugInfo());
|
|||
|
|
|
|||
|
|
if (!apiKeyValidator.isValid()) {
|
|||
|
|
throw new Error('Invalid API Key configuration');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 2. API 요청
|
|||
|
|
const client = createApiKeyClient();
|
|||
|
|
const data = await client.fetchData('/api/sync-endpoint');
|
|||
|
|
|
|||
|
|
console.log('Sync completed:', data);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
syncData().catch(console.error);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⚠️ 에러 처리
|
|||
|
|
|
|||
|
|
### API Key 미설정
|
|||
|
|
```
|
|||
|
|
❌ API_KEY is not configured!
|
|||
|
|
📝 Please check:
|
|||
|
|
1. .env.local file exists
|
|||
|
|
2. API_KEY is set correctly
|
|||
|
|
3. Restart development server (npm run dev)
|
|||
|
|
|
|||
|
|
💡 Contact backend team if you need a new API key.
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**해결 방법:**
|
|||
|
|
1. `.env.local` 파일 생성 확인
|
|||
|
|
2. `API_KEY=실제키값` 입력
|
|||
|
|
3. `npm run dev` 재시작
|
|||
|
|
|
|||
|
|
### API Key 형식 오류
|
|||
|
|
```
|
|||
|
|
❌ Invalid API Key format!
|
|||
|
|
- Minimum 32 characters required
|
|||
|
|
- Only alphanumeric characters allowed
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**해결 방법:**
|
|||
|
|
1. PHP 팀에서 발급받은 키 확인
|
|||
|
|
2. 복사 시 공백/줄바꿈 없는지 확인
|
|||
|
|
3. 정확한 키 값 재입력
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 만료 경고 (선택사항)
|
|||
|
|
|
|||
|
|
### 만료 체크 기능
|
|||
|
|
```typescript
|
|||
|
|
// lib/api/auth/key-expiry-check.ts
|
|||
|
|
import { apiKeyValidator } from './api-key-validator';
|
|||
|
|
|
|||
|
|
// API Key 발급일
|
|||
|
|
const issuedDate = new Date('2025-11-07');
|
|||
|
|
|
|||
|
|
// 90일 유효기간으로 체크
|
|||
|
|
const status = apiKeyValidator.checkExpiry(issuedDate, 90);
|
|||
|
|
|
|||
|
|
console.log(status.message);
|
|||
|
|
// ✅ API Key valid (75 days left)
|
|||
|
|
// ⚠️ API Key expiring in 10 days
|
|||
|
|
// 🔴 API Key expired! Contact backend team.
|
|||
|
|
|
|||
|
|
if (status.isExpiring) {
|
|||
|
|
console.warn('⚠️ Please contact backend team for new API key!');
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📚 체크리스트
|
|||
|
|
|
|||
|
|
### 초기 설정
|
|||
|
|
- [ ] `.env.local` 파일 생성
|
|||
|
|
- [ ] `API_KEY` 값 입력
|
|||
|
|
- [ ] `.gitignore`에 `.env.local` 포함 확인
|
|||
|
|
- [ ] 개발 서버 시작 후 검증 확인
|
|||
|
|
|
|||
|
|
### 키 갱신 시
|
|||
|
|
- [ ] PHP 팀에서 새 키 수령
|
|||
|
|
- [ ] `.env.local` 업데이트
|
|||
|
|
- [ ] 로컬 개발 서버 재시작
|
|||
|
|
- [ ] 검증 로그 확인
|
|||
|
|
- [ ] 프로덕션 환경 변수 업데이트
|
|||
|
|
|
|||
|
|
### 보안 점검
|
|||
|
|
- [ ] Git에 `.env.local` 커밋 안됨
|
|||
|
|
- [ ] 브라우저 코드에서 사용 안함
|
|||
|
|
- [ ] `NEXT_PUBLIC_` 접두사 없음
|
|||
|
|
- [ ] 팀 공유 문서에 키 기록
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 다음 단계
|
|||
|
|
|
|||
|
|
API Key 설정 완료 후:
|
|||
|
|
1. `createApiKeyClient()` 사용하여 API 요청
|
|||
|
|
2. 서버 사이드 코드에서만 호출
|
|||
|
|
3. 에러 발생 시 검증 로그 확인
|
|||
|
|
4. 주기적으로 만료 시간 체크 (선택)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📞 문의
|
|||
|
|
|
|||
|
|
- **API Key 발급**: PHP 백엔드 팀
|
|||
|
|
- **기술 지원**: 프론트엔드 팀
|
|||
|
|
- **보안 문제**: DevOps/보안 팀
|