본문으로 건너뛰기
문서 · iOS 및 Android

iOS 및 Android

네이티브 앱은 웹 뷰가 아니라 시스템 브라우저에서 환경의 Lobby를 통해 로그인합니다. 사용자는 자신의 패스키, 저장된 암호, Usher 세션을 그대로 사용할 수 있고, 앱은 암호를 전혀 보지 않습니다. 나머지 OpenID Connect 과정은 SDK가 대신 처리하며, 토큰은 기기에 보관됩니다.

앱 등록하기

Usher Console에서 환경을 열고 애플리케이션 → 새 애플리케이션 → 모바일 또는 데스크톱으로 이동하세요. com.example.notes:/oauth/callback처럼 소유한 도메인으로 만든 비공개용 리디렉션을 지정합니다. 앱에는 클라이언트 ID가 발급되며 시크릿은 없습니다. 휴대전화의 앱은 시크릿을 안전하게 보관할 수 없으므로, 대신 PKCE를 사용합니다. Console에서 두 플랫폼의 설정 방법을 모두 확인할 수 있습니다.

iOS 및 macOS

swift
import UsherKit

let usher = UsherClient(configuration: .init(
    issuer: URL(string: "https://login.example.com")!,
    clientID: "…",
    redirectURI: URL(string: "com.example.notes:/oauth/callback")!))

let session = try await usher.signIn()
var request = URLRequest(url: URL(string: "https://api.example.com/notes")!)
try await usher.authorize(&request)

토큰은 키체인에 이 기기에서만 사용할 수 있도록 보관됩니다.

Android

kotlin
// build.gradle.kts: manifestPlaceholders["usherRedirectScheme"] = "com.example.notes"
val usher = Usher.client(context, UsherConfiguration(
    issuer = "https://login.example.com",
    clientId = "…",
    redirectUri = "com.example.notes:/oauth/callback"))

val session = usher.signIn(Usher.customTabs(activity))

로그인 화면은 Custom Tab에서 열립니다. 세션은 Android Keystore에 있는 키로 암호화됩니다.

SDK가 확인하는 것

  • 모든 로그인에서 PKCE, state, nonce를 확인하고, 응답에 명시된 발급자도 확인합니다(RFC 9207).
  • ID 토큰의 서명을 환경의 키로 검증하고, 발급자, 대상, 만료 시간을 확인합니다.
  • 리프레시 토큰은 교체됩니다. 각 토큰은 한 번만 사용됩니다. 로그아웃하면 Usher에서 토큰이 폐기됩니다.
  • DPoP를 켜면 토큰이 기기의 키에 묶이므로, 다른 곳으로 복사해도 쓸모가 없습니다.

액세스 토큰으로 자체 API를 호출하려면 API 이름을 정하고 resources로 요청하세요. 자체 API를 참고하세요.