runlot
데이터인증

이메일 로그인

이메일·비밀번호 로그인과 매직 링크를 설정합니다. 기본 로그인 화면도 제공합니다.

runlot.json"auth": true를 적고 배포하면 앱에 로그인·가입 화면이 추가됩니다. 직접 만들 필요가 없습니다.

경로화면
/__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로 확인할 수 있습니다. 실제 발송 방식은 이메일 발송을 참고하세요.

이 페이지의 목차