데이터인증
이메일 로그인
이메일과 비밀번호, 그리고 매직 링크. 화면은 만들어 드립니다.
runlot add auth 만 하면 앱 안에 로그인·가입 화면이 붙습니다. 직접 만드실 필요가 없습니다.
| 주소 | 화면 |
|---|---|
/__runlot/auth/sign-in | 로그인 |
/__runlot/auth/sign-up | 가입 |
/__runlot/auth/forgot | 비밀번호 찾기 |
/__runlot/auth/reset | 비밀번호 재설정 |
/__runlot/auth/signed-out | 로그아웃 완료 |
여러분의 워커가 받는 요청 중 /__runlot/auth 로 시작하지 않는 것은 그대로 통과합니다.
직접 부르기
화면 대신 여러분의 폼을 쓰시려면 같은 경로로 보내시면 됩니다.
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(없으면 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 # 가입을 닫습니다 (기본 on)
runlot auth set require-verified on # 이메일 확인 전에는 로그인 불가 (기본 off)
runlot auth set session-days 7 # 세션 수명 (기본 30)
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 로 보실 수 있습니다. 실제 발송 경로는 이메일 발송 에 있습니다.