# 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. 사용자 프로필 관리