dd/AUTH_GUIDE.md

197 lines
4.9 KiB
Markdown

# JWT 인증 설정 가이드
## 구현된 기능
- ✅ JWT 기반 회원가입 및 로그인
- ✅ D1 데이터베이스를 사용한 사용자 정보 저장
- ✅ 로컬 개발 환경에서 SQLite 사용
- ✅ 프로덕션 환경에서 D1 사용
- ✅ 비밀번호 해싱 (SHA-256)
- ✅ HTTP-only 쿠키를 통한 JWT 토큰 관리
- ✅ Cloudflare Workers 환경에서 작동
## 로컬 개발 환경 설정
### 1. 데이터베이스 스키마 초기화
```bash
# 로컬 SQLite DB에 스키마 적용
pnpm wrangler d1 execute local-db --local --file=schema.sql
```
### 2. 로컬 개발 서버 실행
```bash
# Cloudflare Workers 환경으로 실행 (권장)
pnpm cf:dev
# 또는 Vite 개발 서버 (D1이 작동하지 않을 수 있음)
pnpm dev
```
### 3. 테스트
1. http://localhost:8787/register 에서 회원가입
2. http://localhost:8787/login 에서 로그인
3. http://localhost:8787 메인 페이지에서 로그인 상태 확인
## 프로덕션 배포
### 1. D1 데이터베이스 생성 (Cloudflare Dashboard 사용)
SSL 인증서 문제로 wrangler CLI가 작동하지 않는 경우, Cloudflare Dashboard를 사용하세요:
1. https://dash.cloudflare.com 로그인
2. Workers & Pages > D1 로 이동
3. "Create database" 클릭
4. 데이터베이스 이름: `auth-db`
5. 생성된 Database ID를 복사
### 2. wrangler.jsonc 업데이트
```jsonc
"d1_databases": [
{
"binding": "DB",
"database_name": "auth-db",
"database_id": "실제-database-id-입력", // Dashboard에서 복사한 ID
"preview_database_id": "local-db"
}
]
```
### 3. 프로덕션 데이터베이스에 스키마 적용
Dashboard Console을 사용하거나 다음 명령어 실행:
```bash
# API 토큰 방식으로 인증 (SSL 문제 우회)
pnpm wrangler d1 execute auth-db --remote --file=schema.sql
```
또는 Dashboard에서 직접 SQL 실행:
1. D1 > auth-db > Console
2. schema.sql의 내용을 복사하여 붙여넣기
### 4. JWT Secret 설정 (선택사항, 권장)
보안을 위해 JWT Secret을 환경변수로 설정:
```bash
# Wrangler Secret 생성
pnpm wrangler secret put JWT_SECRET
# 프롬프트에서 안전한 랜덤 문자열 입력
# 예: openssl rand -base64 32
```
그리고 `src/lib/server/auth.ts`를 수정하여 secret 사용:
```typescript
// Cloudflare Workers에서 환경변수 사용
const JWT_SECRET = new TextEncoder().encode(
env.JWT_SECRET || 'fallback-secret'
);
```
### 5. 배포
```bash
pnpm deploy
```
## SSL 인증서 문제 해결
만약 wrangler 명령어 실행 시 "CA certificate key too weak" 오류가 발생하면:
### 방법 1: Cloudflare Dashboard 사용 (권장)
- 모든 D1 작업을 Dashboard에서 수행
- https://dash.cloudflare.com
### 방법 2: Node.js 업그레이드
```bash
# Node.js 최신 LTS 버전으로 업그레이드
# https://nodejs.org/
```
### 방법 3: 임시 우회 (비권장, 개발용만)
```bash
# Windows
set NODE_TLS_REJECT_UNAUTHORIZED=0 && pnpm wrangler d1 ...
# Linux/Mac
NODE_TLS_REJECT_UNAUTHORIZED=0 pnpm wrangler d1 ...
```
## API 엔드포인트
- `POST /register` - 회원가입
- `POST /login` - 로그인
- `POST /api/logout` - 로그아웃
- `GET /` - 메인 페이지 (로그인 상태 표시)
## 데이터베이스 스키마
```sql
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
nickname TEXT NOT NULL,
created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
);
```
## 보안 고려사항
### 현재 구현
- ✅ 비밀번호 해싱 (SHA-256)
- ✅ HTTP-only 쿠키
- ✅ Secure 쿠키 (HTTPS)
- ✅ SameSite: Lax
- ✅ JWT 토큰 (7일 만료)
### 프로덕션 권장사항
1. **더 강력한 해싱 알고리즘 사용**: bcrypt 또는 argon2 (현재는 SHA-256 사용)
2. **JWT Secret 환경변수화**: Wrangler Secrets 사용
3. **비밀번호 정책 강화**: 최소 8자, 특수문자 포함 등
4. **Rate Limiting**: 로그인 시도 제한
5. **CSRF 보호**: SvelteKit의 기본 CSRF 보호 활용
## 문제 해결
### D1 연결 실패
```
Error: Database not available
```
해결: `pnpm cf:dev`로 실행하여 Cloudflare Workers 환경 사용
### JWT 토큰 검증 실패
- 쿠키가 제대로 설정되었는지 확인
- HTTPS 사용 확인 (프로덕션)
- JWT_SECRET이 일치하는지 확인
### 회원가입 실패
- 데이터베이스 스키마가 적용되었는지 확인
- 이메일 중복 확인
- 비밀번호 길이 확인 (최소 6자)
## 라이브러리
- `jose` - JWT 생성 및 검증 (Cloudflare Workers 호환)
- `drizzle-orm` - 타입 안전한 ORM
- `drizzle-kit` - 마이그레이션 도구
- `@sveltejs/kit` - SvelteKit 프레임워크
- D1 Database - Cloudflare의 SQLite 데이터베이스
> 📘 **Drizzle ORM 상세 가이드**: `DRIZZLE_GUIDE.md` 파일을 참조하세요.
## 다음 단계
추가 기능 구현 시:
1. 이메일 인증
2. 비밀번호 재설정
3. OAuth 로그인 (Google, GitHub 등)
4. 2FA (Two-Factor Authentication)
5. 사용자 프로필 관리