LabHub

오브젝트 스토리지와 S3 · 접근 제어(정책·프리사인드 URL) · 실습

프리사인드 URL 생성하고 검증하기

LabHub 에서 이어서 보기

목표

프리사인드 URL 을 만들고 써 보고 만료시켜 보면서, 바이트를 앱 서버로 통과시키지 않고 접근 권한만 위임하는 방식을 손에 익힌다.

왜 중요한가

사용자 파일 다운로드를 앱 서버가 중계하는 구현은 소규모에서는 잘 돕니다. 문제는 500MB 동영상 100개가 동시에 요청될 때입니다. 앱 서버가 50GB 를 중계하면서 워커가 묶이고, 대역폭이 앱 서버 스펙에 갇히고, 버퍼링을 잘못하면 OOM 이 납니다. 프리사인드 URL 은 이 구조를 뒤집습니다 — 앱은 권한을 판단해 몇 바이트짜리 서명된 URL 만 만들고, 실제 전송은 클라이언트와 스토리지 사이에서 직접 일어납니다. 7번 스텝에서 URL 을 분해해 보면 왜 이것이 안전한지가 보입니다. 서명은 시크릿 키로 만들어졌지만 시크릿 키 자체는 URL 어디에도 없습니다. 그래서 URL 이 새어도 그 객체, 그 동작, 그 만료 시간까지만 노출됩니다.

단계

1. local/lab-media/private/secret.txt/opt/fixtures/s3/readme.txt 를 올린다.
2. 서명 없이 curl -o /dev/null -w '%{http_code}' http://127.0.0.1:9000/lab-media/private/secret.txt 를 실행하고 /root/ps/anon.txtstatus=403 을 적는다.
3. /root/ps/presign.py 로 만료 300초의 프리사인드 GET URL 을 만들어 /root/ps/get_url.txt 에 한 줄 저장한다. URL 에 X-Amz-SignatureX-Amz-Expires 가 있어야 한다.
4. 그 URL 로 내려받아 /root/ps/downloaded.txt 를 만든다. 원본과 내용이 같아야 한다.
5. 만료 1초짜리 URL 을 만들고 3초 기다린 뒤 사용한다. /root/ps/expired.txtstatus=403 을 적는다.
6. 만료 300초의 프리사인드 PUT URL 로 /opt/fixtures/s3/sales.csvlocal/lab-media/upload/direct.csv 에 올린다. mc stat 으로 존재를 확인한다.
7. /root/ps/sig.md 에 마크다운 표를 쓴다. 행 제목은 X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-SignedHeaders, X-Amz-Signature 여섯 개이고 각 행에 그 파라미터의 뜻을 적는다. 파일에 시크릿 키 값이 들어 있으면 안 된다.

참고

단계 7개

  1. 비공개 객체 준비하기
  2. 익명 접근이 거부되는지 확인하기
  3. 프리사인드 GET URL 만들기
  4. 프리사인드 URL 로 실제 받아 보기
  5. 만료된 URL 이 거부되는지 확인하기
  6. 프리사인드 PUT 으로 직접 업로드하기
  7. 서명 요소 분석하기