Repository navigation
정리: SSO 연결을 끊어도 식별자를 묘비로 남겨, 같은 sub를 다른 주체에 다시 연결하지 못하게 한다 - #54
Merged
Merged
Conversation
mack-erel
force-pushed
the
sso-tombstone
branch
from
October 19, 2026 01:40
782414f to
6a2bc9c
Compare
왜(회원 공통 수치 2026-10-18 결정 9 "SSO 연결 식별자는 재사용 방지를 위해 남긴다"): 연결 해제가 행을 DELETE해서, 같은 sub를 다른 관리자·다른 메일 계정에 다시 연결할 수 있었다. IdP가 sub를 재활용하거나(퇴사자 sub를 신입에게) 운영자가 실수하면 예전 사람의 IdP 로그인이 새 주체로 들어온다. - 마이그레이션 029 `identity_tombstones`(realm·provider·subject·owner_id·retired_at). 해제는 행 삭제와 묘비를 한 배치로 한다(insertIgnore — 같은 sub를 여러 번 끊어도 첫 기록을 남긴다). - 연결할 때 그 sub의 묘비가 **다른 주인**이면 "retired"로 거절한다(명령은 conflict + 사유). 원래 주인에게 다시 잇는 것은 허용한다(실수로 끊은 것을 되돌릴 수 있게). - 관리자(admin_identities)와 메일 계정(directory_identities의 oidc: 행) 둘 다. 개인정보가 아니라 불투명 식별자뿐이라 탈퇴 뒤에도 남긴다. 결정의 "iss"는 공급자 설정 id로 대신한다(설정 하나가 issuer 하나를 고정한다). - 문서: SCHEMA §4-5·마이그레이션 표, OPERATIONS E3, PROTOCOLS 표. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…뷰 반영) 왜(리뷰 MEDIUM): - 묘비를 읽은 뒤 연결을 넣는 사이에 해제가 끼면(PG READ COMMITTED) 묘비가 있는데도 sub가 다른 주체에 연결됐다. 이제 sub를 처음 연결할 때 주인을 기록하고(`identity_claims`, INSERT IGNORE) 지우지 않는다. 연결 행은 그 기록의 주인이 나일 때만 들어간다(INSERT … SELECT … WHERE owner_id = ?, 한 배치). 해제는 행만 지운다. 029가 아직 어디에도 적용되지 않아 테이블을 이 설계로 바꿨고, 이미 있는 연결은 그 주인으로 옮겨 적는다(NOT EXISTS로 멱등). - 기록 키가 issuer가 아니라 공급자 id라 같은 IdP를 새 id로 다시 등록하면 기록을 비켜 갔다. 같은 영역(account면 같은 테넌트)에서 같은 issuer를 두 id로 쓰면 기동을 거부한다. 영역이 다르면(관리 콘솔·셀프서비스 클라이언트) 허용한다. - 안 들어간 연결은 지금 다른 주체에 연결돼 있으면 conflict, 예전에 연결됐던 sub면 retired로 구분한다(안내 문구). - 문서: LDAP 디렉터리 연결은 대상 밖(SSO 식별자가 아니고 objectGUID는 재활용되지 않는다), 공급자 id를 바꾸거나 다시 쓰지 말 것, account 영역 기록은 테넌트와 무관하게 전역. - 실DB 테스트(PG 17·MySQL 8, 로컬 임시 컨테이너): 동시 첫 연결 6건 중 하나만 주인, 해제와 다른 주체 연결 동시 10회 재사용 0, 029 옮겨 적기 멱등. 다른 테넌트의 같은 sub 테스트는 행을 직접 넣어 같은 상황을 만든다(이제 명령으로는 못 만든다). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mack-erel
force-pushed
the
sso-tombstone
branch
from
October 19, 2026 01:59
6a2bc9c to
1f9de3f
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
요약
SSO 연결을 끊어도 그 식별자를 묘비로 남겨서, 같은 sub를 다른 관리자나 다른 메일 계정에 다시 연결하지 못하게 합니다. 회원 공통 수치 결정 9("SSO 연결 식별자는 재사용 방지를 위해 남긴다")를 반영한 것이고, 계획의 P7입니다.
⚠ #51(P1) 위에 쌓은 PR입니다. base는
shared-throttle입니다. 마이그레이션 번호(028 다음 029)를 맞추려고 그렇게 했습니다. #51이 머지되면 base를 main으로 바꾸겠습니다.왜
연결을 끊으면 행이 지워져서, 같은 sub를 다른 주체에 다시 연결할 수 있었습니다. IdP가 퇴사자의 sub를 신입에게 다시 주거나 운영자가 실수하면, 예전 사람의 IdP 로그인이 새 주체로 들어옵니다.
바뀐 것
identity_claims를 추가합니다. 새 테이블을 만들고, 이미 있는 연결을 그 주인으로 옮겨 적습니다(멱등).admin_identities)와 메일 계정(directory_identities의oidc:행) 둘 다입니다.검증
npm run verify통과. 테스트 2752개, 스모크 결과 마이그레이션 29개.배포 영향
id를 바꾸거나 다른 IdP에 다시 쓰지 마세요. 연결 기록이 id로 묶입니다.🤖 Generated with Claude Code