회사 서비스 중 S3 와 관련된 서비스가 있어요. 기능은 간단해요.
위 기능과 관계됬던 저번주 사건부터 정리해보죠.
파일이름에 발음기호를 넣어서 S3에 업로드하게 되었어요.
파닉스 음원 구분을 위해서 사용했고, "æ.mp3", "ɛ.mp3"
같은 이름을 가지고 있었죠.
저장과정은 순조롭게 이루어졌어요. JSON 도 잘 만들어졌구요.
문제는 발음을 들려주는 부분에서 발생했어요.
파일 목록을 가져온 후, S3 파일들을 가져오는 과정에서 몇몇 파일이 없다고 오류가 나기 시작하더라구요? (아니 그 파일이 분명히 S3 와 JSON 에 잘 있는걸 내 두 눈으로 봤는데? 파일이 없다고?)
급하게 제가 할 수 있는 선에서 확인하기 시작했죠.
그 어느곳에서도 이상을 찾지 못했고, 결국 전 미지의 세계로 떠나게 되었죠.
(저는 Front-end 개발자이지만, 간단한 서비스는 전체 다 볼 때가 있어요... 이번이 그래서 back-end 를 들여다봐야 했죠.)
문제는 API 서버에 있었는데요. API 에서 S3 파일을 찾는 과정에서 403 Not Found 가 생기더라구요.
(이 오류 메시지에 힌트가 있는데, 보이시나요?)
네, URL Encoding 과정에서 생기는 문제였지요.
파일 이름은 "æ.mp3"
이지만 S3 를 호출하는 과정에서 %c3%a6.mp3
로 바뀌어서 전달됬고, S3 는 두 이름이 다르다고 생각해서 찾지 못했던 거에요.
S3 호출시 content-type 을 json 으로 변경해주고 수정하면 되겠지만, 동시에 문득 궁금해졌어요.
파일 이름에 대한 가이드라인이 있을까?
.... 네 있더라구요.
여기 보면 Safe characters 와 Characters that might require special handling, Characters to avoid 로 나누어서 엄청 자세히 설명해주고 있어요.
링크에서 보는게 가장 정확하지만, 간단하게 아래 정리해볼께요.
Type | Detail |
---|---|
Alphanumeric characters | • 0-9 • a-z • A-Z |
Special characters | • Forward slash (/ )• Exclamation point ( ! )• Hyphen ( - )• Underscore ( _ )• Period ( . )• Asterisk ( * )• Single quote ( ' )• Open parenthesis ( ( )• Close parenthesis ( ) ) |
여기 있는 문자를 쓰게 되면, URL encoded 이나 HEX 를 사용해서 파일을 핸들링할수 있대요.
&
)$
)0–31 decimal
) and 7F (127 decimal
)@
)=
);
):
)+
),
)?
)당연하겠지만, 안쓰는게 좋습니다.
\
){
)^
)}
)%
)]
)>
)[
)~
)<
)#
)|
)이번 사건으로 이틀정도 삽질을 했지만, 정리할 내용이 많지 않아서 다행이다 싶기도 하고.. 동시에 좀 씁쓸해지네요.
마지막으로 제 느낀 점을 짧게 적을께요.