본문으로 건너뛰기
DEVKBS
작업 원장
005Vstro2022.12 – 2023.01보관

NFT Minter — 이미지 생성기

사용자가 올린 파일을 어디까지 믿을 것인가

기간
2022.12 – 2023.01
분류
도구
역할
프론트엔드 단독
구성
외주 프로젝트
화면 준비 중데스크톱 1600 × 1000 · 모바일 1080 × 2340

01개요

사용자가 직접 이미지를 올리고 문구를 넣어 결과물을 만드는 웹 생성기였습니다. 기능 자체는 단순해 보였지만, 실제로 만들어 보니 '사용자가 무엇이든 올릴 수 있다'는 사실이 이 프로젝트의 절반이었습니다.

파일 선택 버튼만으로는 흐름이 답답했습니다. 이미지를 다루는 도구에서 사용자는 파일을 끌어다 놓는 동작을 기대합니다. 그래서 드래그 앤 드롭을 붙였는데, 이때 사용자가 무엇을 놓을지 통제할 수 없다는 문제가 따라왔습니다. 폴더를 통째로 끌어놓거나, 확장자만 이미지인 파일을 놓거나, 수십 MB짜리 원본을 놓습니다.

문구 입력도 마찬가지였습니다. 결과물이 공개적으로 유통되는 성격이라, 부적절한 문구가 그대로 새겨지면 서비스 쪽 문제가 됩니다.

02기술 결정

문제가 무엇이었고, 무엇을 골랐고, 그래서 어떻게 됐는지.

  1. 결정 01

    업로드 결과를 만들기 전에 보여준다

    문제
    이미지를 올린 뒤 결과가 만들어지고 나서야 잘못 올린 걸 알게 되면, 사용자는 처음부터 다시 해야 합니다. 잘못 고른 파일은 생각보다 자주 생깁니다.
    선택
    파일을 놓는 즉시 브라우저에서 미리보기를 그려 주고, 그 상태에서 교체할 수 있게 했습니다. 서버에 보내는 것은 사용자가 확인한 뒤입니다.
    결과
    잘못 올린 파일 때문에 처음부터 다시 하는 일이 사라졌습니다. 서버로 가는 불필요한 요청도 함께 줄었습니다.
  2. 결정 02

    확장자는 이름일 뿐이라고 전제한다

    문제
    `.png`로 끝난다고 해서 그 파일이 이미지인 것은 아닙니다. 이름만 바꾼 파일을 올리면 그대로 통과합니다.
    선택
    브라우저에서 실제로 이미지로 읽히는지 먼저 확인하고, 크기와 형식은 서버에서 다시 검사하도록 나눴습니다. 브라우저 쪽 검사는 사용자에게 빨리 알려주기 위한 것이고, 실제 판정은 서버가 합니다.
    결과
    이름을 바꿔 올린 파일이 걸러졌습니다. '클라이언트 검증은 편의, 서버 검증은 안전'이라는 구분을 이 프로젝트에서 처음 명확히 정리했습니다.
  3. 결정 03

    금칙어는 코드가 아니라 목록으로 관리한다

    문제
    부적절한 문구를 막아야 했는데, 조건문으로 단어를 넣기 시작하면 단어가 추가될 때마다 배포를 해야 합니다. 운영자가 직접 손댈 수 없습니다.
    선택
    필터 대상을 코드 밖의 목록으로 빼서, 배포 없이 갱신할 수 있게 했습니다.
    결과
    운영 중 대응이 개발자를 거치지 않게 됐습니다. 정책성 데이터를 코드에 박지 않는 습관은 여기서 시작됐습니다.

03주요 기능

  • 드래그 앤 드롭 업로드

    파일을 끌어다 놓아 올리고, 잘못 놓은 파일은 그 자리에서 교체.

  • 즉시 미리보기

    서버로 보내기 전에 브라우저에서 결과를 먼저 확인.

  • 파일 검증

    실제 이미지 여부·크기·형식을 클라이언트와 서버 양쪽에서 검사.

  • 문구 필터링

    코드 밖 목록으로 관리되는 금칙어 필터.

04회고

사용자가 파일을 올리는 기능은 겉으로는 입력 폼 하나지만, 실제로는 신뢰 경계가 하나 생기는 일입니다. 이 프로젝트에서 그 사실을 처음 제대로 이해했고, 이후 Eurasia의 첨부 파일 문의 폼에서 같은 판단을 훨씬 빠르게 내릴 수 있었습니다.

짧은 프로젝트였지만 '정책은 코드 밖에 둔다'는 원칙을 얻었습니다. 운영 중에 바뀔 것이 뻔한 값을 코드에 넣어 두면 결국 개발자가 병목이 됩니다.