[P2][ux] SIWE register 실패 시 challenge 소모 정책을 명확화하고 재시도 UX 개선 #44

Closed
opened 2026-05-02 04:59:45 +00:00 by boxqkrtm · 1 comment

문제

leases.rs::consume_verified_challenge()/sdk/register 요청 처리 시 challenge를 먼저 HashMap에서 remove()한 뒤 만료, message match, signature 검증을 수행합니다.

즉 다음 경우에도 challenge가 즉시 소모됩니다.

  • siwe_message mismatch
  • signature invalid
  • malformed signature
  • expired challenge

영향

  • 사용자가 잘못된 서명을 한 번 제출하면 같은 challenge로 재시도할 수 없음
  • client는 새 /sdk/register/challenge부터 다시 시작해야 함
  • 보안상 one-time challenge 정책은 타당할 수 있으나, 의도된 정책인지 코드/문서/API error에서 명확하지 않음

제안

아래 중 하나를 선택해 정책을 명확화합니다.

  1. 현재처럼 실패 시에도 challenge를 소모하되, API error/documentation에 명확히 설명
  2. signature/message mismatch 같은 검증 실패에서는 짧은 retry window 동안 challenge를 유지
  3. failed attempt count를 challenge에 저장하고 일정 횟수 초과 시 소모

보안 관점에서는 replay 방어를 유지해야 하므로, 재시도 허용 시 attempt cap과 short TTL을 함께 적용하는 것이 좋습니다.

완료 기준

  • challenge 소모 정책이 명확히 문서화되거나 UX 개선됨
  • client가 실패 후 새 challenge가 필요한지 안정적으로 판단 가능
  • 정책에 맞는 regression test 추가

검토 기준: portal-relay SIWE registration flow 정적 리뷰. 관련 코드: crates/portal-relay/src/auth/siwe.rs, crates/portal-relay/src/relay/leases.rs, crates/portal-relay/src/api/mod.rs.

## 문제 `leases.rs::consume_verified_challenge()`는 `/sdk/register` 요청 처리 시 challenge를 먼저 `HashMap`에서 `remove()`한 뒤 만료, message match, signature 검증을 수행합니다. 즉 다음 경우에도 challenge가 즉시 소모됩니다. - `siwe_message` mismatch - signature invalid - malformed signature - expired challenge ## 영향 - 사용자가 잘못된 서명을 한 번 제출하면 같은 challenge로 재시도할 수 없음 - client는 새 `/sdk/register/challenge`부터 다시 시작해야 함 - 보안상 one-time challenge 정책은 타당할 수 있으나, 의도된 정책인지 코드/문서/API error에서 명확하지 않음 ## 제안 아래 중 하나를 선택해 정책을 명확화합니다. 1. 현재처럼 실패 시에도 challenge를 소모하되, API error/documentation에 명확히 설명 2. signature/message mismatch 같은 검증 실패에서는 짧은 retry window 동안 challenge를 유지 3. failed attempt count를 challenge에 저장하고 일정 횟수 초과 시 소모 보안 관점에서는 replay 방어를 유지해야 하므로, 재시도 허용 시 attempt cap과 short TTL을 함께 적용하는 것이 좋습니다. ## 완료 기준 - challenge 소모 정책이 명확히 문서화되거나 UX 개선됨 - client가 실패 후 새 challenge가 필요한지 안정적으로 판단 가능 - 정책에 맞는 regression test 추가 --- 검토 기준: `portal-relay` SIWE registration flow 정적 리뷰. 관련 코드: `crates/portal-relay/src/auth/siwe.rs`, `crates/portal-relay/src/relay/leases.rs`, `crates/portal-relay/src/api/mod.rs`.
Owner

검토했지만 코드 변경은 하지 않습니다. register challenge는 서명 실패/메시지 mismatch에도 소모되는 one-time nonce 정책이 맞습니다. 재시도 UX보다 replay 방어가 우선이고, client는 실패 시 새 challenge를 요청해야 합니다. 이 정책을 이슈 답변으로 명확히 하고 닫습니다.

검토했지만 코드 변경은 하지 않습니다. register challenge는 서명 실패/메시지 mismatch에도 소모되는 one-time nonce 정책이 맞습니다. 재시도 UX보다 replay 방어가 우선이고, client는 실패 시 새 challenge를 요청해야 합니다. 이 정책을 이슈 답변으로 명확히 하고 닫습니다.
gofix closed this issue 2026-05-03 18:58:43 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
gofix/portal-tunnel-rs#44
No description provided.