보안 미디어 업로드 만료

보안 미디어 업로드 관련 문제를 겪고 있는 고객이 있습니다.
해당 고객은 AWS S3와 보안 미디어가 활성화된 Docker 기반 Discourse(공식 설치)를 사용하고 있습니다.

포럼에는 여러 개의 mp3 및 m4a 음원 파일이 있습니다.

Discourse는 자동으로 다음과 같은 멋진 재생기를 임베드합니다:

image

문제: 음원 파일이 안정적으로 작동하지 않습니다. 때로는 재생되지 않습니다.

이 문제는 100% 재현할 수 없는데, 캐싱 때문이라고 생각합니다. 다운로드가 재생 버튼을 누를 때까지 지연되는 것 같습니다. 이는 논리적이고 좋은 동작처럼 보입니다.

하지만 보안 미디어 업로드와 잘 맞지 않습니다 - 페이지를 열려 둔 채 1분 정도 지나서 재생 버튼을 누르면, 음원 파일이 (항상) 재생되지 않습니다. 그 시점에서 AWS는 403 Expired 오류를 반환합니다. 요청이 파일이 요청되는 시점에 서명되는 것이 아니라, 그보다 이전 시점에 서명되는 것처럼 보입니다. 오류 메시지는 요청이 과거에 만료되었음을 명확히 나타냅니다.

이것이 지연과 관련 있다고 의심하지만, 100% 확신은 하지 않습니다. 사실, 이것은 음원 파일에만 발생하며(즉, 항상 즉시 다운로드되는 임베드 이미지는 해당되지 않음) 합니다.

네, 서버 시간은 정확합니다.

최신 베타를 실행 중인 새 설치 환경에서 재현할 수 있습니다. 주제에 음원 파일 두 개를 넣고 조금만 조작해 보면 됩니다.

2개의 좋아요

이는 브라우저가 오디오 및 비디오 태그와 preload의 기본값을 처리하는 방식 때문일 수 있습니다. 파일이 특별히 큰가요? AFAIK(제 지식 범위 내에서) 브라우저는 필요에 따라 바이트 레인지를 사용하여 파일을 다운로드합니다.

4개의 좋아요

아니요, 길지는 않습니다. 파일은 몇 개(5MB 미만)에 불과하며, 범위 다운로드(range download)도 되지 않습니다.

preload의 기본값이 뭐라는 뜻인가요?

<audio> 또는 <video> 태그를 사용 중이라면, 해당 태그에 preload=auto 속성을 설정하면 브라우저가 페이지 로드 시 전체 파일을 다운로드하도록 힌트를 줄 수 있습니다. 이렇게 하면 서명된 S3 URL이 만료되는 문제를 겪지 않을 수 있습니다.

하지만 이런 속성은 남용되는 경우가 많아서, 이제 브라우저가 이를 무조건적으로 따르는 것은 아닙니다. 다만 브라우저가 고려하는 힌트로는 여전히 기능합니다.

6개의 좋아요

명시적인 <audio> 태그는 없으며, 오디오 파일이 삽입될 때 Discourse가 자동으로 생성합니다. preload 속성 없이요.

아직 이해가 안 되는 부분: /secure-media-uploads 라우트가 서명된 URL을 생성하고 있다면, 페이지 로드와 라우트 요청 사이에 얼마나 많은 시간이 흐르느냐가 왜 중요한가요? 결국 서명된 라우트를 생성한 후 즉시 해당 URL로 리다이렉트하는 것이니까요. 그런데 어째서인지 실제로는 차이가 나는 것 같습니다. 뭔가 캐싱이 이루어지고 있는 건가요?

제가 말하고 있는 것은 게시물 마크다운에서 생성된 HTML 안의 태그입니다. 해당 설정이 활성화되어 있을 때 그 속성을 추가하는 것이 합리적이라고 생각합니다.

이 기능의 핵심은 정확히 그 점이라고 생각합니다. 업로드 파일을 다른 곳에 공유할 수 없는 URL을 만드는 것인데, 이를 가능하게 하는 유일한 방법은 만료되는 URL을 사용하는 것입니다.

5개의 좋아요

네, 그 점은 이해하고 있습니다. 그리고 만료 타이머는 페이지가 로드될 때가 아니라 /secure-media-uploads 라우트가 호출되는 순간부터 카운트가 시작됩니다.

그럼에도 불구하고, 페이지가 라우트가 호출되기 훨씬 전에 로드된 경우 문제가 발생하는 것처럼 보입니다. 그리고 그렇게 되면 어떤 방식으로든 오류가 납니다. 왜 이런 일이 일어나는지는 도무지 모르겠습니다.

이 문제는 이제 FIX: Disable preloading audio + video when secure media enabled (#8922) · discourse/discourse@7ff58f1 · GitHub 에서 수정되었습니다. @RGJ. 이 문제는 브라우저가 오디오 및 비디오 파일의 메타데이터(예: 재생 시간)를 가져오기 위해 초기 요청을 보내기 때문에 발생했습니다. 그러나 보안이 있는 사전 서명된 URL(presigned URL)을 사용했기 때문에 이 초기 요청이 15초 만료 카운트다운을 시작하게 되어, 사용자가 해당 시간 이후에 오디오 및 비디오를 재생하려고 하면 AWS에서 403 오류가 발생했습니다.

이제 보안 미디어가 활성화된 경우 비디오 및 오디오의 미리 로드(preloading)를 비활성화했습니다. 오디오 및 비디오가 포함된 기존 게시물의 경우 변경 사항을 확인하려면 HTML을 다시 빌드해야 합니다.

13개의 좋아요