
🔐 올바르게 구축하여 인증을 배우세요. Cloudflare Workers를 위한 확장 가능하고 표준을 준수하는 참조 구현체: Hono, Turso, PBKDF2 및 JWT 이중 토큰 세션.
데모 참고: 로그인 엔드포인트는 적응형 PoW(Proof of Work) 챌린지로 보호됩니다. 반복된 실패는 점점 더 높은 작업 증명 난이도를 요구합니다. 캐시 기반 속도 제한이 구현 및 테스트되었지만 현재 라이브 데모에서는 활성화되어 있지 않습니다. 활성화하려면
app.ts에서createCacheClient를 활성화하세요.
Cloudflare Workers용으로 처음부터 구축한 인증 참조 구현입니다. PBKDF2 비밀번호 해싱, JWT 이중 토큰 세션, 상수 시간 비교, 슬라이딩 만료, 그리고 제거 가능한 관찰 가능성 플러그인을 포함하며, Hono, Turso(선택적 Valkey/Redis 캐싱 포함), 그리고 엄격한 TypeScript로 연결됩니다.
모든 설계 결정은 표준을 기반으로 합니다: 자격 증명에 NIST SP 800-63B, 키 유도에 NIST SP 800-132, 검증에 OWASP ASVS, JWT 모범 사례에 RFC 8725를 따릅니다.
제품을 출시하시나요? 대신 Better Auth 를 사용하세요. OAuth, 패스키, MFA, 속도 제한 등을 활성화된 플러그인 생태계와 함께 기본적으로 제공합니다. 이 저장소는 인증이 어떻게 작동하는지 가르쳐주기 위해 존재하며, 프로덕션 라이브러리를 대체하기 위한 것이 아닙니다.
이 프로젝트는 교육적 범위를 벗어나는 기능을 의도적으로 생략합니다. 이 코드를 프로덕션으로 확장하거나(프로덕션 인증 시스템이 필요한지 평가하는 경우) 아래 표는 우선순위 계층별로 격차를 정리합니다.
대부분의 실제 프로젝트에서는 직접 구축하는 대신 Better Auth를 사용하세요.
| 기능 | 중요한 이유 | 표준 / 참조 |
|---|---|---|
| 유출된 비밀번호 확인 | 공개적으로 알려진 유출 데이터에 포함된 비밀번호 사용 방지 | NIST SP 800-63B §5.1.1.2, HIBP API |
이 모든 것은 Better Auth를 사용하는 훌륭한 이유입니다.
.
├── apps/
│ └── cloudflare-workers/ # 예제 Worker + Hono 라우트
├── packages/
│ ├── core/ # 인증 서비스, 미들웨어, 암호화 유틸리티
│ ├── infrastructure/ # DB 클라이언트 + 유틸리티
│ ├── observability/ # 이벤트 발생, 적응형 챌린지, ops API (제거 가능 플러그인)
│ ├── schemas/ # Zod 스키마
│ └── types/ # 공유 TypeScript 타입
├── tools/
│ └── cli/ # plctl — /ops 표면용 Go TUI
└── docs/
├── adr/ # 아키텍처 결정 기록
└── audits/ # 보안 감사
git clone https://github.com/vhscom/private-landing.git
cd private-landing
bun install
bun run dev
끝입니다. 계정, API 키, .env 파일이 필요 없습니다. 개발 서버는 로컬 SQLite 데이터베이스와 생성된 비밀로 시작됩니다. http://localhost:8788을 열어 계정을 등록하고 인증 흐름을 탐색하세요.
Turso 계정이 있나요?
apps/cloudflare-workers/에.dev.vars파일을 넣고(.dev.vars.example참조)bun run dev를 실행하면 자동으로 원격 데이터베이스와 함께 wrangler를 사용합니다. 로컬 서버를 강제로 사용하려면bun run dev:local을 사용하세요.
테스트 및 배포 지침은 CONTRIBUTING.md를 참조하세요.
이 저장소에는 AI 어시스턴트를 위한 컨텍스트를 제공하는 CLAUDE.md 파일이 포함되어 있습니다. Claude Code, Cursor 또는 유사한 AI 기반 개발 도구를 사용할 때:
CLAUDE.md를 읽습니다.docs/adr/의 아키텍처 결정 기록은 설계 선택을 설명합니다.docs/audits/의 보안 감사는 보안 상태를 문서화합니다.코드베이스는 명확한 모듈 경계, 포괄적인 타입, 설명적인 명명 규칙을 통해 AI가 읽을 수 있도록 설계되었습니다.
| 계층 | 기능 |
|---|
| 비밀번호 저장 | 128비트 솔트, 무결성 다이제스트, 버전 추적을 포함한 PBKDF2-SHA384 (password-service.ts) |
| 세션 관리 | 기기 추적, 슬라이딩 만료, 사용자당 최대 3개 세션 제한이 있는 서버 측 세션; Valkey/Redis를 통한 선택적 캐시 기반 세션 (session-service.ts, cached-session-service.ts) |
| 비밀번호 변경 | 현재 비밀번호 재확인, 전체 PBKDF2 재해싱, 모든 세션의 원자적 폐기 (account-service.ts, ADR-004) |
| JWT 이중 토큰 패턴 | 15분 액세스 + 7일 리프레시 토큰, 폐기를 위해 세션에 연결 (token-service.ts) |
| 인증 미들웨어 | 자동 리프레시 흐름, 명시적 HS256 고정, typ 클레임 검증 (require-auth.ts) |
| 보안 쿠키 | HttpOnly, Secure, SameSite=Strict, Path=/ (cookie.ts) |
| 보안 헤더 | HSTS, CSP, CORP/COEP/COOP, Permissions-Policy, 지문 제거 (security.ts) |
| 입력 검증 | NIST 준수 비밀번호 정책(길이만, 복잡성 규칙 없음)을 포함한 Zod 스키마 |
| 속도 제한 | 무차별 대입 및 자격 증명 스터핑 공격에 대한 고정 윈도우 스로틀링: 공개 인증 경로(예: 로그인)에서는 IP 기반, 보호된 작업에서는 사용자 기반; 하드 잠금 없음(NIST 정렬) (ADR-006) |
| 관찰 가능성 플러그인 | 구조화된 보안 이벤트, 적응형 PoW 챌린지, 에이전트 인증된 /ops API — 미들웨어를 통해 연결되며, 하나의 패키지를 삭제하여 제거 가능 (ADR-008) |
| CLI 도구 | /ops 표면을 통해 이벤트 조회, 세션 관리, 에이전트 자격 증명 프로비저닝을 위한 Go TUI (plctl) (tools/cli/) |
| 공격 벡터 테스트 | JWT 변조, 알고리즘 혼동, 타입 혼동, 유니코드 경계 사례, 정보 공개 검사 |
| 기능 | 중요한 이유 | 표준 / 참조 |
|---|
| CSRF 보호 (SameSite 완화 시) | 현재 SameSite=Strict가 CSRF를 방지함; UX를 위해 Lax로 변경하는 경우 명시적 토큰 필요 | OWASP CSRF 치트 시트 |
| 리프레시 토큰 로테이션 | 토큰 도용 탐지 — 교체된 리프레시 토큰이 재사용되면 전체 세션 패밀리 폐기 | RFC 6819 §5.2.2.3 |
JWT의 aud 클레임 | 동일한 비밀을 공유하는 다른 서비스에서 토큰이 수락되는 것을 방지 | RFC 7519 §4.1.3, RFC 8725 §3.9 |
| 인라인 스크립트용 CSP 난스 | 현재 CSP는 'unsafe-inline' 사용; 난스는 인라인 스크립트 XSS 벡터 제거 | MDN CSP script-src |
| 기능 | 중요한 이유 | 표준 / 참조 |
|---|
| TOTP 다중 요소 인증 | 고가치 계정에 두 번째 요소 추가 | RFC 6238, NIST SP 800-63B §5.1.4 |
| WebAuthn / 패스키 | 플랫폼 인증기를 사용한 피싱 방지 인증 | WebAuthn 레벨 2 |
| OAuth / 소셜 로그인 | 마찰 감소, 비밀번호 피로 방지 | RFC 6749 |
| 매직 링크 / OTP | 저위험 흐름을 위한 비밀번호 없는 옵션 | NIST SP 800-63B §5.1.3 |
| 세션 분석 | 기기 추적, 동시 세션 가시성, 이상 탐지 | OWASP 세션 관리 치트 시트 |
| 서명 키 로테이션 | 모든 세션을 무효화하지 않고 주기적 비밀 로테이션 가능 | RFC 7517 (JWK) |
| 기능 | 중요한 이유 | 표준 / 참조 |
|---|
| DPoP / 토큰 바인딩 | 토큰을 클라이언트의 TLS 연결에 바인딩하여 유출 재생 방지 | RFC 9449 (DPoP) |
| 멀티 테넌시 | 테넌트별로 사용자 풀, 비밀, 정책 격리 | 애플리케이션 특정 |
| 지오펜싱 / IP 평판 | 예상치 못한 지역이나 알려진 나쁜 IP에서의 로그인 차단 | OWASP ASVS v5.0 §6.3.5 |
| 적응형 인증 | 위험 신호(기기, 위치, 행동)에 따라 인증 요구 사항 단계적 상향 | NIST SP 800-63B §6 |
| PBKDF2 반복 업그레이드 또는 Argon2id | OWASP는 210,000번의 PBKDF2-SHA512 반복을 권장(Cloudflare는 10만으로 제한); Argon2id는 메모리 하드 | OWASP 비밀번호 저장 치트 시트 |