보이지 않는 이미지를 고치며 함께 본 것
외부 이미지 표시 요구를 사용 편의와 방문자 추적 위험으로 나누어 검토하고 내부 저장 방식으로 전환한 기록
- 문제
- 외부 이미지를 다시 보이게 하면서도 제3자가 방문자를 추적할 수 있는 위험을 줄여야 했다.
- 선택
- 외부 이미지를 직접 불러오는 대신 내부 저장소로 가져와 제공하는 방식을 택했다.
- 결과
- 기존 이미지 유실과 외부 이미지 표시, 영상 미리보기·재생 문제를 수정했고 표 편집에 관한 후속 요청이 남았다.
배포 뒤 한 운영 도구에서 외부 HTTPS 이미지가 보이지 않는다는 요청이 들어왔다. 겉으로는 이미지 주소를 다시 허용하면 끝나는 표시 오류처럼 보였다. 하지만 외부 이미지를 그대로 불러오는 순간, 화면을 연 방문자의 정보가 제3자에게 전달될 수 있었다.
사용자는 작성한 콘텐츠가 원래 모습대로 보이길 기대한다. 운영 도구라면 이미지를 넣을 때마다 출처와 보안 방식을 따져야 하는 부담도 적어야 한다. 그렇다고 편의를 이유로 외부 자원을 무조건 허용할 수는 없었다. 이번 작업의 핵심은 이미지를 표시할지 말지가 아니라, 누가 이미지를 제공하게 할지에 있었다.
문제를 다시 정의하기
처음 접수된 문제는 외부 이미지가 보이지 않는 현상이었다. 이를 단순한 화면 오류로 다루면 외부 주소를 직접 읽도록 되돌리는 방법이 가장 짧다. 그러나 그렇게 고치면 사용자가 콘텐츠를 보는 동안 제3자가 방문 사실을 알 수 있는 여지가 생긴다.
그래서 문제를 두 부분으로 나눴다. 작성자에게는 외부 이미지를 어렵지 않게 사용할 수 있어야 했고, 방문자에게는 외부 제공자와 직접 연결되지 않는 표시 방식이 필요했다. 기능 복구와 보안 검토를 별도 과제로 두지 않고 하나의 요구사항으로 묶었다.
선택지를 나눈 기준
판단 기준은 사용 흐름을 얼마나 유지하는지, 방문자가 외부 제공자와 직접 연결되는지였다. 외부 이미지를 원래 주소에서 곧바로 불러오면 작성 방식은 단순하다. 반면 표시할 때마다 외부 요청이 발생해 방문자 추적 위험을 남긴다.
다른 방법은 외부 이미지를 내부 저장소로 가져온 뒤 내부 서비스가 제공하는 것이다. 사용자는 외부 이미지를 계속 활용할 수 있고, 방문자는 원본 제공자에게 직접 이미지를 요청하지 않는다. 작업 범위는 커지지만 편의와 위험을 함께 다룰 수 있는 쪽이었다.
내린 결정과 실행
외부 이미지를 직접 노출하는 대신 내부 저장소로 가져와 제공하는 방향으로 작업했다. 보안상의 이유로 기능을 막아 두는 데서 멈추지 않고, 사용자가 기대한 표시 경험을 다른 구조로 복원하는 선택이었다.
이미지 처리 방식만 바꾸면 관련 문제가 모두 끝나는 상황은 아니었다. 기존 이미지가 사라지는 현상과 외부 이미지 표시 문제를 함께 수정했고, 같은 콘텐츠 영역에서 발생한 영상 미리보기와 재생 문제도 손봤다. 개별 증상을 따로 봉합하기보다 콘텐츠가 저장되고 다시 표시되는 흐름을 기준으로 범위를 잡았다.
결과와 남은 문제
기존 이미지 유실과 외부 이미지 표시 문제를 수정했고, 영상 미리보기와 재생도 다시 다뤘다. 외부 이미지를 보여 달라는 요구는 유지하면서 방문자가 제3자에게 직접 연결되는 위험은 내부 저장 방식으로 줄이는 방향을 택했다.
이후에는 표에 행과 열을 추가할 때 기본값을 가운데 정렬로 해 달라는 요청이 들어왔다. 보안과 직접 관련된 문제는 아니지만, 운영 도구의 완성도는 저장 구조뿐 아니라 반복 작업에서 느끼는 작은 불편에도 좌우된다는 점을 확인했다.
다음에 적용할 원칙
표시되지 않는 외부 콘텐츠 문제를 만나면 허용 여부부터 결정하지 않는다. 먼저 콘텐츠를 누가 가져오고, 방문자의 요청이 어디까지 전달되는지 확인한다. 같은 화면을 만들더라도 전달 구조에 따라 위험은 달라진다.
보안 때문에 기존 사용 흐름을 없애야 한다고 단정하지도 않는다. 직접 연결을 내부 저장과 제공 방식으로 바꿀 수 있다면 편의를 남길 선택지가 생긴다. 기능 요구와 보안 요구가 부딪힐 때는 어느 한쪽을 포기하기 전에, 두 요구가 충돌하는 지점을 구조 안에서 옮길 수 있는지부터 살펴보려 한다.