앱 서버는 권한을 확인하고 서명된 주소만 내려줍니다. 파일은 클라이언트가 스토리지로 직접 보내고, 스토리지가 그 서명을 검증합니다. 앱이 경로에서 빠지므로 파일 크기가 앱의 부담과 무관해집니다.
그 대가로 앱은 업로드를 보지 못합니다. 서명이 무엇을 담고 무엇을 못 하는지를 아는 것이 이 개념의 전부입니다.
서명에 조건을 박는다
서명은 단순한 접근 허가가 아니라 조건이 붙은 허가입니다. 조건을 서명에 넣으면 스토리지가 대신 거절해 줍니다.
| 조건 | 넣지 않으면 |
|---|---|
| 만료 | 주소가 유출되면 영구 업로드 권한이 된다 |
| 크기 상한 | 100GB 를 올려 요금과 디스크를 태울 수 있다 |
| 콘텐츠 타입 | 이미지 자리에 실행 파일이 들어온다 |
| 대상 경로 | 남의 경로에 덮어쓸 수 있다 |
만료는 짧게 잡습니다. 업로드를 시작할 시간만 있으면 되고, 큰 파일은 시작 후 오래 걸려도 됩니다. 서명이 만료돼도 진행 중인 전송은 끊기지 않기 때문입니다.
앱이 모른다는 문제
파일이 앱을 거치지 않으니 앱은 세 가지를 모릅니다. 업로드가 끝났는지, 무엇이 올라갔는지, 그것이 유효한지입니다.
그래서 완료 통보 경로를 따로 만듭니다. 방법은 둘입니다.
| 방법 | 동작 | 약점 |
|---|---|---|
| 클라이언트가 알린다 | 업로드 후 앱에 완료 요청을 보낸다 | 클라이언트가 죽으면 통보가 안 온다 |
| 스토리지가 알린다 | 객체 생성 이벤트를 앱이 받는다 | 지연이 있고 이벤트 유실 대비가 필요하다 |
실무에서는 둘을 함께 씁니다. 빠른 경로는 클라이언트 통보, 안전망은 스토리지 이벤트입니다. 한쪽만 두면 통보를 못 받은 파일이 스토리지에만 남습니다.
클라이언트 검사는 통제가 아니다
서명을 발급할 때 클라이언트가 보낸 파일명과 크기를 그대로 믿으면 안 됩니다. 클라이언트는 고쳐 보낼 수 있는 쪽입니다. 조건은 서명 안에 박아야 스토리지가 강제합니다.
이 구분이 면접에서 자주 갈립니다. 크기 제한을 화면에서만 하고 서명에 넣지 않으면, 요청을 직접 만들어 보내는 것으로 우회됩니다.