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