|
| 1 | +# 13장: 콘텐츠 배포 네트워크 설계하기 |
| 2 | +## CDN의 장단점 |
| 3 | +- 장점: |
| 4 | + - 낮은 지연 시간 |
| 5 | + - 확장성: 서드파티를 사용하면 자사 시스템을 확장하지 않아도 됨 |
| 6 | + - 낮은 단위 비용: 더 많은 트래픽일수록 CDN에서 대량 할인 |
| 7 | + - 높은 처리량 / 높은 가용성 |
| 8 | +- 단점: |
| 9 | + - 추가적인 DNS 조회 / 추가적인 실패 지점 |
| 10 | + - 트래픽이 적은 경우 높은 단위 비용 |
| 11 | + - CDN 마이그레이션 |
| 12 | + - 특정 지역에 새로운 CDN으로 |
| 13 | + - 회사 망함 |
| 14 | + - CDN이 SLA를 제대로 이행하지 않아서 |
| 15 | + - 보안과 프라이버시 우려, JS 라이브러리에 악성 코드를 삽입할 수 있음 |
| 16 | + - 일부 국가나 조직에서 특정 CDN의 IP를 차단할 수 있음 |
| 17 | + |
| 18 | +## CDN 인증과 권한 부여 단계 |
| 19 | +- CDN은 각 사용 업체에게 비밀 키를 발급하고, 이 비밀 키로 접근 토큰을 생성할 수 있는 SDK나 라이브러리를 제공 |
| 20 | + |
| 21 | +```mermaid |
| 22 | +sequenceDiagram |
| 23 | + actor User as 사용자 |
| 24 | + participant Client as 클라이언트 |
| 25 | + participant Service as 우리 서비스 |
| 26 | + participant SDK as CDN SDK/라이브러리 |
| 27 | + participant Store as 토큰 저장소 |
| 28 | + participant CDN as CDN |
| 29 | +
|
| 30 | + User->>Client: 인증 요청 |
| 31 | + Client->>Service: 로그인/인증 요청 |
| 32 | + Service->>SDK: 접근 토큰 생성 요청<br/>비밀 키, CDN URL, 만료 기한,<br/>Referrer, 허용 IP, 허용 국가/지역 |
| 33 | + SDK-->>Service: CDN 접근 토큰 |
| 34 | + Service->>Store: 토큰 저장<br/>필요하면 암호화 후 저장 |
| 35 | + Service-->>Client: 접근 토큰 반환 |
| 36 | +
|
| 37 | + Client->>Service: CDN 자산 URL 요청 |
| 38 | + Service->>Service: 접근 토큰으로 CDN URL 서명 |
| 39 | + Service-->>Client: 서명된 CDN URL |
| 40 | + Client->>CDN: GET 서명된 URL<br/>Referrer 헤더 포함 |
| 41 | + CDN->>CDN: 토큰, 만료 기한, Referrer,<br/>IP, 국가/지역 정책 검증 |
| 42 | + alt 접근 허용 |
| 43 | + CDN-->>Client: CDN 자산 반환 |
| 44 | + else 접근 거부 |
| 45 | + CDN-->>Client: 403 Forbidden |
| 46 | + end |
| 47 | +``` |
| 48 | + |
| 49 | +- 토큰 삭제는 비동기적으로 처리할 수 있고, 로그아웃이 자주 일어나는 이벤트가 아니므로 동기적으로 처리할 수도 있음 |
| 50 | +- 비동기 삭제를 사용하면 CDN 업체에 일시적인 문제가 생겼을 때 토큰이 삭제되지 않을 수 있음 |
| 51 | + |
| 52 | +```mermaid |
| 53 | +sequenceDiagram |
| 54 | + actor User as 사용자 |
| 55 | + participant Client as 클라이언트 |
| 56 | + participant Service as 우리 서비스 |
| 57 | + participant Store as 토큰 저장소 |
| 58 | + participant Queue as 이벤트 큐 |
| 59 | + participant Worker as 토큰 삭제 워커 |
| 60 | + participant CDN as CDN |
| 61 | +
|
| 62 | + User->>Client: 로그아웃 |
| 63 | + Client->>Service: 로그아웃 요청 |
| 64 | + Service->>Store: 로컬 토큰 삭제/무효화 |
| 65 | +
|
| 66 | + alt 비동기 삭제 |
| 67 | + Service->>Queue: CDN 토큰 삭제 이벤트 발행 |
| 68 | + Service-->>Client: 로그아웃 완료 |
| 69 | + Queue-->>Worker: 삭제 이벤트 전달 |
| 70 | + Worker->>CDN: 토큰 삭제 요청 |
| 71 | + alt CDN 삭제 성공 |
| 72 | + CDN-->>Worker: 삭제 완료 |
| 73 | + else CDN 일시 장애 |
| 74 | + CDN-->>Worker: 실패 |
| 75 | + Worker->>Queue: 재시도 예약 |
| 76 | + end |
| 77 | + else 동기식 차단 삭제 |
| 78 | + Service->>CDN: 토큰 삭제 요청 |
| 79 | + alt CDN 삭제 성공 |
| 80 | + CDN-->>Service: 삭제 완료 |
| 81 | + Service-->>Client: 로그아웃 완료 |
| 82 | + else CDN 일시 장애 |
| 83 | + CDN-->>Service: 실패 |
| 84 | + Service-->>Client: 로그아웃 실패 또는 지연 응답 |
| 85 | + end |
| 86 | + else 실패 케이스 허용 |
| 87 | + Service-->>Client: 로그아웃 완료 |
| 88 | + Note over Service,CDN: CDN 토큰은 만료 기한까지 일시적으로 유효할 수 있음 |
| 89 | + end |
| 90 | +``` |
| 91 | + |
| 92 | +키교체 |
| 93 | +- 고객의 키를 주기적으로 교체 |
| 94 | +- 모든 시스템에 전파되는 데 시간이 걸리므로 일정시간 이전 키와 새 키 모두 사용 가능 |
| 95 | + |
| 96 | +## 상위 수준의 아키텍처 |
| 97 | +### 저장소 서비스 |
| 98 | +- 대용량 파일 저장이라 DB를 사용 X 파일은 호스트의 파일 시스템에 저장 |
| 99 | +- 가용성, 내구성을 위해 복제가 필요 |
| 100 | +- 각 파일을 여러 호스트에 할당해야 함 |
| 101 | +- 가용성 모니터링과 메타데이터 서비스를 업데이트하고 대체 노드를 프로비저닝하는 장애 조치 프로세스 필요 |
| 102 | + |
| 103 | +클러스터 내부: (주키퍼를 클러스터 내부 관리자로 포함하는) HDFS 같은 분산 파일 시스템 |
| 104 | +- 주키퍼가 리더 선출 관리, 파일, 리더, 팔로워 간의 매핑 유지 |
| 105 | + |
| 106 | +클러스터 외부: (외부 관리자가 관리하는 경우) |
| 107 | +- 각 클러스터는 여러 데이터 센터에 분산된 3개 이상의 노드로 구성 |
| 108 | +- 파일을 읽거나 쓰려면 메타데이터 서비스가 파일이 저장되어 있거나 저장되어야 할 클러스터를 식별한 다음 클러스터에서 무작위로 선택한 노드에서 파일을 읽거나 씀 |
| 109 | +- 이 노드는 클러스터 내의 다른 노드로의 복제를 담당 |
| 110 | +- 리더 선출은 필요없으나 파일을 클러스터에 매핑하는 것은 필요 |
| 111 | +- 클러스터 외부 관리자는 파일과 클러스터의 매핑을 유지 |
| 112 | + |
| 113 | +### 일반적인 작업 |
| 114 | +CDN 도메인에 질의하면 GeoDNS가 가장 가까운 호스트의 IP 주소 할당 후 LB가 API Gateway 호스트로 요청 보냄(API Gateway는 캐싱 등 여러 작업 수행 가능) |
| 115 | +- 읽기: |
| 116 | + - 처리할 저장소 호스트 선택해야 함 |
| 117 | + - 메타데이터 서비스는 아래 과정 지원 |
| 118 | + - 파일을 포함하는 저장소 서비스 호스트, 데이터 센터 정보 |
| 119 | + - 호스트의 현재 부하 측정. 이는 제공 중인 파일 크기 합으로 비슷하게 산정할 수 있다 |
| 120 | + - 파일 다운로드하는 데 걸리는 시간을 예측, 동일한 이름을 가진 파일들을 구분(MD5, SHA 해시 등 사용) |
| 121 | + - 파일 소유권, 접근 제어 |
| 122 | + - 호스트의 상태 |
| 123 | + - 다운로드 과정 |
| 124 | + - 1. 속도 제한 서비스로 요청이 제한 초과하는지 검사 |
| 125 | + - 2. 메타데이터 서비스에 쿼리해 이 자산을 포함하는 저장소 서비스 호스트를 가져옴 |
| 126 | + - 3. 저장소 호스트를 선택, 자산을 클라로 스트리밍 |
| 127 | + - 4. 호스트 부하 증가로 메타데이터 서비스 업데이트(메타데이터 서비스가 자산의 크기를 기록하고 있다면 3단계와 병렬 수행 가능. 아니면 API Gateway가 자산의 크기를 측정해 정확한 부하 증가를 메타데이터 서비스로 업데이트해야 함) |
0 commit comments