여러 클라이언트에 안전하게 파일 저장 및 제공


8

우리는 사용자가 파일을 업로드 할 수있는 웹 앱을 개발 중입니다. 그러나 저장 공간이 제한되어 있으므로 이러한 파일을 VPS에 저장할 수 없으므로 S3를 사용하기로 결정했습니다.

주요 문제는 사용자가 자신의 데이터에만 액세스 할 수 있도록해야한다는 것입니다. 따라서 데이터베이스에 파일 목록과 해당 파일에 액세스 할 수있는 사용자 목록을 유지합니다. 서버는 사용자가 파일에 액세스 할 수 있는지 여부를 쉽게 결정할 수 있습니다. 그러나 실제로 파일을 사용자에게 제공하는 방법은 무엇입니까?

내가 이미 고려한 몇 가지 가능성이 있지만 실제로 가장 좋은 것은 없습니다.

1. PHP로 서명 된 URL 생성 (만료)

이것은 정말 간단한 접근 방법이며 빠르지 만 매우 추악하고 긴 URL을 생성합니다.

방법은 다음과 같습니다 .

2. 난독 화 된 URL

즉, S3에서 읽을 수 있도록 파일을 공개로 유지하지만 모든 파일은 다음과 같은 명명 된 폴더를 추측하기 어렵게 저장됩니다 24fa0b8ef0ebb6e99c64be8092d3ede20000. 그러나 이것이 가장 안전한 방법은 아닙니다. 폴더 이름을 추측 할 수 없더라도 (실제로 액세스 할 수 있기 때문에) 폴더 이름을 알고 나면 다른 사람 (권한이없는 사람과)과 해당 링크를 공유 할 수 있습니다.

3. 서버를 통해 파일을 다운로드하십시오

이는 파일이 S3에 의해 직접 제공되지 않지만 먼저 서버가 파일을 안전하게 읽고 제공한다는 의미입니다. 우리는 정말로 이것을 원하지 않습니다 :)

4. 리퍼러 확인

난독 화 된 URL 솔루션은 요청 (당신이 참조 페이지를 확인 S3를 설정할 수 있습니다) 우리의 서버에서 온다 "확실하게"에 의해 개선 될 수있다. 그러나 모든 브라우저가 리퍼러 데이터를 전송하는 것은 아니며 가짜 일 수도 있기 때문에 이는 매우 신뢰할 수없는 솔루션입니다.

다른 클라이언트에 대해 Amazon S3의 파일을 안전하게 제공하는 좋은 방법은 무엇입니까?


1
못생긴 / 긴 URL에 관심이있는 이유는 무엇입니까? 당신은 사용자를 입력하지 않습니다, 당신은?
ceejayoz

나는 URL이 사용자 경험의 일부라고 믿는다. 그리고 우리는 그것들이 너무 길고 추한 것을 원하지 않는다 :)
Tamás Pap

2
이 경우 보안과 안정성이 예쁜 URL보다 우선합니다. 이들은 블로그 게시물에 대한 영구 링크가 아닙니다.
ceejayoz

답변:


12

이것은 실제로 "내 시스템 아키텍처를 수행하십시오"와 관련이 있지만 네 가지 아이디어는 다양한 보안에 관한 흥미로운 사례 연구이므로 옵션을 실행하고 그 방법을 살펴 보겠습니다.


4. 리퍼러 확인

리퍼러는 클라이언트가 제공합니다. 클라이언트가 제공 한 인증 / 권한 부여 데이터를 신뢰하면 보안이 거의 무효화됩니다.
평결 : TERRIBAD 아이디어-우회하는 사소한.


3. 서버를 통해 파일을 다운로드하십시오

대역폭을 사용하기 위해 기꺼이 사용하고 서버가 안정적인 한 나쁜 생각은 아닙니다.
일반적인 서버 / 앱의 보안 문제를 이미 해결했다는 가정하에, 이것은 가장 안전한 옵션입니다.
평결 : 좋은 해결책. 대역폭이 중요한 경우 매우 안전하지만 차선책 일 수 있습니다.


2. 난독 화 된 URL

모호함을 통한 보안 ? 정말? 아니요
. 분석조차하지 않을 것입니다. 안돼.
평결 : # 4가 TERRIBAD 인 경우 사람들은 리퍼러 헤더를 위조하는 노력을 겪을 필요 가 없기 때문에 테리어 입니다. 문자열을 추측하고 모든 데이터를 수상 !


1. PHP로 서명 된 URL 생성 (만료)

이 옵션은 흡입 지수가 매우 낮습니다.
누구나 보안 URL 인 URL을 클릭하고 데이터를 검색 할 수 있지만 링크 수명이 짧으면 취약점 창이 작기 만하면 링크가 만료되도록하여이를 완화 할 수 있습니다.
URL이 만료 되면 다운로드 링크를 오랫동안 사용하지 않거나 적시에 링크를 얻지 못하는 일부 사용자에게 불편을 줄 수 있습니다. 이는 약간의 사용자 경험이지만 다소 가치가 있습니다. .
평결 : # 3만큼 좋지는 않지만 대역폭이 중요한 관심사라면 확실히 # 4 또는 # 2보다 낫습니다.


어떻게해야합니까?

이러한 옵션이 주어지면 # 3으로 이동합니다. 파일을 자신의 프런트 엔드 서버를 통해 전달하고 앱이 정상적으로 수행하는 방식을 인증합니다. 일반적인 보안이 꽤 괜찮다고 가정하면 보안 관점에서 가장 좋은 옵션입니다.
그렇습니다. 이는 서버에서 더 많은 대역폭을 사용하고 중개인을 위해 더 많은 리소스를 사용한다는 것을 의미합니다.


이것은 정말 유용한 분석이며 매우 감사합니다. # 3의 또 다른 큰 장점은 파일의 URL이 변경되지 않기 때문에 브라우저 캐싱을 많이 사용할 수 있다는 것입니다. 다시 한번 감사합니다.
Tamás Pap

# 3의 장점 인 @TamasPap은 얼마나 큰 이점이 캐싱을 구성 할 수 있는지 (그리고 사람들이 "새"컴퓨터에서 이러한 파일에 얼마나 자주 액세스하는지에 달려 있습니다.)
voretaq7


0

다른 방법도 있습니다.

AWS CloudFront를 S3 버킷으로 지정하고 서명 된 쿠키를 사용하여 최종 사용자에게 콘텐츠를 안전하게 제공 할 수 있습니다.

최종 사용자는 서버에 로그인하여 서명 된 쿠키를 받으면 파일에 액세스하는 동안 CDN으로 전송됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.