우리네 장

itms-services 프로토콜을 통한 S3 presigned url 접근 실패.. 본문

작업/온라인 아카데미

itms-services 프로토콜을 통한 S3 presigned url 접근 실패..

qpmi1zm29 2023. 12. 30. 20:11
📝 문제 상황

 

사용자가 앱을 처음 키게 되면, 네이티브 단에서 서버로 버전 체크 API를 요청하게 됩니다.

버전 업데이트가 필요한 경우, 앱 파일을 다운받을 수 있는 s3 링크를 내려주게 되는데,  private S3를 사용했기 때문에 아래 이미지처럼 보안 토큰이 포함된 presigned Url을 응답으로 내려주었습니다.

 

그런데 iOS의 경우, itms-services 프로토콜을 이용해서 해당 url에 접근 할 때, 정상적으로 파일이 다운로드 받아지지 않았습니다..

보안토큰 없이 https://presigned-url.ap-northeast-2.s3/test/xxx.ipa 로 public 하게 접근하면 정상 다운로드가 되는데 말이죠..! 

혹시나 하여, url에 포함된 토큰 부분의 인코딩을 바꿔보는 등 여러 방법을 시도하여 호출하려고 하였으나 해결이 되지 않았습니다.. 😢

 

그래서 CloudFront 를 도입하게 되었는데요!

 

👍 해결 방법 

 

고객사의 보안 요건으로 인해서 public S3를 쓸 수 있는 상황이 아니었습니다.

그래서 앱 설치 파일이 존재하는 S3의 특정 경로를 Origin으로 하여 CloudFront를 붙이고, CloudFront 배포를 통해 발급된 도메인을 public 하게 열어 사용하였습니다.

 

 

CloudFront 란?

 

AWS에서 제공하는 CDN ( Content Delivery Network ) 과 유사한 서비스 입니다.

차이점이라면 CDN은 정적 컨텐츠만 제공이 가능하나, CloudFront는 실질적으로 http 프로토콜을 통해 제공될 수 있는 모든 컨텐츠를 제공할 수 있습니다.

 

 

CloudFront는 CDN과 마찬가지로 캐싱 기법을 사용하는 기술입니다.

주로 정적 콘텐츠를 제공하기 때문에 Origin은 S3 버킷이나 Http 웹 서버가 대상입니다.

세계 곳곳에 Edge 서버를 두고 사용자와 가장 가까운 Edge 서버로부터 html, js, css 등의 정적 파일이나, 이미지, 동영상 등의 멀티미디어 파일을 사용자에게 제공합니다.

 

 

Origin 서버에 컨텐츠를 업로드  한 후, CloudFront를 배포하면 도메인이 발급되는데요. ( 사용자 임의로 도메인을 설정할 수도 있습니다. )

해당 도메인을 통해 접근하면, DNS 서버가 Edge 서버로 사용자의 요청을 라우팅 해줍니다.

 

즉, 제가 앱을 진입할 시 업데이트가 필요하여 ipa 파일을 다운 받게 되면, 이는 s3 버킷이 아닌 저와 가까운 어딘가에 존재하는 Edge 서버에서 저에게 응답을 해주는 것이죠!

 

Edge 서버에서는 캐싱한 컨텐츠를 TTL ( Time To Live ) 단위로 보유하고 있으며, 이후에는 만료되어 접근할 수 없습니다.

기본 : 24시간 

최소 : 1초

최대 : 365일 입니다.

 

주기적으로 변경이 필요한 파일일 경우에는, TTL 단위를 짧게 설정해야 Edge 서버에서 최신 파일을 가지고 있을 겁니다.

 

제 경우에는 해당하지 않지만, CloudFront를 사용하는 가장 큰 이점 용량이 큰 컨텐츠를 WAS를 거치지 않고 제공하기 때문에, 서버의 부하를 줄일 수 있다는 점인것 같습니다.

 

 

Edge 서버에 사용자가 필요로 하는 컨텐츠가 존재하지 않는 경우

 

1. 사용자가 A 컨텐츠를 CloudFront에 요청합니다.

2. 사용자와 가장 가까운 Edge 서버를 확인합니다.

3. 캐시된 A 컨텐츠가 존재하지 않을 경우 ( 만료된 상황 포함 ), 사용자 요청을 Origin 서버로 라우팅 합니다.

4. Origin 서버 → Edge 서버 로 A 컨텐츠를 보내주는데

5. A 컨텐츠의 byte가 Edge 서버로 접근되자마자, 사용자에게 전달해주고, 해당 컨텐츠를 캐싱하게 됩니다.

6. 이후 같은 컨텐츠의 요청이 오면 Edge 서버에서 제공해줍니다.