runlot
데이터인증

이메일 로그인

이메일과 비밀번호, 그리고 매직 링크. 화면은 만들어 드립니다.

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 로 보실 수 있습니다. 실제 발송 경로는 이메일 발송 에 있습니다.

이 페이지에서