runlot
데이터인증

세션

로그인 상태는 쿠키로 유지합니다. 서버에서 세션을 조회하므로 세션 폐기가 즉시 반영됩니다.

로그인하면 다음 쿠키가 생성됩니다.

__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 주소에서 연 화면에서는 세션이 유지되지 않습니다.

이 페이지의 목차