안전한 파일 이름 for AWS S3

제레인트20·2021년 1월 24일
0
post-thumbnail

파일이 있는데.. 없다구요?

회사 서비스 중 S3 와 관련된 서비스가 있어요. 기능은 간단해요.

  • 저장: Local 에서 Upload 한 파일을 S3에 저장 → 파일 목록 JSON 만들기
  • 불러오기: 파일 목록 가져오기 → 목록에 따라 S3 파일 불러오기

위 기능과 관계됬던 저번주 사건부터 정리해보죠.

사건의 발단

파일이름에 발음기호를 넣어서 S3에 업로드하게 되었어요.
파닉스 음원 구분을 위해서 사용했고, "æ.mp3", "ɛ.mp3" 같은 이름을 가지고 있었죠.
저장과정은 순조롭게 이루어졌어요. JSON 도 잘 만들어졌구요.

문제상황 발생

문제는 발음을 들려주는 부분에서 발생했어요.

파일 목록을 가져온 후, S3 파일들을 가져오는 과정에서 몇몇 파일이 없다고 오류가 나기 시작하더라구요? (아니 그 파일이 분명히 S3 와 JSON 에 잘 있는걸 내 두 눈으로 봤는데? 파일이 없다고?)

급하게 제가 할 수 있는 선에서 확인하기 시작했죠.

  • S3에서 파일을 직접 다운로드 받아서 제대로 실행되는지 확인
  • 업로드시에 문제가 없는지 지웠다가 다시 업로드도 해보기
  • Network확인
  • API Client 호출체크
  • JSON 목록 확인

그 어느곳에서도 이상을 찾지 못했고, 결국 전 미지의 세계로 떠나게 되었죠.
(저는 Front-end 개발자이지만, 간단한 서비스는 전체 다 볼 때가 있어요... 이번이 그래서 back-end 를 들여다봐야 했죠.)

원인 파악

문제는 API 서버에 있었는데요. API 에서 S3 파일을 찾는 과정에서 403 Not Found 가 생기더라구요.

(이 오류 메시지에 힌트가 있는데, 보이시나요?)

네, URL Encoding 과정에서 생기는 문제였지요.
파일 이름은 "æ.mp3" 이지만 S3 를 호출하는 과정에서 %c3%a6.mp3 로 바뀌어서 전달됬고, S3 는 두 이름이 다르다고 생각해서 찾지 못했던 거에요.

S3 호출시 content-type 을 json 으로 변경해주고 수정하면 되겠지만, 동시에 문득 궁금해졌어요.

파일 이름에 대한 가이드라인이 있을까?

Object key naming guidelines (AWS S3 파일 이름 가이드라인)

.... 네 있더라구요.

여기 보면 Safe characters 와 Characters that might require special handling, Characters to avoid 로 나누어서 엄청 자세히 설명해주고 있어요.
링크에서 보는게 가장 정확하지만, 간단하게 아래 정리해볼께요.

Safe characters

TypeDetail
Alphanumeric characters• 0-9
• a-z
• A-Z
Special characters• Forward slash (/)
• Exclamation point (!)
• Hyphen (-)
• Underscore (_)
• Period (.)
• Asterisk (*)
• Single quote (')
• Open parenthesis (()
• Close parenthesis ())

Characters that might require special handling

여기 있는 문자를 쓰게 되면, URL encoded 이나 HEX 를 사용해서 파일을 핸들링할수 있대요.

  • Ampersand (&)
  • Dollar ($)
  • ASCII character ranges 00–1F hex (0–31 decimal) and 7F (127 decimal)
  • 'At' symbol (@)
  • Equals (=)
  • Semicolon (;)
  • Colon (:)
  • Plus (+)
  • Space – Significant sequences of spaces might be lost in some uses (especially multiple spaces)
  • Comma (,)
  • Question mark (?)

Characters to avoid

당연하겠지만, 안쓰는게 좋습니다.

  • Backslash (\)
  • Left curly brace ({)
  • Non-printable ASCII characters (128–255 decimal characters)
  • Caret (^)
  • Right curly brace (})
  • Percent character (%)
  • Grave accent / back tick (```)
  • Right square bracket (])
  • Quotation marks
  • 'Greater Than' symbol (>)
  • Left square bracket ([)
  • Tilde (~)
  • 'Less Than' symbol (<)
  • 'Pound' character (#)
  • Vertical bar / pipe (|)

느낀점

이번 사건으로 이틀정도 삽질을 했지만, 정리할 내용이 많지 않아서 다행이다 싶기도 하고.. 동시에 좀 씁쓸해지네요.
마지막으로 제 느낀 점을 짧게 적을께요.

  1. 모든 것에 대해선 공식 문서나 가이드가 있는지 찾아보고 진행하자.
  2. 앞으로는 파일명 및 변수명을 지을때, safe characters 에 맞춰서 짓도록 하자. 언제 내 파일이 s3 에서 문제를 일으킬지 모른다.

출처

profile
글쓰고 코딩하는 직장인

0개의 댓글