데이터인증
세션
로그인 상태는 쿠키로 유지합니다. 서버에서 세션을 조회하므로 세션 폐기가 즉시 반영됩니다.
로그인하면 다음 쿠키가 생성됩니다.
__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 주소에서 연 화면에서는 세션이 유지되지 않습니다.