개념
몇 가지 개념만 알면 Usher의 거의 모든 것을 이해할 수 있습니다. 무엇이 어디에 있는지, 누가 토큰을 발급하는지, 사람들이 어디서 로그인하는지, 각 토큰이 얼마나 유지되는지입니다.
워크스페이스, 프로젝트, 환경
- 워크스페이스는 Usher Console 안의 팀 또는 회사입니다. 구성원과 감사 로그가 워크스페이스에 속합니다.
- 프로젝트는 하나의 제품입니다. 웹 앱일 수도 있고 파트너 포털일 수도 있습니다. 한 워크스페이스에 여러 프로젝트를 둘 수 있습니다.
- 환경은 실행 중인 프로젝트의 사본 하나로, 보통 개발과 프로덕션이 있습니다. 사용자, 애플리케이션, 키, 설정은 모두 환경 안에 있습니다.
워크스페이스 · Acme Ltd
프로젝트 · 웹
- development · wise-otter-42
- production · acme
프로젝트 · 파트너 포털
- development · calm-heron-17
- production · acme-partners
환경끼리는 중요한 것을 하나도 공유하지 않습니다. 각 환경에는 자체 Postgres 스키마, 자체 서명 키, 그리고 자체 데이터 키로 봉인된 자체 시크릿이 있습니다. 개발 환경에서 가입한 사람은 프로덕션 환경에 존재하지 않으며, 한 환경의 토큰은 절대 다른 환경의 키로 검증되지 않습니다.
워크스페이스 관리자는 프로젝트의 ‘개요’ 맨 아래에서 프로젝트 이름을 입력한 뒤 프로젝트를 삭제할 수 있습니다. 프로젝트 안의 모든 환경이 한꺼번에 사라집니다. 환경의 사용자, 애플리케이션, 키, 설정, 그리고 환경이 발급한 모든 세션과 토큰도 함께 사라집니다. 프로젝트의 주소는 더 이상 응답하지 않으며 다시는 배정되지 않으므로, 아직 그 주소를 신뢰하는 앱이 다른 사람의 프로젝트에 속을 일이 없습니다.
발급자
각 환경은 테넌트 도메인 위의 자체 호스트에 있는 독립된 OpenID Connect 발급자(issuer)입니다.
https://<handle>.usherid.com- 프로덕션 환경은 직접 정한 핸들을 사용합니다. 핸들은 회사 이름처럼 영문 소문자, 숫자, 연속되지 않은 하이픈으로 된 3~32자입니다. 한 번 사용된 핸들은 다시는 배정되지 않습니다.
- 개발 환경에는
wise-otter-42처럼 누구도 브랜드로 착각하지 않을 무작위 핸들이 주어집니다.
발급자는 환경을 만들 때 정해지며 바꿀 수 없습니다. 발급자가 서명하는 모든 토큰의 iss에 그 이름이 들어가고, 발급자를 신뢰하는 모든 앱이 그 값을 확인하기 때문입니다.
테넌트 도메인은 Usher 자체 도메인(usheridentity.com)과 다른 등록 가능 도메인입니다. 따라서 고객의 로그인 페이지는 절대 Usher Console과 동일 사이트(same-site)가 되지 않으며, 쿠키는 호스트 전용입니다. 브라우저는 한 환경의 쿠키를 그 환경에만 보냅니다.
Lobby
Lobby는 각 환경이 발급자 주소에서 호스팅하는 로그인 페이지입니다. 앱이 사람들을 이곳으로 보내면, Lobby가 로그인을 처리하고 다시 앱으로 돌려보냅니다.
- 사용자가 이동할 앱의 이름을 ‘(으)로 이동’ 칩에 항상 보여 줍니다.
- 환경에서 허용한 방법만 제공합니다. 패스키, 이메일 코드, 매직 링크, 소셜 계정(Google, GitHub, Microsoft, Apple), 암호 중에서 고를 수 있습니다.
- 2차 인증을 필수로 요구할 수 있습니다. 인증 앱(백업 코드 포함) 또는 패스키를 사용합니다.
- 누구나 가입하도록 열어 둘 수도 있고, 주소와 도메인으로 만든 게스트 리스트로 제한할 수도 있습니다.
Lobby는 어느 제품에서 왔든 똑같은 모습입니다. 이는 의도된 것입니다. 사람들은 진짜 Lobby가 어떻게 생겼는지 익히고, 진짜가 아닌 페이지를 알아챌 수 있습니다.
Usher 계정
대부분의 환경은 자체 사용자를 갖습니다. Usher 계정은 다릅니다. 계정 하나로 ‘Usher로 계속하기’를 제공하는 모든 앱에 로그인할 수 있습니다. 사용자는 account.usheridentity.com에서 자신의 계정을 관리합니다.
토큰과 유효 기간
| 토큰 | 기본값 | 설정 가능 범위 | 용도 |
|---|---|---|---|
| 인가 코드 | 5분 | 고정 | 토큰으로 한 번 교환합니다. 일회용입니다. |
| ID 토큰 | 10분 | 1~60분 | 누가 로그인했는지 앱에 알려 줍니다. API 호출용이 아닙니다. |
| 액세스 토큰 | 10분 | 1~60분 | API로 보내며, API가 이를 검증합니다. |
| 리프레시 토큰 | 30일 | 1~90일 | 새 액세스 토큰을 받습니다. 사용할 때마다 교체됩니다. offline_access가 필요합니다. |
| 머신 액세스 토큰 | 15분 | 1~60분 | client_credentials용입니다. 사람 없이 동작하는 서버를 위한 토큰입니다. |
| 이메일 코드, 매직 링크 | 10분 | 고정 | 한 번의 로그인에 사용합니다. 코드는 세 번까지 시도할 수 있습니다. |
Lobby의 세션에도 유효 기간이 있습니다. 세션은 7일 동안 사용하지 않으면 끝나고(130일), 사용 여부와 관계없이 총 30일이 지나면 끝납니다(190일). 이메일 주소처럼 민감한 정보를 변경하려면 최근 10분 이내에 로그인한 상태여야 합니다.
서명 키
토큰은 기본적으로 RS256으로 서명되며, 환경에 따라 ES256 또는 EdDSA를 대신 사용할 수 있습니다. 공개 키는 환경의 jwks_uri에 게시되므로, 라이브러리가 이를 가져오고 키가 교체되면 새 키를 받아 씁니다.
범위(scope)
| 범위 | 앱이 받는 정보 |
|---|---|
openid | 필수. 사용자의 sub이 담긴 ID 토큰. |
profile | 이름과 사진. |
email | 이메일 주소와 그 주소의 확인 여부. |
offline_access | 로그인 상태를 유지하기 위한 리프레시 토큰. |