Files
document-haness/docs/clean-architecture-backend-template/tech-log-studio/file-transfer-and-storage/case/case-analysis-finding-a09-f006.md
T
DongHyeonkaandClaude Fable 5.1 b25357c48a docs(clean-architecture-backend-template): fold analysis into final and re-select one topic
- analysis/·source-index·state.json 을 final/document.md 제2부·제3부로 접었다. SSOT 는 하나다
- 파일럿 — commit-ambiguity-as-a-result 를 새 기준으로 재선별. 후보 14 → 글감 5
  (PROMOTE 5 · MERGE_INTO 3 · KEEP_IN_SSOT 4 · 보류 2). 기록 5건을 다시 썼고 그림 1개를
  techviz 로 만들었다
- 재선별이 잡은 것: 제1부 §6.2·§11.1 이 자기 §13.2 와 어긋나 있었다(레인을 안 돌렸다 vs
  돌렸다) — 정정. 이미 답이 나와 있던 Question 을 HEAD 재실행 질문으로 다시 세웠다.
  Concept 이 인용한 코드가 SSOT 에 없어 뺐다
- candidateScope·sourceRepository 기록. 나머지 43개 주제는 재선별 대기(PENDING 905)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-07 12:39:20 +09:00

4.0 KiB

kind, slug, title, topic, project, status, sourceRevision, rootTreeNode, evidenceCapturedOn, body, assets, evidence, source
kind slug title topic project status sourceRevision rootTreeNode evidenceCapturedOn body assets evidence source
CASE analysis-finding-a09-f006 nonce replay 경계가 결과를 읽고 버린다 file-transfer-and-storage clean-architecture-backend-template 게시 전 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 case:analysis-finding-a09-f006 2026-09-01 case-analysis-finding-a09-f006.body.md
key file
analysis-finding-a09-f006 ../../../final/evidence/rendered/analysis-finding-a09-f006.svg
../../../final/evidence/raw/analysis-finding-a09-f006.txt
원본 분석 절은 final/document.md#a09#L589 이다.

nonce replay 경계가 결과를 읽고 버린다

인터페이스가 스스로를 내구적 비교 후 교체 재생 경계라고 부른다. 호출부는 청구 결과를 받아 변수에 담고, 어느 값이든 발행을 그대로 진행한다. 결과가 바꾸는 것은 종결 기록을 쓸지 여부뿐이다.

관계

  • 검사 결과를 읽고 버리면 검사가 아니다 이 사례가 그 규칙의 형태다.
  • 미배선 경계가 문서에만 있고 compile 경로에서 닫히지 않는다 같은 리프의 다른 경계 사례다.
  • 멱등은 결과를 같게 만들지만 경계를 대신하지는 않는다 피해가 제한된 이유이자 그것이 변명이 되지 않는 이유다.

문제

승인 문서의 논스가 한 번만 쓰인다는 성질을 지키는 저장소가 있다.

그 저장소의 청구 메서드를 호출부가 어떻게 쓰는지 확인했다.

결론

청구 결과를 변수에 담고, 다음 줄에서 발행을 부른다.

그다음에야 결과를 본다. 종결 재생이 아니면 종결 기록을 남긴다.

결과 값은 셋이다. 청구됨과 정확한 재생과 종결 재생이다.

어느 값이든 발행은 그대로 진행된다.

즉 청구 결과가 바꾸는 것은 종결 기록을 쓸지 여부뿐이다. 인터페이스 자바독은 자신을 내구적 비교 후 교체 재생 경계라고 부르는데, 경계로서 무엇도 막지 않는다.

실제 피해는 제한적이다.

발행이 연산 키 기반 멱등이다. 이미 소진된 논스로 다시 들어와도 결과는 재생됨이고 두 번째 객체가 생기지 않는다.

그래서 판정은 P3 다.

그럼에도 기록하는 이유는 셋이다.

이름이 약속하는 것과 다르다. 종결 기록에 넘기는 기대 개정 번호가 항상 0 이라 비교 후 교체의 인자로서도 고정값이다. 그리고 승인 문서의 논스가 한 번만 쓰인다는 성질이 이 코드로는 보장되지 않는다.

수정은 종결 재생에서 발행 전에 거부하는 것이다.

검증 환경

확인 방식 : 호출부와 인터페이스 자바독 대조 소스 수정 : x

재현 조건

원문은 final/evidence/raw/154 계열에 있다.

  1. 재생 저장소 인터페이스의 자바독을 읽는다.
  2. 청구 결과 열거값 셋을 확인한다.
  3. 호출부에서 결과가 어떻게 쓰이는지 확인한다.
  4. 발행 호출이 결과보다 앞인지 뒤인지 본다.
  5. 종결 기록에 넘기는 기대 개정 번호가 무엇인지 확인한다.

본문

ClaimResultCLAIMED / EXACT_REPLAY / TERMINAL_REPLAY 셋인데, 어느 값이든 발행은 그대로 진행된다. claim 결과가 바꾸는 것은 terminal 기록을 쓸지 여부뿐이다.

ClaimResult 참조 위치

:::evidence key="analysis-finding-a09-f006" alt="코드베이스에서 ClaimResult 를 검색한 출력 10줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="ClaimResult 코드베이스 검색 — 10줄 · exit 0" zoom="true" :::

경계라고 부르지만 아무것도 막지 않는다

인터페이스 javadoc은 자신을 "Durable compare-and-set nonce replay boundary"라고 부른다.

확인하지 못한 것

소진된 논스로 두 번 들어와 결과가 재생됨이 되는지 실행하지 않았다. 멱등 키 구현상 그 결과가 나온다.