TUS는 재개 가능한 업로드를 위해 개발된 HTTP기반 오픈 프로토콜로 다양한 언어 및 플랫폼을 지원합니다.
multipart/form-data가 파일을 분할하여 하나의 packet으로 보낸다면 TUS Protocal의 경우 분할한 파일을 여러 packet으로 보낸다는 차이점이 있습니다.
클라이언트에서 파일의 업로드 사이즈가 지정된 POST 요청을 서버로 전송합니다
서버가 새 파일을 만들고 파일의 저장 장소를 응답 값으로 내줍니다.
POST /tus/upload HTTP/1.1
Host: 100.106.99.20:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:141.0) Gecko/20100101 Firefox/141.0
Accept: */*
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Tus-Resumable: 1.0.0
Upload-Length: 136185514
Upload-Metadata: filename S2FrYW9UYWxrXzIwMjUwODA3XzE0NTM1NDEyNS5tcDQ=,filetype dmlkZW8vbXA0
Origin: <http://100.106.99.20:3000>
Connection: keep-alive
Referer: <http://100.106.99.20:3000/>
Priority: u=0
Content-Length: 0
HTTP/1.1 204
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Location, Tus-Resumable, Upload-Offset, Upload-Length, Upload-Metadata
Tus-Resumable: 1.0.0
Location: /tus/upload/029e897d-4591-486a-8d94-82cf71eeb7ca
Upload-Expires: Thu, 07 Aug 2025 08:04:03 GMT
Date: Thu, 07 Aug 2025 07:04:03 GMT
Keep-Alive: timeout=60
Connection: keep-alive
중간에 네트워크 오류가 발생하거나 브라우저를 이탈했을 경우 HEAD 요청을 보내 파일의 현재 업로드 오프셋을 가져와 이미 업로드된 청크와 업로드할 청크를 확인합니다.
만약 파일 생성 요청이 expiration 설정값을 넘었다면 404에러를 발생하고 신교 생성 요청을 진행합니다.
HEAD /tus/upload/853ab38c-34f1-47be-b6b7-533947f106e7 HTTP/1.1
Host: 100.106.99.20:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:141.0) Gecko/20100101 Firefox/141.0
Accept: */*
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Tus-Resumable: 1.0.0
Origin: <http://100.106.99.20:3000>
Connection: keep-alive
Referer: <http://100.106.99.20:3000/>
Priority: u=0
HTTP/1.1 204
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Location, Tus-Resumable, Upload-Offset, Upload-Length, Upload-Metadata
Tus-Resumable: 1.0.0
Upload-Length: 136185514
Upload-Offset: 136185514
Cache-Control: no-store
Upload-Metadata: filename S2FrYW9UYWxrXzIwMjUwODA3XzE0NTM1NDEyNS5tcDQ=,filetype dmlkZW8vbXA0
Date: Thu, 07 Aug 2025 07:04:05 GMT
Keep-Alive: timeout=60
Connection: keep-alive
HTTP PATCH요청은 청크 단위로 분할된 파일을 업로드할 때 쓰입니다.
이는 업로드를 재개할 때 사용됩니다.
HEAD /tus/upload/853ab38c-34f1-47be-b6b7-533947f106e7 HTTP/1.1
Host: 100.106.99.20:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:141.0) Gecko/20100101 Firefox/141.0
Accept: */*
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Tus-Resumable: 1.0.0
Origin: <http://100.106.99.20:3000>
Connection: keep-alive
Referer: <http://100.106.99.20:3000/>
Priority: u=0