테마
AI Guard 정책
판옵티콘이 본 것을 정책으로 막는 것이 AI Guard입니다. 베타에서 4종 정책을 설계 중입니다.
🔬 일부 정책은 설계 단계입니다
이 페이지가 다루는 4종 정책 중 HITL 승인 endpoint 와 Soft Kill Switch CLI 는 현재 코드베이스에 구현되지 않았습니다 (2026-05-15 audit). start.1pass.dev/developer 콘솔에서 정책을 정의하더라도 logi 서버는 다음을 아직 제공하지 않습니다:
POST /panopticon/approval/request— 미구현 (404)GET /panopticon/approval/<request_uuid>— 미구현 (404)logi panopticon kill <client_id>CLI — 미구현OauthApplication#killed_at등 kill switch 상태 컬럼 — 미구현
현재 동작 가능한 정책: Scope Drift log_only (기본), Rate Limit (rack-attack 단의 /oauth/token·/oauth/userinfo throttle). 그 외는 콘솔 UI 에서 정의는 되지만 enforcement 미연동입니다. 진행 상황은 GitHub issues 에서 추적합니다.
정책 한눈에
| 정책 | 즉시성 | RP 측 부담 | 상태 |
|---|---|---|---|
Rate Limit (rack-attack /oauth/*) | 즉시 (서버) | 없음 | ✓ 구현 완료 |
| Rate Limit (per-application × tool) | 즉시 (서버) | webhook 수신 | 🔬 설계 중 |
| Soft Kill Switch | ≤ 15분 | 없음 | 🔬 설계 중 |
| HITL 승인 | 사용자 응답 시 | endpoint 추가 호출 | 🔬 설계 중 |
Scope Drift Policy log_only | 즉시 | 없음 | ✓ 구현 완료 |
Scope Drift Policy alert / block | 즉시 (/oauth/authorize) | 없음 | 🔬 설계 중 |
베타에서는 정책 설정·집행은 가능하지만 quota 강제와 과금은 비활성입니다 (구현된 정책 한정).
1. Rate Limit
LLM 환각으로 인한 도구 호출 폭주 방어.
두 종류의 Rate Limit이 존재하며 적용 지점이 다릅니다.
A. logi endpoint throttle (rack-attack 기존)
/oauth/token, /oauth/userinfo 등 logi가 직접 호스팅하는 endpoint에 대한 보호. application/IP 단위.
B. AI Guard tool throttle (Panopticon 신규)
RP가 trace를 보고하는 application에 대해 Panopticon이 logi 측에서 카운팅하는 (application × user, application × tool) 한도. 한도 초과 시 logi는 webhook(panopticon.anomaly_detected)을 발사하고, RP는 자기 정책에 따라 차단/경고를 결정합니다. logi가 도구 호출 자체를 막지는 않습니다 — RP는 webhook을 받아 자기 측에서 차단해야 합니다.
기본값 (per application × user):
- 분당 60회
- 동일 도구 분당 20회
override (콘솔 또는 CLI):
bash
logi panopticon policy <client_id> --rate-limit '{"per_minute":120,"per_tool_per_minute":40}'2. Soft Kill Switch 🔬 (설계 단계)
미구현 — 설계 사양
아래 발동 절차 (CLI · 콘솔 1-click) 는 logi 서버에 아직 라우트가 없습니다. OauthApplication#killed_at 컬럼, logi panopticon kill CLI 명령, 콘솔 Kill Switch 탭 모두 backlog 입니다.
현재 가능한 차단 수단:
- Refresh token 회전+재사용 탐지: 이미 구현됨 (
Oauth::TokensController#rotate_refresh_token+OauthAccessToken#revoke_chain!). 재사용 감지 시 chain 전체가 자동 revoke 되므로, 도난 시나리오에서는 사실상 즉시 차단 효과. - 수동 DB revoke:
OauthAccessToken.where(oauth_application_id: APP_ID).find_each(&:revoke!)콘솔 실행. RT 가 revoke 되면 다음 회전 시도에서 거부.
특정 application 또는 (application × user) 단위 즉시 차단.
발동 (계획)
콘솔 → application → Kill Switch 탭 → 사용자 매트릭스에서 1-click
또는 CLI:
bash
logi panopticon kill <client_id> # application 전체
logi panopticon kill <client_id> --user user_xyz # 특정 user만
logi agent revoke <client_id> # ALIAS for kill동작 (계획)
- 해당
OauthAccessToken의 모든 refresh token revoke - 기존 access token은 최대 15분 후 자연 만료 (TTL 15분)
panopticon.kill_switchwebhook 발사
즉시 차단을 원하면
RP가 매 호출마다 /oauth/introspect 호출 (latency 본인 부담, opt-in). 기본 RP는 15분 지연 수용.
3. HITL 승인 (민감 도구 opt-in) 🔬 (설계 단계)
미구현 — 라우트 없음
아래 POST /panopticon/approval/request 와 GET /panopticon/approval/<request_uuid> 는 server/config/routes.rb 에 존재하지 않습니다 (2026-05-15 audit). 샘플 코드를 그대로 호출하면 404 가 떨어집니다.
PATCH /api/v1/me/panopticon/approvals/:id (사용자 세션 인증) 만 부분적으로 존재 — RP-facing PAK 인증 API 가 아니므로 RP 통합용으로 사용할 수 없습니다.
특정 도구는 사용자의 logi 앱 푸시 승인이 있어야만 실행.
설정
bash
logi panopticon policy <client_id> --hitl payment.charge,memory.delete,calendar.delete또는 콘솔 → Policies → HITL 도구 목록에 도구 이름 추가.
RP 측 흐름
python
# 도구 실행 직전
async def call_payment_tool(amount, user_sub):
# 1. logi에 승인 요청
resp = await httpx.post(
f"{LOGI_URL}/panopticon/approval/request",
headers={"Authorization": f"Bearer {PANOPTICON_PAK}"},
json={
"tool_name": "payment.charge",
"tool_args_summary": {"amount": amount, "currency": "KRW"},
"user_sub": user_sub,
}
)
request_uuid = resp.json()["request_uuid"]
# 2. 사용자 응답 대기 (polling 또는 webhook)
while True:
status = await poll_approval(request_uuid)
if status == "approved":
return await execute_payment(amount)
elif status in ("denied", "expired"):
raise PermissionError(status)
await asyncio.sleep(2)poll endpoint:
http
GET /panopticon/approval/<request_uuid>
Authorization: Bearer pano_pak_...응답: {"status":"pending|approved|denied|expired","approved_at":"..."}
TTL: 5분. 만료 후엔 expired 반환.
사용자 경험
- RP 도구 호출 시 사용자 logi 앱에 푸시 알림 도착
- "MyAgent가 결제 도구 실행 요청 — 승인하시겠습니까?"
- 사용자가 logi 앱(또는 Universal Link로
/auth/approve/<uuid>)에서 승인/거부 - 결과가 polling 또는 webhook으로 RP에 전달
4. Scope Drift Policy
LLM이 등록되지 않은 scope를 요청하는 경우의 처리.
3단계 정책
| 정책 | 동작 | 추천 |
|---|---|---|
log_only (기본) | 기존 동작: drift 기록 + scope.drift_detected webhook + 등록된 scope subset으로 진행 | 일반 application |
alert | log_only + 콘솔에 inline 알림 카드 노출 | 활발히 모니터링 중인 application |
block | /oauth/authorize에서 미등록 scope 발견 시 400 invalid_scope 반환 (인가 자체 거부, RFC 6749 §4.1.2.1) | 보안 민감 application |
변경
bash
logi panopticon policy <client_id> --drift block또는 콘솔 → Policies → Scope Drift Policy 라디오.
Scope Drift는 모두 기록됨
정책에 관계없이 ScopeDriftRecord는 모든 drift 이벤트를 적재합니다. 첫 발생 시 scope.drift_detected webhook, escalation 후 scope.drift_unresolved webhook이 발사됩니다 (Webhook 가이드).
사용량과 정책의 관계
베타 동안 정책은 모두 enforcement만 하고 quota를 차단하지 않습니다. 즉:
- Rate Limit: 분당 한도 초과 시 throttle (적용됨)
- Soft Kill: 사용자가 실행 시에만 (자동 트리거 없음)
- HITL: 사용자 승인이 필수 (적용됨)
- Scope Drift
block: invalid scope 시 거부 (적용됨)
정식 출시 후 추가될 quota 정책 (월 trace 한도, tier별 차등)은 별도 spec에서 다룹니다.