보안 미디어 업로드 관련 문제를 겪고 있는 고객이 있습니다.
해당 고객은 AWS S3와 보안 미디어가 활성화된 Docker 기반 Discourse(공식 설치)를 사용하고 있습니다.
포럼에는 여러 개의 mp3 및 m4a 음원 파일이 있습니다.
Discourse는 자동으로 다음과 같은 멋진 재생기를 임베드합니다:
문제: 음원 파일이 안정적으로 작동하지 않습니다. 때로는 재생되지 않습니다.
이 문제는 100% 재현할 수 없는데, 캐싱 때문이라고 생각합니다. 다운로드가 재생 버튼을 누를 때까지 지연되는 것 같습니다. 이는 논리적이고 좋은 동작처럼 보입니다.
하지만 보안 미디어 업로드와 잘 맞지 않습니다 - 페이지를 열려 둔 채 1분 정도 지나서 재생 버튼을 누르면, 음원 파일이 (항상) 재생되지 않습니다. 그 시점에서 AWS는 403 Expired 오류를 반환합니다. 요청이 파일이 요청되는 시점에 서명되는 것이 아니라, 그보다 이전 시점에 서명되는 것처럼 보입니다. 오류 메시지는 요청이 과거에 만료되었음을 명확히 나타냅니다.
이것이 지연과 관련 있다고 의심하지만, 100% 확신은 하지 않습니다. 사실, 이것은 음원 파일에만 발생하며(즉, 항상 즉시 다운로드되는 임베드 이미지는 해당되지 않음) 합니다.
네, 서버 시간은 정확합니다.
최신 베타를 실행 중인 새 설치 환경에서 재현할 수 있습니다. 주제에 음원 파일 두 개를 넣고 조금만 조작해 보면 됩니다.
명시적인 <audio> 태그는 없으며, 오디오 파일이 삽입될 때 Discourse가 자동으로 생성합니다. preload 속성 없이요.
아직 이해가 안 되는 부분: /secure-media-uploads 라우트가 서명된 URL을 생성하고 있다면, 페이지 로드와 라우트 요청 사이에 얼마나 많은 시간이 흐르느냐가 왜 중요한가요? 결국 서명된 라우트를 생성한 후 즉시 해당 URL로 리다이렉트하는 것이니까요. 그런데 어째서인지 실제로는 차이가 나는 것 같습니다. 뭔가 캐싱이 이루어지고 있는 건가요?