회원 탈퇴 및 연관 데이터 하드 삭제 구현 - #297
Conversation
📊 코드 커버리지 리포트
|
99f2b28 to
cd742be
Compare
cd742be to
2b46a64
Compare
ckdals4600
left a comment
There was a problem hiding this comment.
탈퇴 진행 중 회원의 HTTP는 필터가 403으로 막지만, STOMP 경로는 열려 있습니다.
StompHandler의 상태 검사는 L74-77의 PENDING_TERMS뿐입니다.
아래와 탈퇴 흐름을 확인해보면,
/ws/chat/**은PERMIT_URLS라pending/withdrawing게이트가 있는JwtAuthenticationFilter를 아예 안 탑니다- 탈퇴 시작 전 발급된
access token의memberStatus클레임은ACTIVE입니다 - → WITHDRAWING 회원이 그 토큰으로
STOMP CONNECT/SEND전부 통과 → AI 채팅 사용 가능
정상 흐름에선 이 창이 몇 초지만, DB 삭제 실패로 고착된 회원에게는 무기한입니다. "탈퇴했다"고 인식하는 사용자의 세션이 AI 비용을 계속 쓰고 새 메시지를 만들 수 있는 상태예요.
이번 취약점의 경우 낡은 토큰의 클레임이 ACTIVE 이기 때문에 클레임 검사로는 막을 수 없습니다. CONNECT 시 getAuthentication이 이미 DB에서 회원을 로드하니 그 결과를 통한 검사 로직 추가를 부탁드립ㄴ디ㅏ.
Authentication authentication = jwtTokenProvider.getAuthentication(token);
if (authentication.getPrincipal() instanceof CustomMemberDetail detail
&& detail.member().isWithdrawing()) {
throw new BusinessException(MemberErrorCode.WITHDRAWAL_IN_PROGRESS);
}
accessor.setUser(authentication);2b46a64 to
744b9a3
Compare
확인 감사합니다. |
744b9a3 to
4031d95
Compare
관련 이슈
PR 설명
변경 사항
DELETE /v1/memberAPI를 추가했습니다.client_id와 함께 하드 삭제 전에account_delete이벤트를 전송합니다.WITHDRAWING으로 전환하고 refresh token, 요약 큐, 로그인·OAuth·토큰 재발급 및 비동기 AI 후속 처리를 차단합니다.member-deletewebhook으로 회원 벡터 삭제를 시도한 뒤 FK 순서에 따라 회원 연관 데이터를 하나의 DB 트랜잭션에서 하드 삭제합니다.account_delete는 상태 코드를 이용해 재시도 중 중복 전송을 방지합니다.병합 시 유의사항
#296과
docker/docker-compose.yml의 동일한 위치에 환경변수를 추가하므로 병합 충돌이 발생합니다. #296을 먼저 병합한 뒤 이 PR을main기준으로 rebase하고, 충돌 해결 시 다음 환경변수를 모두 유지해야 합니다.ANALYTICS_GA4_DEBUG_MODEAPP_MEMBER_WITHDRAWAL_ENABLEDAPP_MEMBER_WITHDRAWAL_INTERNAL_SECRETrebase와 충돌 해결 후 전체 CI를 다시 확인합니다.
API 요청
deleteReason은NO_USEFUL_LINKS,POOR_SEARCH,NO_REVISIT,SWITCHED_SERVICE,PRIVACY_CONCERN,OTHER중 하나입니다.배포 설정
APP_MEMBER_WITHDRAWAL_ENABLED=true,APP_MEMBER_WITHDRAWAL_INTERNAL_SECRET=<shared-secret>member-deletewebhook에 동일한 secret을 사용하는x-linkiving-internal-secretHeader Auth를 설정합니다. webhook은{ "userId": <member-id> }요청을 멱등 처리해야 합니다.member.status에WITHDRAWING=3,WITHDRAWAL_ANALYTICS_SENT=4코드가 추가됩니다. 운영 스키마가 enum/check constraint를 사용한다면 두 값을 허용해야 합니다.Core 설정과 n8n Header Auth를 함께 배포한 뒤 기능을 활성화합니다. 기본값은 비활성화입니다.