197 lines
4.9 KiB
Markdown
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. 사용자 프로필 관리
|
|
|