Skip to content

06 §5.3 식별자 은닉의 근거가 부실하다 — 열거·가입순번 논거 재작성 #23

Description

@minyongP

06 §5.3이 "member.id를 공개 응답에 포함하지 않는다"고 정하면서 드는 이유가 둘인데, 둘 다 성립하지 않거나 문서 스스로와 모순된다. 규칙을 바꾸자는 게 아니라 근거를 고치자는 것이다 — 근거가 부실하면 다음 결정이 그 위에 잘못 쌓인다.

현재 문장

member.id공개 응답(타인 조회)에 포함하지 않습니다. 순차 값이므로 노출 시 사용자 열거가 가능해지고, 가입 순번이 신원 추론 단서가 됩니다.

이유 1 — "순차 값이라 사용자 열거가 가능" (성립 안 함)

열거가 위험하려면 그 id를 받는 엔드포인트가 있어야 한다. 없다. API 전체가 collectionId·followId로 설계돼 있고(BD-14 식별자 은닉), memberId를 받는 경로는 계획에도 없다. 42번 회원이 존재한다는 걸 알아도 할 수 있는 게 없다.

같은 절이 스스로와 모순되기도 한다.

Collection id는 발행 시 공개 대상이므로 노출되어도 정책 위반이 아닙니다. 사용자 열거와는 성격이 다릅니다.

collection.id도 똑같이 순차다. "성격이 다르다"고 단언만 하고 왜 다른지는 말하지 않는다. 순차 열거가 문제라면 collection id도 같은 문제여야 한다.

이유 2 — "가입 순번이 신원 추론 단서" (순환)

숫자를 사람에 묶을 수단이 있어야 성립하는데, 그 수단이 바로 이유 1에서 없다고 한 것이다.

남는 진짜 근거 (문서가 안 쓰는 것)

04 §1이 "동일 User의 Collection은 하나의 Shelf로 연결되고 다른 사용자가 조회할 수 있다"고 하므로 작성자별 묶어보기는 의도된 기능이다. memberId를 숨겨도 상관관계 자체는 막지 못한다.

실제 차이는 이것뿐이다.

상관관계 범위
진입점이 collectionId 서버가 정해준 만큼만 묶인다
공개 응답에 memberId 클라이언트가 모든 응답을 가로질러 조인할 전역 키를 갖는다

즉 "열거·가입순번"이 아니라 "익명 서비스에서 전역 조인 키를 주지 않는다" 가 근거다. 다만 이것도 shelf 탐색이 있는 이상 강한 방어는 아니다.

제안

식별자 은닉이 아니라 접근 통제를 안전 근거로 삼는 방향으로 §5.3을 다시 쓴다.

id 노출 자체는 그 id로 남의 것에 접근할 수 있을 때만 위험하다. 그 통제는 이미 구현·검증돼 있다 — id를 받는 모든 엔드포인트가 소유권을 확인하고 404로 은닉하며(isOwnedBy 9곳), 타인 접근 차단 테스트가 10건이다(otherUsersRecordDetailIsHiddenAs404 등). 거기가 실제 방어선이다.

구체적으로:

  • 이유 1·2를 걷어내고, 남는 근거(전역 조인 키를 주지 않는다)를 그것대로 적는다. 강한 방어가 아니라는 점도 함께.
  • collection.id와 성격이 다른 이유를 실제로 쓰거나, 다르지 않다면 그 문장을 뺀다.
  • 접근 통제가 실제 방어선임을 명시한다. 그래야 다음 사람이 "id를 숨겼으니 안전하다"로 오해하지 않는다.

왜 지금

Team-PinLog/back #63에서 "공개 조회 경로가 Record 엔티티를 공유해 memberId가 조립 함수까지 닿는다"를 §5.3 근거로 문제 삼았다가, 근거를 따져보니 이 절이 부실해서 지적 자체가 성립하지 않았다. 부실한 근거가 실제로 잘못된 판단을 한 번 만들어낸 사례다.

규칙(진입점을 collectionId로 두는 설계)은 이미 구현돼 있고 바꾸자는 게 아니다. 근거만 고치는 문서 작업이다.

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentation

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions