Skip to content

변경 로그

Source: reference/changelog.md · Live: https://docs.1pass.dev/reference/changelog LLM-sanitized: internal links absolutized, VitePress containers → admonitions, line numbers in the Jump-to Index reference this rendered file (1-indexed).

📍 Jump-to Index

  • L32-L40: ## 2026-07-08 — SDK Swift v1.1.0 — device PAK 교환 · refresh 검증 · revoke/disconnect 프리미티브
  • L41-L49: ## 2026-07-02 — SDK v1.0.1 보안 하드닝 (at_hash + JWKS kty)
  • L50-L61: ## 2026-06-24 — Passkey Phase 1–3
  • L62-L88: ## 2026-05-28 — RP 등록 허들 (Phase 2–5e) + Agent Quickstart
    • L66-L71: ### Docs / agent surface
    • L72-L81: ### RP 등록 허들 (server-side, autoDeploy=off, manual deploy)
    • L82-L84: ### Migration
    • L85-L88: ### Tests
  • L89-L121: ## 2026-05-15
    • L100-L110: ### 2026-05-11 — target_session_token PoP 추가
    • L111-L121: ### 2026-05-11 — Easy Bracket RP 의 canonical resolution 적용
  • L122-L151: ## 2026-04-27 — Security review wave (Phase 1-14)
    • L127-L130: ### Critical
    • L131-L138: ### High
    • L139-L144: ### Medium
    • L145-L151: ### SDK 사용자 영향 정리
  • L152-L168: ## v0.1-alpha (2026-04-22 sync)
  • L169-L174: ## 알려진 제약
  • L175-L181: ## 로드맵 (β)

변경 로그

2026-07-08 — SDK Swift v1.1.0 — device PAK 교환 · refresh 검증 · revoke/disconnect 프리미티브

Swift SDK 에 RP 가 손수 짜던 세 가지 백엔드 인증 호출을 흡수했습니다. 전부 additive(기존 심볼 시그니처 불변) — 기존 v1.0.x 연동은 코드 변경 없이 그대로 동작하고, 새 기능은 옵트인입니다.

  • LogiAuth.verify(_:)LogiAuthStorage.refresh() 가 돌려주는 LogiAuthResult 의 id_token 을 signIn()동일한 JWKS 캐시·RS256 검증으로 확인해 검증된 LogiSession 으로 승격합니다. refresh 로 받은 토큰의 sub/email 을 검증 없이 신뢰하면 signIn 이 막는 서명검증 갭이 refresh 경로에서 다시 열립니다 — 세션 복원(cold-launch) 시 반드시 verify 를 경유하세요. (refresh 응답엔 nonce 가 없어 nonce 는 검사하지 않고, at_hash 는 present-only)
  • LogiDeviceKey (LogiAuthStorage 모듈, actor) — OAuth JWT 를 device-bound PAK(logi_pak_...)로 교환합니다(POST /api/v1/me/device_keys/exchange). /api/v1/* 서버 엔드포인트는 JWT 가 아니라 PAK 를 요구하므로, 이 교환이 필요한 RP 는 손수 구현 대신 SDK 를 씁니다. device_uuid/device_secret 을 Keychain 에 멱등 영속하고 동시 호출을 병합합니다. 기존 설치를 마이그레이션할 땐 레거시 keychainService 를 주입해 저장된 자격을 보존하세요(누락 시 서버가 orphan DeviceCredential 을 새로 만들어 10/h 교환 rate-limit·409 device_claimed_by_other_user 위험).
  • LogiAuthStorage.revokeRefreshToken() / disconnectApp(pak:) — 백채널 프리미티브. revokeRefreshToken() 은 저장된 refresh_token 을 서버에서 무효화(RFC 7009, public client 는 client_id 만 · best-effort). disconnectApp(pak:)DELETE /api/v1/me/connected_apps/{client_id}(Bearer=PAK, profile:write)로 RP 연동을 해지하며 2xx·404 에만 true, 401/403/5xx/timeout 에는 false 를 돌려줘 호출자가 로컬 자격을 보존하고 재시도할 수 있게 합니다(계정 삭제의 "서버 성공 → 로컬 파기" 불변식 보존). signOut() 은 종전대로 로컬 wipe 만 하며 계약이 바뀌지 않습니다.
  • 통합 가이드: iOS (Swift). SPM from: "1.1.0", 태그 v1.1.0. 기존 v1.0.1 골든벡터 전부 통과(비파괴).

2026-07-02 — SDK v1.0.1 보안 하드닝 (at_hash + JWKS kty)

7개 SDK(swift · android · browser · node · flutter · ruby · python)에 non-breaking 보안 하드닝을 적용했습니다.

  • at_hash 바인딩 — id_token 의 at_hash claim(base64url_nopad(SHA256(access_token 의 UTF-8 바이트)[처음 16바이트]), OIDC §3.1.3.6)을 access_token 과 대조 검증합니다(present-only). code 교환 경로의 SDK 는 access_token 을 내부적으로 배선해 세션 반환 전에 access_token↔id_token 바인딩을 확인하며, 스탠드얼론 검증은 accessToken 인자로 넘길 수 있습니다. 불일치 시 at_hash_mismatch.
  • JWKS kty 필터 — 서명 키 선택 시 kty=="RSA" + use∈{null,sig} + alg∈{null,RS256} 필터 후 kid 매칭. EC 등 다른 키 타입이 JWKS 에 혼입돼도 RSA 서명 키를 정확히 선택 — 미래 키 타입 확장에 견고. 자세한 내용은 JWKS 레퍼런스 참고.
  • Swift — CSPRNG(SecRandomCopyBytes) 실패 시 fail-closed + OAuth 콜백 중복 파라미터 방어. Android — refresh 로 회전된 id_token 을 저장 전 재검증.
  • 배포: npm @logi-auth/browser@1.0.1 · @logi-auth/server@1.0.1, gem logi_auth 1.0.1, pub.dev logi_auth 1.0.1, SPM · JitPack v1.0.1 태그. 기존 v1.0.0 골든벡터 전부 통과(비파괴).

2026-06-24 — Passkey Phase 1–3

외부 RP가 알아야 하는 패스키 로그인·승인 경로의 서버 동작을 정리했습니다.

  • WebAuthn L3 메타데이터 저장 — passkey별 backup_eligible, backup_state, backup_state_changed_at, aaguid를 저장합니다. RP는 passkeys:read 응답에서 동기화 가능 여부와 AAGUID를 확인할 수 있습니다.
  • sign_count anomaly WORM audit — authenticator counter가 역행하면 인증 자체는 실패시키지 않되, AuthenticationAuditLog에 append-only 감사 이벤트를 남깁니다.
  • 웹 Conditional UI 로그인/api/v1/passkeys/authentication_options/api/v1/passkeys/authenticate 기반의 패스키 로그인 경로를 추가했습니다. 브라우저 Conditional UI에서 사용자가 패스키를 선택하면 웹 세션을 생성합니다.
  • App-approval passkey step-upapproval_mode=passkey 사용자는 push approval 승인 시 UV가 포함된 passkey assertion으로 step-up을 수행합니다. challenge는 PushApprovalRequest에 묶여 재사용을 막습니다.
  • 미인증 passkey rate limit — 자체 패스키 로그인 UI를 붙이는 RP가 알아야 할 미인증 한도를 추가했습니다. POST /api/v1/passkeys/authentication_options는 20/min/IP, POST /api/v1/passkeys/authenticate는 15/min/IP + 30/min/credential로 제한됩니다. 자세한 값은 Rate Limits를 참고하세요.
  • 마지막 passkey 삭제 lockout 방지 — passkey 전용 승인 모드에서 마지막 active passkey 삭제를 막아 사용자가 승인 경로를 잃지 않도록 했습니다.
  • Authenticate hardening / throttle parity — malformed credential JSON이 500으로 번지지 않도록 방어하고, per-credential throttle과 JSON body parse/rewind 처리를 정리했습니다.

2026-05-28 — RP 등록 허들 (Phase 2–5e) + Agent Quickstart

AI 에이전트가 자동화로 RP (Relying Party) 를 양산하는 시나리오 차단 + 단일 진입점 docs 정비.

Docs / agent surface

  • Agent Quickstart 신설 — /guide/agent-quickstart (한국어, 308 라인) + /en/guide/agent-quickstart (영문 미러). 8단계 실행 순서 + 트랙 자동 감지 + F1-F8 함정 + Self-verify 체크리스트. llms.txt 최상단 ## ⭐ Agents start here 섹션이 이 페이지를 단일 진입점으로 노출.
  • Webhook signature templatestemplates/webhook (rails.rb / express.ts / nextjs-route.ts). dual signature format + 5분 replay window + timing-safe compare 박힘. // TODO: verify signature 안티패턴 차단.
  • "📋 Copy for LLM" 버튼 — 모든 docs 페이지 우상단. 현재 페이지의 .md 미러를 clipboard 복사 + 2초 토스트. 다국어 + 다크 모드 + 모바일 대응.
  • @1pass/mcp v0.2.0 — read-only docs 도구 3종 (fetch_quickstart / get_doc / list_docs) 추가. 인증 불필요. Claude Desktop · Cursor · Codex 에서 자연어로 logi docs fetch.

RP 등록 허들 (server-side, autoDeploy=off, manual deploy)

  • identity_verified_level 차단unverified developer 는 RP 등록 차단. JSON 응답에 verify_url 포함. 콘솔 페이지에는 영구 배너 + "✉️ 인증 메일 보내기" CTA 노출 (Phase 5c).
  • created_via 채널 기록web | cli | mcp | api | rake. X-Logi-Client-Type 헤더로 자기 식별. 감사 로그에 영구 기록.
  • 자동 위험 평가 (creation_risk_flags jsonb)wildcard_redirect_uri / sensitive_scope / unlisted_scope / high_volume_developer (7일 ≥5건) / new_developer_account (가입 7일 이내) / suspicious_app_name (placeholder 정규식). 등록 시점에 평가 → DB 영구 기록.
  • Race-safe high-volume 카운트Current.user.with_lock { evaluate + save } 로 동시 등록 직렬화. 5건 동시 fire 도 정확히 1건만 통과.
  • Rack::Attack throttle — POST /developer/applications 10/h + 30/d per developer session. POST /api/v1/applications 동일 캡 per PAK 토큰 (CLI/MCP/자동화 양산 차단). global api/ip 60/min 과 defense-in-depth 동시 적용.
  • High-risk approval ack 게이트wildcard_redirect_uri / sensitive_scope 단독 또는 2+ flags 누적이면 admin 이 명시적 risk_acknowledged: true 없이 approve 불가. 웹 콘솔은 "⚠ 위험 알면서 승인" 버튼으로 교체 + Turbo confirm 다이얼로그가 flag 목록 표시. iOS admin API (/api/v1/admin/applications/:id/approve) 는 누락 시 HTTP 409 risk_acknowledgement_required. ApplicationSubmission#approve! + auto_approve_during_beta 도 동일 게이트.
  • AdminAlertMailer high-risk 알림creation_risk_flags 비어있지 않으면 mailer deliver_later. 30분 per-developer cooldown (Rails.cache) + enqueue 실패 rescue. 수신처는 RP_HIGH_RISK_ALERT_TO env 로 설정 (운영자 전용).
  • Admin queue UI 강화 — 각 앱 row 에 risk 배지 + created_via 표기. "⚠ 위험 신호 있음" 빠른 필터. 상단에 최근 7일 risk 통계 카드 (총 신규 / 위험 신호 포함 / ack-pending 카운트 + top 5 flag 분포).

Migration

  • 20260528130250_add_creation_audit_to_oauth_applicationsoauth_applications.created_via (string, default web) + creation_risk_flags (jsonb, default []) + partial index on jsonb_array_length(creation_risk_flags) > 0.

Tests

  • 모델/요청/메일러 합산 102+ examples PASS (Phase 2–5e 통합 회귀).
  • Codex review 6라운드 (Phase 2 / 3 / 4 / 5a / 5b / 5b-followup) — 모든 BLOCK 해소.

2026-05-15

  • LogiAuth Swift SDK 0.1.2handleCallback 에 redirect_uri scheme/host/path 검증 추가 (ainote 2026-05-15 incident fix)
  • @logi-auth/browser@0.1.0 npm 출시 — SPA 용 zero-deps PKCE SDK
  • OIDC Discovery 문서 보강response_modes_supported, ui_locales_supported, service_documentation, revocation_endpoint_auth_methods_supported (basic/post; none 제외), claims_parameter_supported / request_parameter_supported / request_uri_parameter_supported / require_request_uri_registration (false 명시)
  • /diagnose 엔드포인트 복구 — 누락된 DiagnoseController + 뷰 추가 (RP 셀프 진단)
  • docs.1pass.dev 트랙 분리/tracks/{mobile,web,api} 신설, llms.txt 에 line-numbered jump index 도입
  • 양방향 Cross-Host Handoff API 추가 (PR #28-32) + global logout
  • 콘솔 SSO Phase 3 (start.1pass.dev) + 데스크톱 웹 SSO Phase 1+2 도입 (Mac Safari Universal Link bouncer)
  • multi-role join table 도입 — host 별 role 분리 (Phase 1)

2026-05-11 — target_session_token PoP 추가

같은 디바이스에서 두 계정 세션을 모두 보유한 사용자가 OTP 이메일 왕복 없이 계정 통합을 할 수 있도록 새 자격증명 경로 추가.

  • 신규 엔드포인트 POST /api/v1/me/merge/session-token — target 세션에서 5분 TTL 토큰 발급
  • 기존 POST /api/v1/me/mergetarget_session_token 또는 otp_code 둘 중 하나 수용
  • 두 자격증명 동시 제공 시 422 conflicting_credentials
  • 감사 로그 marker: merged_via=session_token (OTP 의 merged_via=otp 와 구분)

자세한 흐름은 session-token PoP 가이드.

2026-05-11 — Easy Bracket RP 의 canonical resolution 적용

Easy Bracket (RP, https://easy-bracket-lookbook.onrender.com) 가 logi 계정 통합을 반영하는 canonical_user_ids resolution 을 운영 환경에 적용. ENFORCE_CANONICAL_RESOLUTION=true flip 완료 (현재 통합된 사용자 0명 — 향후 첫 머지부터 자동 작동).

  • Pundit 정책 전체가 user.canonical_user_ids 기준 ownership 체크
  • ActionCable / 백그라운드 잡 / PttChannel 모델 카노니컬화
  • 푸시 알림 fanout 의 canonical id 중복 제거
  • user.merged webhook 수신 시 device token / api token 즉시 무효화

다른 RP 도 동일한 패턴으로 통합 가능. RP 통합 가이드 참조.

2026-04-27 — Security review wave (Phase 1-14)

전체 코드베이스 보안 리뷰 결과에 따른 일괄 강화. 자세한 항목은 docs/todo/security-review-findings-2026-04-27.md.

Critical

  • P0-1 Device bootstrap 재인증device_secret_digest + dual-mode (bootstrap → secret 1회 노출, refresh → digest 검증). 기존 anonymous 계정 device_uuid만으로 PAK 재발급 차단.
  • P0-2 Identity reporter capabilityidentity_verification_reporter flag + identity_verification_methods allowlist. 임의 OAuth 앱이 신뢰 레벨 변경하던 문제 해소.

High

  • Rate limiting — rack-attack 8개 throttle (login/oauth/devices/identity/otp/passkeys/api 전반)
  • Webhook SSRF — 등록·디스패치 모두 DNS 검증, 사설/링크-로컬/멀티캐스트 차단 (IPv4+IPv6). DNS rebinding 방어를 위해 검증된 IP로 직접 connect.
  • Webhook secret 재설계webhook_secret_plaintext를 ActiveRecord encryption으로 저장. BCrypt fallback 사용 시 X-Logi-Secret-Deprecated 헤더 + Deprecation (RFC 9745).
  • Passkey UV 정책purpose=step_up 도입 → user_verification: required 강제. UV 실제 수행 여부(authenticator_data.user_verified?)로만 otp_verified_at 설정.
  • OAuth authorize 복귀 — 미로그인 시 request.fullpathreturn_to_after_authenticating에 저장 → state/scope/redirect_uri/code_challenge 보존.
  • Session fixation — 로그인 성공 시 reset_session 호출 (필요한 키만 보존 후 재저장).

Medium

  • identity:level scope 신규identity_verified_levelprofile에 자동 포함되던 동작이 deprecated. 신규 앱은 identity:level 명시 요청 필요. 기존 앱은 legacy_identity_claim=true로 호환 유지 (6개월 마이그레이션 기간).
  • CSP report-only 활성화default-src 'self', frame-ancestors 'none', /csp-violation-report sink. enforce 전환은 위반 로그 분석 후.
  • CORSoauth_applications.allowed_origins 동적 검증. wildcard + credentials 조합 사용 안 함.
  • Secret 만료 정책client_secret_expires_at / webhook_secret_expires_at 1년 TTL + 30일 전 audit log 알림. 만료된 client_secret으로 토큰 발급 시 invalid_client.

SDK 사용자 영향 정리

  • ⚠️ EncryptedSharedPreferences (androidx.security:security-crypto 1.1.0) deprecated — 신규 SDK에서 사용 금지. DataStore + Tink 또는 Ackee Guardian 권장.
  • ⚠️ iOS Keychain 옵션 명시 필수: kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly (suffix 없으면 iCloud Keychain sync).
  • ⚠️ flutter_secure_storage 10.0+에서 Android backup 제외(backup_rules.xml) 직접 설정 필요.
  • ⚠️ webhook 수신 측은 X-Logi-Secret-Deprecated: true 헤더 처리 + 회전 안내.
  • 새로운 모바일 가이드: iOS, Android, Flutter, React Native.

v0.1-alpha (2026-04-22 sync)

완료된 마일스톤 (GitHub tags 참조):

  • m0-bootstrap — Rails 8 scaffold, Cloudflare/Render 체크리스트
  • m1-auth — 기본 Auth (role + device_uuid + lockout)
  • m2-oauth-core — OAuth 2.0 + PKCE S256 + JWKS + Refresh rotation
  • m3-developer-portal — Developer Portal + Admin (iOS 26 Liquid Glass)
  • m4-consent — Consent 화면 + Consent 레코드
  • m5-cli — Personal API Keys + logi CLI (Ruby/Thor)
  • m7-otp — TOTP 2FA + 백업 코드 + 민감작업 게이트
  • m8-m10-security-observability — Passkey + Login Logs + Webhooks
  • m12-m13 — Suspicious Detection + Admin Audit
  • m6-ios-scaffold / m6-m11-ios-mcp — iOS 앱 + MCP 서버
  • m14-docs — VitePress + Scalar 문서 사이트 + OpenAPI 3.1
  • m15-android-scaffold / m15-complete — Android 앱 + Play Integrity round-trip + Sentry
  • 2026-04-22/oauth/revoke (RFC 7009), /oauth/introspect (RFC 7662), 로그인 이력 90일 purge recurring job

알려진 제약

  • 실제 Render / Cloudflare / GitHub Pages 프로덕션 배포 전
  • Play Integrity production decode 및 ANDROID_APP_CERT_SHA256 주입 미완료
  • iOS associated domain은 api.1pass.dev 로 마이그레이션 완료 (v0.4, 2026-04-22)

로드맵 (β)

  • β1: 동적 scope + required 마킹 (진행 중)
  • β2: 커스텀 claim (User#custom_claims 구현 완료)
  • β3: 푸시 알림 인프라 (APNs/FCM) 출시 완료 — APNs production live, Android FCM 등록 토큰 업로드 구현. 잔여: 로그인 이력 변경 알림 트리거 연동
  • β5: 모바일 프로덕션 하드닝 (Play Integrity decode, cert fingerprint, associated domain 정리)

Identity가 제품의 신뢰를 만듭니다.