피드로 돌아가기
Dev.toSecurity
원문 읽기
Zero-Knowledge 구현을 위한 Phoenix Socket Identity 제거 설계
When your Phoenix socket has no identity at all (and why that was the right call)
AI 요약
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 등 대체 인프라 계층 보안책 마련