이메일 로그인
이메일과 비밀번호 로그인, 매직 링크를 설정합니다. 기본 로그인 화면이 포함되어 있습니다.
워커가 env.auth를 처음 호출하면 앱에 로그인·가입 화면이 생깁니다. 직접 만들 필요가 없습니다.
| 경로 | 화면 |
|---|---|
/__runlot/auth/sign-in | 로그인 |
/__runlot/auth/sign-up | 가입 |
/__runlot/auth/forgot | 비밀번호 찾기 |
/__runlot/auth/reset | 비밀번호 재설정 |
/__runlot/auth/signed-out | 로그아웃됨 |
워커는 /__runlot/auth로 시작하지 않는 요청만 받으며, 이전과 완전히 동일하게 처리합니다.
자체 로그인 화면 사용
기본 화면 대신 직접 만든 양식을 사용하려면 다음 경로로 POST 요청을 보내세요.
await fetch("/__runlot/auth/sign-up/password", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ email, password }),
});
await fetch("/__runlot/auth/sign-in/password", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ email, password }),
});브라우저에서 전송되는 POST 요청에는 동일한 호스트를 가리키는 Origin 헤더(또는 Origin이 없는 경우 Referer)가 포함되어야 합니다. 둘 다 없으면 요청이 거부됩니다.
매직 링크
비밀번호 대신 이메일로 로그인 링크를 보냅니다.
await fetch("/__runlot/auth/sign-in/email", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ email }),
});사용자가 받은 링크를 열면 즉시 세션이 생성됩니다.
가입이 열려 있는 동안에는 계정이 없는 이메일에도 링크가 전송됩니다. 링크를 열면 이메일이 이미 인증된 상태로 계정이 생성됩니다. 가입이 닫혀 있으면 알 수 없는 이메일에는 아무것도 전송되지 않습니다. 어느 경우든 응답이 같으므로, 요청만으로는 계정이 존재하는지 알 수 없습니다.
비밀번호 규칙
- 최소 8바이트, 최대 256바이트
- argon2id로 해시됩니다(메모리 19 MiB, 2회 반복)
- 평문 비밀번호는 저장되지 않습니다
로그인 시도 제한
동일한 이메일 주소에서 15분 동안 로그인 실패가 10회 발생하거나 동일한 IP 주소에서 15분 동안 로그인 실패가 30회 발생하면 잠시 동안 요청이 차단됩니다. 카운터는 노드 메모리에 저장되므로 프로세스가 재시작되면 초기화됩니다.
설정
runlot auth set allow-signup off # Disable new sign-ups (default: on)
runlot auth set require-verified on # Block login until the email is verified (default: off)
runlot auth set session-days 7 # Session lifetime (default: 30 days)
runlot auth set brand-name "My App"
runlot auth set brand-color "#0f6f8f"
runlot auth set brand-logo https://example.com/logo.svg브랜딩 설정은 기본 로그인 화면에 적용됩니다.
이메일 전송 방식
기본 개발 환경에서는 로그인 링크가 이메일로 전송되는 대신 프로젝트 로그에 기록됩니다. runlot logs로 확인할 수 있습니다. 실제 메일 전송 방식은 이메일 보내기를 참고하세요.