shadcn.io— shadcn/ui 블록 수천 개
본문으로 건너뛰기

브라우저 안 이미지 변환은 실제로 어떻게 되는가 (그리고 제가 그렇게 만든 이유)

이 사이트 전체가 존재하는 이유는 몇 년 전에 겪은 작고 시시한 불안의 순간입니다. HEIC 사진 한 장을 JPG로 바꿔야 했고, 검색창에 뻔한 것을 쳤고, 제 사진을 자기네 서버로 업로드하라는 변환기에 도착했습니다. 그래서 그렇게 했습니다. 잘 됐습니다. 그리고 앉아서 생각했습니다. 저 사진은 이제 제가 아무것도 모르는 어떤 기계 위에, 결코 만날 일 없는 사람들이 운영하는 곳에, 들어 본 적 없는 기간 동안 놓여 있구나. 아무 스크린샷이면 괜찮습니다. 그런데 그건 스크린샷이 아니었습니다. 개인 사진이었고, 저는 30초를 아끼려고 그걸 낯선 이들에게 막 건넨 참이었습니다.

그게 제가 다시는 겪지 않기로 마음먹은 문제입니다. 알고 보니 답은, 업로드가 애초에 전혀 필요 없었다는 것이었습니다.

옛 방식: 낯선 이의 컴퓨터 빌리기

전통적인 온라인 변환기는 우편 주문 서비스처럼 작동합니다. 파일을 서버로 올려 보냅니다. 서버는 자기 기계에 설치된 소프트웨어로 변환을 돌립니다. 결과를 다시 내려 보냅니다. 여러분의 이미지는 통제할 수 없는 하드웨어를 한 바퀴 돌았고, 그 중간 어딘가에서 온전한 채로, 내 것이 아닌 디스크 위에 놓였습니다.

그 모델에 덧붙인 모든 개인정보 약속은 행동에 관한 약속입니다. 한 시간 뒤에 파일을 지운다, 아무도 안 본다. 어쩌면 지켜집니다. 어쩌면요. 확인할 방법이 없고, 파일의 실제 바이트를 걸고 그걸 믿는 것입니다. 신뢰가 구조 전체이고, 신뢰야말로 제가 쓰고 싶지 않았던 바로 그것이었습니다.

새 방식: 브라우저에 이미 컴퓨터가 있다

바뀐 게 이겁니다. 요즘 브라우저는 WebAssembly, 줄여서 WASM이라는 것을 통해 진짜로 컴파일된 프로그램을 네이티브에 가까운 속도로 돌릴 수 있습니다. 예전에 서버에 살던 이미지 코덱, 즉 PNG를 읽고 WebP를 인코딩하고 HEIC를 디코딩하는 코드가 WASM으로 컴파일되어 이미 열려 있는 그 브라우저 탭 안에서 돌아갈 수 있습니다.

그래서 이렇게 만들어진 페이지에 파일을 끌어다 놓으면, 변환 소프트웨어가 웹 페이지의 다른 부분처럼 한 번 내 기기로 내려받아집니다. 그때부터 실제 작업, 즉 이미지를 읽고 트랜스코딩하고 새 파일을 쓰는 일은 내 프로세서, 내 메모리에서 일어납니다. 결과는 곧장 다운로드로 돌려받습니다. 파일은 어디로도 보내지지 않습니다. 보낼 곳이 없기 때문입니다. 애초에 흐름 안에 서버가 없습니다.

그래서 저는 파일이 기기를 절대 벗어나지 않는다고, 방침이 아니라 사실로서 말할 수 있습니다. 제가 안 보겠다고 약속하는 게 아닙니다. 여러분의 이미지가 제게 닿는 경로 자체가 없는 것입니다. 법원이 명령해도 여러분의 사진을 꺼내 올 수 없습니다. 애초에 제 쪽 선 위에 있던 적이 없으니까요. 개인정보 보호는 위에 얹은 기능이 아닙니다. 코드가 어디서 돌아가느냐의 결과입니다.

사실인지 확인하는 법

제 말을 믿을 필요가 없고, 그게 제가 가장 좋아하는 부분입니다. 브라우저 개발자 도구를 열고, 네트워크 탭을 지켜보며 파일을 변환해 보세요. 페이지와 WASM 코덱이 한 번 내려받아지는 게 보일 겁니다. 여러분의 이미지가 올라가는 건 보이지 않습니다. 더 좋은 방법이 있습니다. 페이지를 띄우고, 와이파이를 끈 채로 그래도 뭔가를 변환해 보세요. 여전히 됩니다. 필요한 모든 게 이미 내 기기에 있으니까요. 파일을 업로드하는 도구는 이걸 못 합니다. 이건 됩니다.

하나의 진짜 한계

정직하겠다고 했으니 말합니다. 변환을 내 기기에서 돌린다는 건 내 메모리를 쓴다는 뜻이고, 브라우저 탭이 쓸 수 있는 메모리는 무한하지 않습니다.

평범한 파일, 즉 사진, 스크린샷, 로고처럼 사람들이 온종일 변환하는 것에는 문제가 안 됩니다. 하지만 정말로 거대한 것, 극단적 해상도의 이미지 한 장이나 한꺼번에 도는 방대한 묶음을 던지면 천장에 닿을 수 있습니다. 이미지를 디코딩한다는 건 압축이 풀린 픽셀을 메모리에 들고 있다는 뜻이고, 이는 디스크의 파일보다 훨씬 크며, 거대한 이미지는 탭에 허용된 양을 소진시킬 수 있습니다. 그러면 변환이 기어가듯 느려지거나 탭이 포기합니다.

64GB 램을 가진 서버는 그런 문제가 전혀 없습니다. 그러니 거래를 있는 그대로 말하면 이렇습니다. 서버 방식 변환기는 여러분의 기기가 감당할 수 없는 파일도 씹어 넘길 수 있습니다. 이 방식은 못 합니다. 대신 얻는 것은, 파일이 여러분의 손을 절대 벗어나지 않는다는 점입니다. 사람들이 실제로 변환하는 것의 압도적 다수에는, 두 번 생각할 것 없이 할 만한 거래입니다. 드물게 괴물 같은 파일에는 진짜 한계이고, 없는 척하기보다 말씀드리는 편을 택합니다.

그래도 이게 옳은 기본값이라 보는 이유

대부분의 변환은 애초에 서버에 닿을 필요가 없던 평범한 파일입니다. 업로드는 브라우저가 이 일을 스스로 못 하던 시절의 잔재였을 뿐입니다. 이제는 할 수 있습니다. 그래서 제정신인 기본값이 뒤집혔습니다. 파일을 내 기기에 두고, 작업을 로컬에서 하며, 내 하드웨어가 정말로 감당 못 하는 드문 경우에만 서버를 꺼내는 것입니다.

그게 여기 있는 모든 것의 발상 전체입니다. 그 불편했던 오후 뒤에 저 자신을 위해 만든 바로 그 사이트이고, 다시는 파일 확장자 하나 바꾸자고 개인 사진을 낯선 이에게 건네지 않으려는 것입니다. 알고 보니 그럴 필요가 없었습니다. 여러분도 마찬가지입니다.

관련 글


전체 글