피드로 돌아가기
When your Phoenix socket has no identity at all (and why that was the right call)
Dev.toDev.to
Security

Zero-Knowledge 구현을 위한 Phoenix Socket Identity 제거 설계

When your Phoenix socket has no identity at all (and why that was the right call)

Wycliff Ogembo2026년 4월 22일3advanced

Context

일반적인 Phoenix Channel 아키텍처는 Socket에 인증된 Identity를 부여하여 사용자 세션을 관리함. 하지만 서버가 사용자 간의 상관관계를 완전히 알 수 없어야 하는 Zero-Knowledge 메시징 앱에서는 이러한 지속적 식별자가 로그나 덤프를 통해 유출될 수 있는 보안 취약점으로 작용함.

Technical Solution

  • connect/3 단계에서 모든 연결을 허용하고 id/1 함수가 nil을 반환하게 하여 Socket 수준의 정체성을 완전히 제거한 구조 설계
  • 인증 로직을 Socket 연결 단계에서 Channel.join/3 단계로 이동시켜 개별 채널 진입 시마다 독립적인 권한 검증 수행
  • Client-side에서 SHA-256으로 생성한 room_hash, access_hash, sender_hash를 통해 서버가 비밀 키를 알지 못해도 유효성을 검증하는 Capability-based 접근 제어 도입
  • Socket을 단순한 데이터 전송 파이프로 정의하고, 채널별 assign을 통해 최소한의 상태만 유지하는 Stateless Socket 전략 채택
  • 사용자 식별자 부재로 인한 Rate Limiting 한계를 극복하기 위해 Plug 레이어에서 IP 기반의 제한 체계로 대체 구현

1. 사용자 간 상관관계 추적이 불가능해야 하는 고보안 서비스인지 검토

2. 세션 기반 인증 대신 Capability-URL 형태의 베어러 토큰 검증 방식 도입 고려

3. Socket ID 제거 시 Phoenix.PubSub 및 Presence의 사용자 기반 기능 제약 사항 확인

4. Identity 기반 제어 불가 시 IP 기반 Rate Limiting 등 대체 인프라 계층 보안책 마련

원문 읽기