본문으로 건너뛰기
runlot

로그인 방법

앱 사용자가 로그인하는 방법을 고릅니다. 이메일과 비밀번호, 이메일 링크, Runlot, 직접 만든 GitHub·Google 앱, OpenID Connect 제공자 중에서 고를 수 있습니다.

로그인 방법은 모두 하나의 목록에 있습니다. 대시보드의 로그인 및 접근 탭에서 앱 사용자 아래에 전부 표시되고, runlot auth status 도 같은 목록을 보여 줍니다.

방법켜기·끄기
이메일과 비밀번호runlot auth set password on|off
이메일 링크runlot auth set magic-link on|off
Runlotrunlot auth provider runlot on|off
직접 만든 GitHub·Google 앱runlot auth provider set github|google …, runlot auth provider rm …
OIDC 제공자runlot auth provider oidc add <id> …, runlot auth provider oidc rm <id>

제공자를 바꾸려면 admin 역할이 필요합니다.

로그인 방법은 하나 이상 켜져 있어야 합니다. 하나도 남지 않게 되는 변경은 409 last_method 로 거절됩니다. 앱에 로그인이 아예 필요 없다면 로그인 기능 자체를 끄세요.

이메일과 비밀번호, 이메일 링크

둘 다 기본으로 켜져 있습니다.

runlot auth set password off      # 비밀번호 로그인 끄기
runlot auth set magic-link off    # 이메일 링크 로그인 끄기

비밀번호 로그인을 끄면 비밀번호 경로가 404 method_disabled 로 답하고 기본 로그인 화면에서 입력란이 사라집니다. 저장된 비밀번호 해시는 그대로 남으므로 다시 켜면 해당 계정으로 그대로 로그인할 수 있습니다. 둘 다 꺼도 이메일 확인 메일은 계속 발송됩니다. 소셜 로그인만 쓰는 앱도 이메일 주소는 확인해야 하기 때문입니다.

Runlot

runlot auth provider runlot on

로그인 화면에 Runlot 으로 계속하기 버튼 하나가 생깁니다. 버튼을 누르면 앱 이름과 로고가 표시된 Runlot 화면으로 이동하고, 그곳에서 이메일과 비밀번호, Google, GitHub 중 하나로 로그인합니다. 로그인을 마치면 앱으로 돌아옵니다. 등록할 client ID, 시크릿, 콜백 URL 이 없고, 커스텀 도메인을 추가해도 바꿀 것이 없습니다.

사용자는 앱에 runlot 아이덴티티 제공자로 저장됩니다. subject 는 앱마다 다른 값(pairwise ID)이라서, 같은 사람이라도 앱마다 subject 가 다르고 두 앱이 이 값으로 사용자를 맞춰 볼 수 없습니다. 이메일은 Runlot 이 확인한 경우에만 전달됩니다.

설치 환경에서 Runlot 로그인을 제공하지 않으면 명령이 409 runlot_unavailable 로 답합니다.

runlot auth provider runlot off

직접 만든 GitHub·Google 앱

제공자의 동의 화면에 앱 이름을 보이고 싶거나, 할당량을 따로 쓰거나, GitHub Enterprise Server 를 써야 한다면 직접 만든 OAuth 앱을 등록하세요.

runlot auth provider set github --client-id <id> --client-secret <secret>
runlot auth provider set google --client-id <id> --client-secret <secret>

--client-secret 을 생략하면 터미널에서 값을 입력하라는 안내가 표시됩니다.

자체 호스팅 환경에서 GitHub 가 GitHub Enterprise Server 라면 github 줄에 --issuer https://github.acme.example 을 붙이세요. 이 옵션은 github 에만 적용되며, 대시보드에도 같은 입력란이 있습니다.

OpenID Connect 제공자

OpenID Connect 를 지원하는 제공자라면 원하는 ID 로 추가할 수 있습니다. LINE, Apple, Microsoft Entra, Okta, Keycloak, 회사 IdP 모두 가능합니다.

runlot auth provider oidc add <id> --issuer https://idp.example.com \
    --client-id <client-id> [--name "Example"] [--icon https://…/icon.svg] [--scopes "openid email profile"]
# 클라이언트 시크릿은 프롬프트로 입력합니다
runlot auth provider oidc rm <id>
  • <id> 는 직접 정하는 짧은 이름입니다. 영문 소문자로 시작하고 소문자·숫자·하이픈으로 2~31자입니다. github, google, runlot 은 쓸 수 없습니다.
  • --issuer 는 https 여야 합니다. 저장할 때 <issuer>/.well-known/openid-configuration 을 읽으며, 실패하면 400 oidc_discovery_failed 와 함께 제공자의 응답을 보여 주고 저장하지 않습니다.
  • --scopes 를 생략하면 openid email profile 을 사용합니다.

로그인할 때마다 ID 토큰의 서명, issuer, audience, 만료 시각, nonce 를 검증합니다. 이메일 확인 여부(email_verified)를 알려 주지 않는 제공자로 가입한 사용자는 미확인 상태로 만들어지며, 이메일이 같아도 기존 계정과 연결되지 않습니다.

대시보드의 OIDC 제공자 추가 에도 같은 입력란이 있고, 저장하기 전에 콜백 URL 을 보여 줍니다.

예: 카카오

카카오 로그인은 OpenID Connect 를 켜면 OIDC 로 연결할 수 있습니다.

  1. Kakao Developers 콘솔에서 앱을 열고 카카오 로그인 메뉴에서 OpenID Connect 를 켭니다.
  2. Redirect URI 에 콜백 URL https://<your-domain>/__runlot/auth/callback/kakao 를 등록합니다.
  3. 제공자를 추가합니다. client ID 는 앱의 REST API 키이고, 시크릿은 보안 설정의 Client Secret 입니다.
runlot auth provider oidc add kakao --issuer https://kauth.kakao.com \
    --client-id <REST API 키> --name "카카오"

콜백 URL

직접 만든 GitHub·Google 앱과 OIDC 앱은 제공자 콘솔에 다음 URL 을 등록해야 합니다. 프로젝트가 응답하는 호스트마다 한 번씩 등록하세요. Runlot 은 등록할 것이 없습니다.

https://<your-domain>/__runlot/auth/callback/<id>

정확한 목록은 runlot auth status 가 보여 줍니다. 커스텀 도메인을 추가하면 그 콜백 URL 도 제공자 콘솔에 추가하세요. 빠뜨린 호스트에서는 로그인이 실패하고, 오류는 제공자 쪽에만 표시됩니다.

가입·이메일 설정도 적용됩니다

allowSignup 과 requireVerifiedEmail 은 모든 로그인 방법에 똑같이 적용됩니다. 가입을 끄면 어떤 제공자로도 새 사용자를 만들 수 없고, 이메일 확인을 필수로 하면 이메일을 확인해 주지 않는 제공자로는 세션을 받을 수 없습니다.

직접 만든 로그인 화면에서 쓰기

켜 둔 방법은 기본 로그인 화면에 버튼으로 나타납니다. 직접 만든 로그인 화면에서는 버튼을 하드코딩하지 말고 켜져 있는 방법을 조회하세요.

import { providers, signInUrl } from "@runlot/auth/client";

for (const p of await providers()) {
  // p.id 는 "runlot", "github", "google" 또는 직접 정한 OIDC ID 이며, OIDC 항목에는 name 과 icon 이 있습니다
  render(<a href={signInUrl(p.id, { next: "/app" })}>Continue with {p.name ?? p.id}</a>);
}

signInUrl("github", { next: "/app" }) 은 /__runlot/auth/sign-in/github?next=%2Fapp 로 연결됩니다. next 가 외부 URL 이거나 // 로 시작하면 보안을 위해 무시합니다.

같은 이메일의 계정 연결

비밀번호 로그인과 제공자가 같은 확인된 이메일 주소를 쓰면 하나의 사용자 계정으로 연결됩니다. 사용자가 어떤 제공자를 쓰는지는 user.providers 로 확인할 수 있습니다.

const user = await env.auth.user(request);
user.providers; // ["password", "github"]

제공자 삭제

runlot auth provider rm github

삭제한 제공자로만 로그인하던 사용자는 비밀번호 로그인이 켜져 있다면 비밀번호를 재설정해 다시 로그인할 수 있습니다.

이 페이지의 목차