팀 공유 서비스에서는 같은 파일이 여러 번 올라옵니다. 내용이 같으면 콘텐츠 해시가 같으므로, 실제 바이트는 한 벌만 두고 참조만 늘립니다. 하루 40TB 중 상당량이 이렇게 줄어듭니다.
해시를 누가 계산하나
클라이언트가 계산해 보내면 업로드를 아예 건너뛸 수 있습니다. 이미 있는 해시면 바이트를 보내지 않고 참조만 추가합니다. 전송량이 0이 됩니다.
그런데 여기 신뢰 경계가 있습니다. 클라이언트가 보낸 해시를 그대로 믿으면 문제가 생깁니다.
| 위험 | 무슨 일이 벌어지나 |
|---|---|
| 남의 파일 해시를 추측해 보낸다 | 올리지도 않은 파일에 접근 권한을 얻는다 |
| 내용과 다른 해시를 보낸다 | 저장된 바이트와 기록이 어긋난다 |
첫 번째가 실제 취약점입니다. 그래서 해시만으로 접근을 주지 않습니다. 해시는 저장을 줄이는 데 쓰고, 그 파일을 볼 권한은 별도로 확인합니다. 업로드를 건너뛰게 해주려면 최소한 파일 크기를 함께 확인하거나, 무작위 일부 구간을 보내게 해 실제로 가진 것을 증명시킵니다.
지우는 것이 어려운 이유
바이트 한 벌을 여러 참조가 가리키므로, 한 사람이 지웠다고 바이트를 지우면 남의 파일이 사라집니다.
그래서 참조 카운트를 둡니다. 참조가 0이 될 때만 바이트를 지웁니다. 다만 카운트를 정확히 유지하는 것이 쉽지 않습니다. 동시에 올리고 지우면 카운트가 어긋나고, 어긋난 방향에 따라 결과가 다릅니다.
| 어긋난 방향 | 결과 |
|---|---|
| 실제보다 크게 세었다 | 아무도 안 쓰는 바이트가 영구히 남는다. 요금만 |
| 실제보다 작게 세었다 | 쓰는 사람이 있는데 지워진다. 데이터 손실 |
두 번째가 훨씬 나쁩니다. 그래서 카운트가 의심스러우면 지우지 않는 쪽으로 기울입니다. 즉시 삭제 대신 유예 기간을 두고, 그 사이 참조가 다시 생기면 취소합니다.
중복 제거를 안 하는 선택도 있다
참조 카운트와 유예 삭제를 만드는 비용이 절감보다 클 수 있습니다. 파일이 대부분 고유하다면 중복 제거로 줄어드는 양이 적습니다. 먼저 재볼 것은 실제 중복률이고, 낮으면 하지 않는 편이 낫습니다.