데이터인증
세션
쿠키 하나입니다. 서명이 아니라 표 조회라 폐기가 즉시 듣습니다.
로그인하면 쿠키가 하나 생깁니다.
__Host-runlot_auth=v1.<랜덤 32 바이트>; Secure; HttpOnly; SameSite=Lax; Path=/기본 수명은 30 일입니다.
runlot auth set session-days 7서명이 아니라 조회입니다
쿠키 값은 서명되지 않았습니다. 대신 그 값의 해시로 표를 조회합니다. 조금 느린 대신 얻는 것이 있습니다 — 폐기가 즉시 듣습니다. 서명 토큰이라면 만료까지 기다려야 합니다.
await env.auth.sessions.revokeAll(userId); // 그 사용자의 모든 세션이 그 자리에서 끝납니다브라우저가 아닌 곳에서
모바일 앱이나 서버에서는 헤더로 보내셔도 됩니다.
Authorization: Bearer v1.<같은 값>헤더가 쿠키보다 우선합니다. Authorization 을 쓰시는 요청은 CSRF 검사를 건너뜁니다.
로그아웃
return new Response(null, {
status: 302,
headers: { location: "/", ...(await env.auth.signOut(request)) },
});브라우저 폼이라면 POST /__runlot/auth/sign-out 으로 보내셔도 됩니다. 둘 다 세션 행을 지우고 쿠키를 비웁니다.
표 안에서 보기
select user_id, created_at, last_seen_at, expires_at
from runlot_auth.sessions
order by last_seen_at desc
limit 20;토큰은 해시로만 있습니다. last_seen_at 은 요청마다가 아니라 하루에 한 번 갱신합니다 — 매 요청 쓰기를 넣으면 읽기만 하는 페이지가 쓰기 부하가 됩니다.
만료된 행은 로그인 확인 100 번마다 한 번씩 정리됩니다.
세션 유지에 필요한 것
쿠키 이름이 __Host- 로 시작해서 HTTPS 에서만 붙습니다. 배포된 주소는 언제나 HTTPS 이므로 문제가 없지만, 로컬 HTTP 로 여신 화면에서는 세션이 유지되지 않습니다.