변경 로그
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_tokenPoP 추가 - L111-L121: ### 2026-05-11 — Easy Bracket RP 의 canonical resolution 적용
- L100-L110: ### 2026-05-11 —
- 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_hashclaim(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, gemlogi_auth 1.0.1, pub.devlogi_auth 1.0.1, SPM · JitPackv1.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_countanomaly WORM audit — authenticator counter가 역행하면 인증 자체는 실패시키지 않되,AuthenticationAuditLog에 append-only 감사 이벤트를 남깁니다.- 웹 Conditional UI 로그인 —
/api/v1/passkeys/authentication_options와/api/v1/passkeys/authenticate기반의 패스키 로그인 경로를 추가했습니다. 브라우저 Conditional UI에서 사용자가 패스키를 선택하면 웹 세션을 생성합니다. - App-approval passkey step-up —
approval_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 templates — templates/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/mcpv0.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 차단 —
unverifieddeveloper 는 RP 등록 차단. JSON 응답에verify_url포함. 콘솔 페이지에는 영구 배너 + "✉️ 인증 메일 보내기" CTA 노출 (Phase 5c). created_via채널 기록 —web | cli | mcp | api | rake.X-Logi-Client-Type헤더로 자기 식별. 감사 로그에 영구 기록.- 자동 위험 평가 (
creation_risk_flagsjsonb) —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/applications10/h + 30/d per developer session. POST/api/v1/applications동일 캡 per PAK 토큰 (CLI/MCP/자동화 양산 차단). globalapi/ip60/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 409risk_acknowledgement_required.ApplicationSubmission#approve!+auto_approve_during_beta도 동일 게이트. - AdminAlertMailer high-risk 알림 —
creation_risk_flags비어있지 않으면 mailerdeliver_later. 30분 per-developer cooldown (Rails.cache) + enqueue 실패 rescue. 수신처는RP_HIGH_RISK_ALERT_TOenv 로 설정 (운영자 전용). - Admin queue UI 강화 — 각 앱 row 에 risk 배지 +
created_via표기. "⚠ 위험 신호 있음" 빠른 필터. 상단에 최근 7일 risk 통계 카드 (총 신규 / 위험 신호 포함 / ack-pending 카운트 + top 5 flag 분포).
Migration
20260528130250_add_creation_audit_to_oauth_applications—oauth_applications.created_via(string, defaultweb) +creation_risk_flags(jsonb, default[]) + partial index onjsonb_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.2 —
handleCallback에 redirect_uri scheme/host/path 검증 추가 (ainote 2026-05-15 incident fix) @logi-auth/browser@0.1.0npm 출시 — 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/merge가target_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.mergedwebhook 수신 시 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 capability —
identity_verification_reporterflag +identity_verification_methodsallowlist. 임의 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.fullpath를return_to_after_authenticating에 저장 → state/scope/redirect_uri/code_challenge 보존. - Session fixation — 로그인 성공 시
reset_session호출 (필요한 키만 보존 후 재저장).
Medium
identity:levelscope 신규 —identity_verified_level이profile에 자동 포함되던 동작이 deprecated. 신규 앱은identity:level명시 요청 필요. 기존 앱은legacy_identity_claim=true로 호환 유지 (6개월 마이그레이션 기간).- CSP report-only 활성화 —
default-src 'self',frame-ancestors 'none',/csp-violation-reportsink. enforce 전환은 위반 로그 분석 후. - CORS —
oauth_applications.allowed_origins동적 검증. wildcard + credentials 조합 사용 안 함. - Secret 만료 정책 —
client_secret_expires_at/webhook_secret_expires_at1년 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_storage10.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 rotationm3-developer-portal— Developer Portal + Admin (iOS 26 Liquid Glass)m4-consent— Consent 화면 + Consent 레코드m5-cli— Personal API Keys +logiCLI (Ruby/Thor)m7-otp— TOTP 2FA + 백업 코드 + 민감작업 게이트m8-m10-security-observability— Passkey + Login Logs + Webhooksm12-m13— Suspicious Detection + Admin Auditm6-ios-scaffold/m6-m11-ios-mcp— iOS 앱 + MCP 서버m14-docs— VitePress + Scalar 문서 사이트 + OpenAPI 3.1m15-android-scaffold/m15-complete— Android 앱 + Play Integrity round-trip + Sentry2026-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 정리)