<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>1pass 변경 로그</title>
    <link>https://docs.1pass.dev/reference/changelog</link>
    <description>logi (1pass.dev) 개발자 문서 변경 로그 — SDK · OAuth · 보안 업데이트.</description>
    <language>ko-KR</language>
    <lastBuildDate>Thu, 09 Jul 2026 00:36:43 GMT</lastBuildDate>
    <atom:link href="https://docs.1pass.dev/changelog.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>SDK Swift v1.1.0 — device PAK 교환 · refresh 검증 · revoke/disconnect 프리미티브</title>
      <link>https://docs.1pass.dev/reference/changelog#_2026-07-08-%E2%80%94-sdk-swift-v1-1-0-%E2%80%94-device-pak-%E1%84%80%E1%85%AD%E1%84%92%E1%85%AA%E1%86%AB-%C2%B7-refresh-%E1%84%80%E1%85%A5%E1%86%B7%E1%84%8C%E1%85%B3%E1%86%BC-%C2%B7-revoke-disconnect-%E1%84%91%E1%85%B3%E1%84%85%E1%85%B5%E1%84%86%E1%85%B5%E1%84%90%E1%85%B5%E1%84%87%E1%85%B3</link>
      <guid isPermaLink="true">https://docs.1pass.dev/reference/changelog#_2026-07-08-%E2%80%94-sdk-swift-v1-1-0-%E2%80%94-device-pak-%E1%84%80%E1%85%AD%E1%84%92%E1%85%AA%E1%86%AB-%C2%B7-refresh-%E1%84%80%E1%85%A5%E1%86%B7%E1%84%8C%E1%85%B3%E1%86%BC-%C2%B7-revoke-disconnect-%E1%84%91%E1%85%B3%E1%84%85%E1%85%B5%E1%84%86%E1%85%B5%E1%84%90%E1%85%B5%E1%84%87%E1%85%B3</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[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)](../integrations/swift). SPM `from: "1.1.0"`, 태그 `v1.1.0`. 기존 v1.0.1 골든벡터 전부 통과(비파괴).]]></description>
    </item>
    <item>
      <title>SDK v1.0.1 보안 하드닝 (at_hash + JWKS kty)</title>
      <link>https://docs.1pass.dev/reference/changelog#_2026-07-02-%E2%80%94-sdk-v1-0-1-%E1%84%87%E1%85%A9%E1%84%8B%E1%85%A1%E1%86%AB-%E1%84%92%E1%85%A1%E1%84%83%E1%85%B3%E1%84%82%E1%85%B5%E1%86%BC-at-hash-jwks-kty</link>
      <guid isPermaLink="true">https://docs.1pass.dev/reference/changelog#_2026-07-02-%E2%80%94-sdk-v1-0-1-%E1%84%87%E1%85%A9%E1%84%8B%E1%85%A1%E1%86%AB-%E1%84%92%E1%85%A1%E1%84%83%E1%85%B3%E1%84%82%E1%85%B5%E1%86%BC-at-hash-jwks-kty</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[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 레퍼런스](../oauth/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 골든벡터 전부 통과(비파괴).]]></description>
    </item>
    <item>
      <title>Passkey Phase 1–3</title>
      <link>https://docs.1pass.dev/reference/changelog#_2026-06-24-%E2%80%94-passkey-phase-1%E2%80%933</link>
      <guid isPermaLink="true">https://docs.1pass.dev/reference/changelog#_2026-06-24-%E2%80%94-passkey-phase-1%E2%80%933</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[외부 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-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](../guide/rate-limits)를 참고하세요.
- **마지막 passkey 삭제 lockout 방지** — passkey 전용 승인 모드에서 마지막 active passkey 삭제를 막아 사용자가 승인 경로를 잃지 않도록 했습니다.
- **Authenticate hardening / throttle parity** — malformed credential JSON이 500으로 번지지 않도록 방어하고, per-credential throttle과 JSON body parse/rewind 처리를 정리했습니다.]]></description>
    </item>
    <item>
      <title>RP 등록 허들 (Phase 2–5e) + Agent Quickstart</title>
      <link>https://docs.1pass.dev/reference/changelog#_2026-05-28-%E2%80%94-rp-%E1%84%83%E1%85%B3%E1%86%BC%E1%84%85%E1%85%A9%E1%86%A8-%E1%84%92%E1%85%A5%E1%84%83%E1%85%B3%E1%86%AF-phase-2%E2%80%935e-agent-quickstart</link>
      <guid isPermaLink="true">https://docs.1pass.dev/reference/changelog#_2026-05-28-%E2%80%94-rp-%E1%84%83%E1%85%B3%E1%86%BC%E1%84%85%E1%85%A9%E1%86%A8-%E1%84%92%E1%85%A5%E1%84%83%E1%85%B3%E1%86%AF-phase-2%E2%80%935e-agent-quickstart</guid>
      <pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[AI 에이전트가 자동화로 RP (Relying Party) 를 양산하는 시나리오 차단 + 단일 진입점 docs 정비.

### Docs / agent surface
- **Agent Quickstart** 신설 — [/guide/agent-quickstart](../guide/agent-quickstart) (한국어, 308 라인) + [/en/guide/agent-quickstart](/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)](/templates/webhook/README). 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_applications` — `oauth_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 해소.]]></description>
    </item>
    <item>
      <title>2026-05-15</title>
      <link>https://docs.1pass.dev/reference/changelog#_2026-05-15</link>
      <guid isPermaLink="true">https://docs.1pass.dev/reference/changelog#_2026-05-15</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[- **LogiAuth Swift SDK 0.1.2** — `handleCallback` 에 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/merge` 가 `target_session_token` 또는 `otp_code` 둘 중 하나 수용
- 두 자격증명 동시 제공 시 `422 conflicting_credentials`
- 감사 로그 marker: `merged_via=session_token` (OTP 의 `merged_via=otp` 와 구분)

자세한 흐름은 [session-token PoP 가이드](../oauth/session-token.md).

### 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 통합 가이드](../oauth/rp-migration-guide.md) 참조.]]></description>
    </item>
    <item>
      <title>Security review wave (Phase 1-14)</title>
      <link>https://docs.1pass.dev/reference/changelog#_2026-04-27-%E2%80%94-security-review-wave-phase-1-14</link>
      <guid isPermaLink="true">https://docs.1pass.dev/reference/changelog#_2026-04-27-%E2%80%94-security-review-wave-phase-1-14</guid>
      <pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[전체 코드베이스 보안 리뷰 결과에 따른 일괄 강화. 자세한 항목은
`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_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.fullpath`를 `return_to_after_authenticating`에 저장 → state/scope/redirect_uri/code_challenge 보존.
- **Session fixation** — 로그인 성공 시 `reset_session` 호출 (필요한 키만 보존 후 재저장).

### Medium
- **`identity:level` scope 신규** — `identity_verified_level`이 `profile`에 자동 포함되던 동작이 deprecated. 신규 앱은 `identity:level` 명시 요청 필요. 기존 앱은 `legacy_identity_claim=true`로 호환 유지 (6개월 마이그레이션 기간).
- **CSP report-only 활성화** — `default-src 'self'`, `frame-ancestors 'none'`, `/csp-violation-report` sink. enforce 전환은 위반 로그 분석 후.
- **CORS** — `oauth_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](/integrations/swift), [Android](/integrations/android), [Flutter](/integrations/flutter), [React Native](/integrations/react-native).]]></description>
    </item>
  </channel>
</rss>
