dd/AUTH_GUIDE.md

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. 테스트

  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 업데이트

"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 실행:

  1. D1 > auth-db > Console
  2. 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 사용 (권장)

방법 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일 만료)

프로덕션 권장사항

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