업로드한 파일을 열지 못하는 수신자는 VPN이 파일을 손상시켰다는 말을 자주 듣습니다. 그것은 관측이 아니라 가설이며 검증할 수 있습니다. 터널을 건드리기 전에 목적지에 지금 저장된 객체가 보내야 했던 객체와 다른지 확인하세요. 나머지 모든 것은 그 답에서 나옵니다.

불만이 아니라 보내려던 바이트에서 시작하세요

문제를 재현하는 무해한 파일을 고르거나, 정책이 허용한다면 원본 환경을 떠나도 되는 실제 파일을 고르세요. 전송 전에 바이트 단위의 정확한 크기와 현대적인 콘텐츠 해시, 두 가지를 기록하세요. 파일 이름, 타임스탬프, 미리보기는 메타데이터이며 어느 것도 콘텐츠를 식별하지 않습니다.

양쪽 끝에서 실행할 수 있는 알고리즘으로 해시를 계산하고 어느 것을 썼는지 적어 두세요. SHA-256과 MD5의 비교는 비교가 아니며, 우연히 같은 이름을 공유하는 서로 다른 두 파일의 비교도 비교가 아닙니다.

PS> Get-FileHash -LiteralPath "C:\uploads\report.csv" -Algorithm SHA256
Hash                                                        Path
----                                                        ----
9F2C...                                                      C:\uploads\report.csv

Microsoft의 Get-FileHash 참조 명령과 그 알고리즘 매개변수를 문서화하며, 비교가 무의미한 불일치를 낼 때 사람들이 건너뛰는 부분이 바로 그것입니다.

단계마다 하나의 해시, 같은 알고리즘

이제 저장된 객체가 최종적으로 있는 위치에서, 다른 도구를 거친 사본이 아니라 승인된 방법으로 같은 알고리즘을 계산하세요. 받은 파일을 로컬에 저장해 그 사본을 해시하면 시험하지 않은 단계가 하나 늘어납니다.

서비스가 자체 무결성 값을 노출한다면 그것을 별개의 관측으로 다루세요. 제공자가 보고하는 체크섬은 제공자가 무엇을 저장했다고 믿는지 알려 줄 수 있지만, 클라이언트가 보낸 것과 같은 주장은 아닙니다.

결과는 세 가지이며 각각 다른 방향을 가리킵니다. 해시가 같으면 바이트가 그대로 도착한 것입니다. 알려진 변환이 있는 불일치는 서비스가 의도적으로 새 객체를 만든 것입니다. 변환이 없는 불일치는 두 지점 사이의 무언가가 콘텐츠를 바꾼 것이며, 다음 단계는 그것이 일어난 가장 이른 경계를 찾는 것입니다.

전송 실패와 변환을 분리하세요

부분 업로드와 손상된 업로드는 파일 브라우저에서 똑같이 보이지만 서로 다른 결함입니다. 전송이 완료되었는지는 중단된 요청을 보여 주는 애플리케이션 로그, 크기가 원본의 접두사인 저장 파일, 예상 확장자로 저장된 실체가 오류 페이지인 객체로 확인할 수 있으며, 이 모두는 바이트가 바뀐 것이 아니라 전송이 미완료임을 보여 줍니다.

변환은 또 다른 흔한 설명입니다. 이미지를 다시 압축하거나, CSV 줄 끝을 다시 쓰거나, 문서를 변환하는 서비스는 원본과 다른 해시를 정당하게 만들어 내지만 그것은 손상이 아닙니다. 최종 표시 형식이 아니라 충실한 사본이라고 주장하는 단계를 비교하세요.

지연과 손실은 세 번째 범주입니다. 이것들은 클라이언트를 시간 초과하게 하거나, 재시도하게 하거나, 포기하게 만들 수 있지만 어느 것도 서버가 받아들인 바이트가 조용히 바뀌었다는 뜻은 아닙니다. 무언가를 터널 탓으로 돌리기 전에 전송 결과를 보세요.

모두 바꾸지 않고 두 번째 경로를 시도하세요

해시가 정말 다르고 변환도 없다면 같은 파일, 클라이언트, 프로토콜, 목적지를 VPN 대신 로컬 네트워크 같은 다른 지원 경로로 반복하세요. 변수는 하나만 바꾸세요. 클라이언트와 끝점과 도구를 한꺼번에 바꾸면 원인을 특정할 수 없는 결과가 나옵니다.

비교는 양방향 모두 정직하게 유지하세요. 해시는 두 지점이 콘텐츠에 대해 일치하는지 어긋나는지를 알려 주지만 어느 쪽이 신뢰할 만한지는 알려 주지 않으므로, 기대값과 검증을 실제로 의존하는 신뢰 모델 안에 두세요.

티켓에는 전송이 일찍 멈췄다, 애플리케이션이 객체를 변환했다, 저장소가 바꿨다, 또는 바이트가 일치하고 읽기가 실패다, 라는 구체적인 한 문장으로 마무리하세요. 각각 담당이 다르며, 어느 것도 기본적으로 VPN의 책임이 아닙니다.

관련 글