Cloud Object Storage

실습 튜토리얼

제품 문서

저작권 고지

©2013-2026 Tencent Cloud. 모든 권리 보유.

본 문서의 저작권은 텐센트 클라우드(Tencent Cloud)에 단독으로 귀속됩니다. 텐센트 클라우드의 사전 서면 승인 없이는 어떠한 주체도 본 문서 내용의 전부 또는 일부를 복제·수정·표절·전송하는 등 어떠한 형태로도 이용할 수 없습니다.

상표 고지

텐센트 클라우드(Tencent Cloud) 및 관련 서비스의 모든 상표는 텐센트(Tencent) 그룹 산하 법인들(모회사, 자회사 및 계열사 포함)이 소유합니다. 본 문서에 언급된 제3자 상표는 해당 법적 권리자가 소유합니다.

서비스 고지

본 문서는 고객에게 텐센트 클라우드(Tencent Cloud) 제품 및 서비스 전부 또는 일부에 대한 현재적 개괄적 정보를 제공 하기 위한 것으로, 특정 제품·서비스의 내용은 수시로 변경될 수 있습니다. 고객이 실제 구매한 제품·서비스의 적용 기준은 고객과 텐센트 클라우드간 체결된 상업계약에 명시된 내용이 우선하며, 별도 서면 합의가 없는 한 텐센트 클라우드는 본 문서 내용에 대해 법적 효력이 있는 명시적·묵시적 진술이나 보증을 일체 하지 않습니다.

목록:

실습 튜토리얼

개요

최종 업데이트 날짜::2024-06-24 16:44:04

액세스 제어 및 권한 관리

ACL 액세스 제어 사례

최종 업데이트 날짜::2024-06-24 16:44:04

CAM 사례

최종 업데이트 날짜::2024-06-24 16:44:04

서브 계정에 COS 액세스 권한 부여

최종 업데이트 날짜::2025-11-18 16:41:55

권한 설정 관련 사례

최종 업데이트 날짜::2025-11-18 16:49:47

COS API 권한 부여 정책 사용 가이드

최종 업데이트 날짜::2025-11-19 11:50:28

프런트엔드에서 COS로 다이렉트 업로드 시 임시 자격 증명 사용 보안 가이드

최종 업데이트 날짜::2024-06-24 16:44:04

임시 키 생성 및 사용 가이드

최종 업데이트 날짜::2024-06-24 16:44:04

서브 계정에 태그별 버킷 가져오기 권한 부여

최종 업데이트 날짜::2025-12-31 17:57:34

조건 키 설명 및 사용 예시

최종 업데이트 날짜::2025-10-09 14:41:23

다른 루트 계정에 있는 서브 계정에 버킷 권한 부여

최종 업데이트 날짜::2024-06-24 16:44:04

성능 최적화

요청률 및 성능 최적화

최종 업데이트 날짜::2025-04-23 14:11:36

COS 스트레스 테스트 가이드

최종 업데이트 날짜::2024-11-19 17:08:27

AWS S3 SDK를 사용하여 COS에 액세스하기

최종 업데이트 날짜::2025-01-24 13:10:25

데이터 재해 복구 백업

버킷 복사 기반의 재해 복구 고가용성 아키텍처

최종 업데이트 날짜::2024-06-24 16:44:04

클라우드 데이터 백업

최종 업데이트 날짜::2024-06-24 16:44:04

로컬 데이터 백업

최종 업데이트 날짜::2025-12-09 15:01:03

도메인 관리 사례

버킷 사용자 정의 도메인 이름 전환

최종 업데이트 날짜::2025-06-04 18:23:37

사용자 지정 엔드포인트에 대한 HTTPS 지원

최종 업데이트 날짜::2025-11-14 17:29:10

CORS 설정

최종 업데이트 날짜::2024-06-24 16:44:04

정적 웹사이트 호스팅

최종 업데이트 날짜::2025-03-28 16:59:02

COS 정적 웹 사이트 기능을 사용하여 프런트엔드 단일 페이지 애플리케이션 구축

최종 업데이트 날짜::2025-11-04 15:37:02

Gzip 압축을 지원하는 사용자 정의 CDN 도메인 이름 구성

최종 업데이트 날짜::2024-12-16 16:34:05

이미지 처리 사례

COS 오디오/비디오 플레이어 개요

최종 업데이트 날짜::2024-06-24 16:44:04

COS 오디오/비디오 플레이어 사례

하이브리드 워터마크

최종 업데이트 날짜::2024-06-24 16:44:04

TCPlayer 사용하여 COS에서 비디오 재생

최종 업데이트 날짜::2024-06-24 16:44:04

DPlayer를 사용하여 COS에서 비디오 재생

최종 업데이트 날짜::2024-06-24 16:44:04

VideojsPlayer를 사용하여 COS에서 비디오 재생

최종 업데이트 날짜::2024-06-24 16:44:04

데이터 다이렉트 업로드

업로드 보안 제한

최종 업데이트 날짜::2025-09-19 10:43:52

서버 서명 사례

최종 업데이트 날짜::2025-09-19 10:43:53

Web의 다이렉트 업로드 사례

최종 업데이트 날짜::2025-11-18 16:32:18

모바일 애플리케이션 다이렉트 업로드 사례

최종 업데이트 날짜::2024-06-24 16:44:04

COS_HarmonyOS 직접 업로드 사례

최종 업데이트 날짜::2025-09-19 10:43:53

Flutter 직접 업로드 사례

최종 업데이트 날짜::2025-09-19 10:43:53

uni-app 직접 전송 실습

최종 업데이트 날짜::2026-02-09 15:11:14

데이터 보안

COS 데이터 보안 솔루션 소개

최종 업데이트 날짜::2024-06-24 16:53:18

링크 도용 방지 사례

최종 업데이트 날짜::2025-11-13 17:25:25

사용자 정의 SCF 함수로 COS 버킷 암호화 구성 점검 구성 사례

최종 업데이트 날짜::2026-01-14 14:12:36

데이터 검증

MD5 검사

최종 업데이트 날짜::2024-06-24 16:53:18

CRC64 검사

최종 업데이트 날짜::2024-06-24 16:53:18

빅 데이터 사례

COS를 Druid의 Deep storage로 사용

최종 업데이트 날짜::2024-06-24 16:53:18

DataX로 COS 가져오기 또는 내보내기

최종 업데이트 날짜::2025-09-26 10:13:03

CDH용 COSN 구성

최종 업데이트 날짜::2025-11-12 11:26:16

COS Ranger 권한 시스템 솔루션

최종 업데이트 날짜::2024-06-24 16:53:18

Oceanus를 COS에 연결

최종 업데이트 날짜::2024-06-24 16:53:18

COS 비용 최적화 솔루션

최종 업데이트 날짜::2025-08-29 14:19:13

3rd party 애플리케이션에서 COS 사용

S3와 호환되는 타사 애플리케이션에서 COS의 일반 구성 사용

최종 업데이트 날짜::2026-02-28 15:48:32

COS에 WordPress 원격 첨부 파일 저장하기

최종 업데이트 날짜::2025-11-19 15:33:39

COS에 Ghost 첨부 파일 저장하기

최종 업데이트 날짜::2024-06-24 16:53:18

PC 파일 COS에 백업

최종 업데이트 날짜::2024-06-24 16:53:18

NextCloud + COS로 개인 클라우드 생성

최종 업데이트 날짜::2024-11-20 15:43:51

COS를 로컬 드라이브로 Windows 서버에 마운트하기

최종 업데이트 날짜::2025-08-29 10:35:53

PicGo+Typora+COS를 사용하여 이미지 호스팅 서비스 구축

최종 업데이트 날짜::2024-06-24 16:53:18

CloudBerry Explorer를 통한 COS 리소스 관리

최종 업데이트 날짜::2025-04-18 17:26:02

COS+snapshot을 통한 자체 구축 ES에서 Tencent Cloud ES로의 데이터 마이그레이션 및 복구

최종 업데이트 날짜::2025-04-17 18:26:55

Django + COS를 활용한 웹 애플리케이션 클라우드 스토리지 솔루션

최종 업데이트 날짜::2025-12-24 11:02:07

\"}],\"id\":\"Cvqa9vPlgg6C1xQTVdRQW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"P_lGf5l_GAGvjbgqE38gM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"9N-QKjoJfMlRf7UeoP2Gr\",\"type\":\"code-line\"}],\"id\":\"3qSlRdzsRT92SjRq5Q9E7\",\"language\":\"html\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"실행 효과는 다음 그림과 같습니다.\"}],\"id\":\"YcwLJ-dCA-Zd2K9_MvcB5\",\"type\":\"p\"},{\"type\":\"p\",\"children\":[{\"text\":\"\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"w-s6J8m1oeRArxLn4cwaw\",\"inline\":true,\"naturalSize\":[470,250],\"size\":[470,250],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/47da2c327cc211ef80ff525400d5f8ef.png\"},{\"text\":\"\"}],\"id\":\"cIjTUNc3GvfBgBaBvO9kk\"},{\"children\":[{\"text\":\"AJAX POST 업로드 사용\"}],\"id\":\"1-Sdewl6THjieJKzQXkQN\",\"nodeId\":\"ajaxpost\",\"type\":\"h3\"},{\"children\":[{\"text\":\"AJAX 업로드는 브라우저에서 기본 HTML5 특성을 지원해야 하며, 현재 솔루션은 \"},{\"children\":[{\"text\":\"Post Object\"}],\"id\":\"Xp4Zo2SsygupOXSQjbq9I\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14690\"},\"type\":\"ref\"},{\"text\":\" 인터페이스를 사용합니다. 조작 안내:\"}],\"id\":\"C7OEZP4xDdQI__V4rl9lP\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"전제 조건\"}],\"linkTarget\":\"self\",\"linkTitle\":\"#1\",\"props\":{\"type\":\"link\",\"url\":\"#1\"},\"type\":\"ref\",\"id\":\"E26Pa16oBhpDhrApgJFi8\"},{\"text\":\" 순서에 따라 버킷에 관련 정보를 설정합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"YPg4xjhlqubbBVAuEvSs3\"},{\"type\":\"oli\",\"children\":[{\"code\":1,\"text\":\"test.html\"},{\"text\":\"파일을 생성하고,다음의 코드를 \"},{\"code\":1,\"text\":\"test.html\"},{\"text\":\"파일로 복사합니다.\"}],\"id\":\"5BoiZLYAh3G3ipMIUwhfz\"},{\"children\":[{\"text\":\"백그라운드의 서명 서비스를 배포하고, \"},{\"code\":1,\"text\":\"test.html\"},{\"text\":\"의 서명 서비스 주소를 수정합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"MyHUx0SHyP21G-Zo7Hnqc\"},{\"children\":[{\"code\":1,\"text\":\"test.html\"},{\"text\":\"을 Web 서버에 올리고, 브라우저로 페이지에 액세스하여 파일 업로드 기능을 테스트합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"Ze-zQDgOoWPqW8tBpNppC\"},{\"autoWrap\":true,\"children\":[{\"children\":[{\"text\":\"\"}],\"id\":\"oyBK8UgClbTfLcvJqEUu8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"NXo3j3G_GYkiWjWZLsT-A\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"xipfhwJjAwKtLtH_jfhV8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"R294xDK6XLGHV1bVvWiZF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Ajax Post 업로드(서버 측 서명 계산)\"}],\"id\":\"yJOFqVLjMbTFy6wLN78TF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"P3Jwj_uXiH2F0yROfu1V3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"n3kZiQoDNW2HEPRrGLirP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"5BFEfjwgTF-Ox_0sSIT2B\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"

PostObject 업로드(서버 측 서명 계산)

\"}],\"id\":\"H6UYZM-tcnYYlpa47h75Z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"9wJVHnistbRrbxZhcD0by\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"Fn7N3XlwdC9LZmZ1ofRWw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"eCxFuIuRmloFes2pQMWi5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"FZxL0Rem8o653DSNSqrH0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"
\"}],\"id\":\"zRbhcNCWXOvTIdISFZKEZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"9S98F_gmGUAdcJhtJsrHn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"jHGOO2mT3ULp3GI97S4bJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"GYDw71kXhbPQbSbNlwnjS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"aUyQvS_M2Oa1489H9fEzd\",\"type\":\"code-line\"}],\"id\":\"w9YwvkWQKyzxCP5gnV_dU\",\"language\":\"html\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"실행 효과는 다음 그림과 같습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"F6gv7P33j3zWyAga0IokX\",\"inline\":true,\"naturalSize\":[470,250],\"size\":[470,250],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/bdd580be7cc211ef8631525400a9236a.png\"},{\"text\":\"\"}],\"id\":\"mwwDS2fGqymTwLDuNrgW2\",\"type\":\"p\"},{\"__nid\":\"A7Z25tlh1n89lC41ySo7d\",\"children\":[{\"text\":\"Form 리스트 업로드 사용\"}],\"diff\":{\"type\":\"insert\"},\"id\":\"Fgndq9SwbGKrmfXmbKWcr\",\"nodeId\":\"formbiaodan\",\"type\":\"h3\"},{\"type\":\"p\",\"children\":[{\"text\":\"Form 리스트 업로드는 낮은 버전의 브라우저의 업로드(예 IE8)를 지원하며, 현재 솔루션은 \"},{\"children\":[{\"text\":\"Post Object\"}],\"id\":\"moDuAvV7R28BNc6X4tRTi\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14690\"},\"type\":\"ref\"},{\"text\":\" 인터페이스를 사용합니다. 조작 안내:\"}],\"id\":\"IoQqr7h8UXzI7P5T0wwLb\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"전제 조건\"}],\"linkTarget\":\"self\",\"linkTitle\":\"#1\",\"props\":{\"type\":\"link\",\"url\":\"#1\"},\"type\":\"ref\",\"id\":\"oZdkhQKbGk2ht8JcH8KaT\"},{\"text\":\" 순서에 따라 버킷을 준비합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"-Yhstf1fy8EYt7Z_ehdcb\"},{\"type\":\"oli\",\"children\":[{\"code\":1,\"text\":\"test.html\"},{\"text\":\"파일을 생성하고, 다음의 코드를 \"},{\"code\":1,\"text\":\"test.html\"},{\"text\":\"파일로 복사합니다.\"}],\"id\":\"uhTHSqEa7hmDVE0MOiajz\"},{\"children\":[{\"text\":\"백그라운드의 서명 서비스를 배포하고, \"},{\"code\":1,\"text\":\"test.html\"},{\"text\":\"의 서명 서비스 주소를 수정합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"8FMHY2KLyoqWt9a4TzSbN\"},{\"children\":[{\"code\":1,\"text\":\"test.html\"},{\"text\":\"과 동일한 디렉터리에 비어 있는 \"},{\"code\":1,\"text\":\"empty.html\"},{\"text\":\"을 생성하여 업로드 성공 시 리디렉션하는 데 사용합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"ApMdz4GjiMoYPu7MqhX_g\"},{\"children\":[{\"code\":1,\"text\":\"test.html\"},{\"text\":\"과 \"},{\"code\":1,\"text\":\"empty.html\"},{\"text\":\"을 Web 서버에 올리고, 브라우저로 페이지에 액세스하여 파일 업로드 기능을 테스트합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"Woa-U9agp0hC6ZKUe1qCb\"},{\"autoWrap\":true,\"children\":[{\"children\":[{\"text\":\"\"}],\"id\":\"yikJNyAhz3ScLb8Q_WNBJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"cBU9ww3SIX2Z2eBfsPpYX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"oVr9EJNeLd-BI-CQKDp8R\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"c-eaxaXgoU6T0AKc1EzKz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Form 리스트 간단 업로드(IE8 호환 가능)(서버 측 서명 계산)\"}],\"id\":\"xyIwcEEhM3UXlzxvIQEU3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"O29TeUVNbRshSTXjBpuuE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"4Z7-UkrjPordDNKf2d4tj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"QfXXV-ZypSlAxQBWuLaCU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"

Form 리스트 간단 업로드(IE8 호환 가능)(서버 측 서명 계산)

\"}],\"id\":\"rXQSr7P8YK1OL8x2LSpcG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"
최소 IE6 업로드 호환 가능, onprogress
는 지원하지 않음\"}],\"id\":\"GCUdz66D9Mcub4s40GR1R\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"v_rNIg5kGs3eSg8VqPgBS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"-53f-_JbgD6vruIsXXnL8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"-XE9afbbDBKhHwIXaS1fk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"zTUq-lOdLRTmGA2ad76kc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"xtuhs6lMsGlQUVTvaYHsF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"DfjvMA-dIjZupu9Dkz_O_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"CgwKcsyqGGanjO4so0U4_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"TI-EsbZ8XaZXtY61wvxha\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"2wz7GkyjamfbhBVjuLDht\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"7GP-bcQEhThAL_FsdyhWD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"TLCjc_4CMHczr4XbGwaM4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"ODwUZMJ-mg3E5sLAoXozF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"RTkcDnT1oTt52HlhG-Udu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"MorgESqtSUZ5pc8SOdO_v\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"GSn21p0s-bU23wI5AIjs7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"9zzGQ2e1_PK9TXfJEgeHB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"Mi8VZRrJcgyPY03z2bvK2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"w5kuGpOMUm9Elaf5Vl7eT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"NAoAnmfmofUi7EAJ2GRAW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"G-z0X0TgrNYJUlb1RA2Ip\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"
\"}],\"id\":\"AzLuFBIfhDOurFcdFo_rc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"T_SHcYvrZ1QveHyM-aUC9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"pk595sANJS6ubgXiRRAwF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"VWI79yb0DEMnTa4t02znq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"MF0J_aeHxoW8QqKsKAqnx\",\"type\":\"code-line\"}],\"id\":\"xrp3RDXYKHiEJkKauhSlR\",\"language\":\"html\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"실행 효과는 다음 그림과 같습니다.\"}],\"id\":\"-MGrUmQgeN92qsXnO5WIz\",\"type\":\"p\"},{\"type\":\"p\",\"children\":[{\"text\":\"\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"6yoy9lBp1XV7L7WAXmQku\",\"inline\":true,\"naturalSize\":[470,250],\"size\":[470,250],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/1f3264a97cc311ef82535254002693fd.png\"},{\"text\":\"\"}],\"id\":\"vh3pHfjuyUswdp0ydRkJI\"},{\"children\":[{\"text\":\"업로드 시 파일 유형 및 파일 크기 제한\"}],\"id\":\"5SoLZFTvmZKS83bA_XtEt\",\"nodeId\":\".E4.B8.8A.E4.BC.A0.E6.97.B6.E9.99.90.E5.88.B6.E6.96.87.E4.BB.B6.E5.90.8E.E7.BC.80\",\"type\":\"h4\"},{\"children\":[{\"text\":\"프론트엔드 파일 유형 제한\"}],\"id\":\"2WkZgsljU-eqYL7jmYXXG\",\"nodeId\":\".E5.89.8D.E7.AB.AF.E9.99.90.E5.88.B6\",\"type\":\"h5\"},{\"children\":[{\"text\":\"위의 AJAX PUT를 참조하여 업로드하고, 파일 선택 시 하나의 판단만 추가하면 됩니다.(제한 파일 접미사만 지원)\"}],\"id\":\"AY0sWFYsLDplUd_4MvY3g\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"// 기타 코드 생략\"}],\"id\":\"p0CavkNLOcpBFWnf8hYHd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"document.getElementById('submitBtn').onclick = function (e) {\"}],\"id\":\"H6ENMwqUinAwEAvRxwWb-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const file = document.getElementById('fileSelector').files[0];\"}],\"id\":\"yFZYDCZWEv9a-CkHJWgza\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (!file) {\"}],\"id\":\"s-3bEw6zh4KRWv_f8-ADA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" document.getElementById('msg').innerText = '업로드 파일을 선택하지 않음';\"}],\"id\":\"eon8S60CNLVS8a6GxnMYG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return;\"}],\"id\":\"5BIQPOICKYrPe5-u4De48\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"d3luRCn_-0C5r-2jEzGca\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 파일 접미사 가져오기\"}],\"id\":\"ZWUteyqls4UnOKX4LQfj7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const fileName = file.name;\"}],\"id\":\"K5eZXrZVVDdtOWy6cXg8S\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const lastDotIndex = fileName.lastIndexOf('.');\"}],\"id\":\"dhOet2Hdfzu-SCnomOifJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const ext = lastDotIndex > -1 ? fileName.substring(lastDotIndex + 1) : '';\"}],\"id\":\"Iyrst7B1xR9wyNo3t-oEu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"6H1MqcMjBq5xVZudCxrhy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 제한하고 싶은 격식으로 교체하세요. 예를 들어 jpg png 유형 파일만 업로드합니다.\"}],\"id\":\"FVmiI86GimY0my_SInTzA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const allowExt = ['jpg', 'png'];\"}],\"id\":\"FhGs5r0S3r3FgmIoOF64r\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (!allowExt.includes(ext)) {\"}],\"id\":\"0zLu8D6gbj3WhVggHeY_T\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" alert('jpg, png 파일 업로드만 지원');\"}],\"id\":\"KxEiwI74zcY4PilXLX-or\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return;\"}],\"id\":\"Ku_DUFvqIbqMEHPL7295R\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"fPlYois8QH7NIto_8c4AC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"bGsogQpOPoLYI0sAeGxrh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" file &&\"}],\"id\":\"Nc2xYrz424gKiFuiyHKBE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uploadFile(file, function (err, data) {\"}],\"id\":\"O57wsDQCDnq-ub0tK0aD8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(err || data);\"}],\"id\":\"4ZIKMcwMSWvOT90nAig5E\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" document.getElementById('msg').innerText = err\"}],\"id\":\"G5AvMlNkbKjIzQvm3vn7Y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ? err\"}],\"id\":\"F11Fbq454kUyCDFy5mhV9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" : '업로드 성공, ETag=' + data.ETag + 'url=' + data.url;\"}],\"id\":\"2Lv6mM6ZW0yTK0iFAAVus\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"sA30IGPb9IGJO2LVDTaMV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"};\"}],\"id\":\"ckwV9W-my1Wxq9aCNB8yJ\",\"type\":\"code-line\"}],\"id\":\"KKnZ5R1KIT2xkmxhxpxFW\",\"language\":\"js\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"프론트엔드 파일 크기 제한\"}],\"id\":\"iVzR3KO3H1T_Bou6jwFTb\",\"nodeId\":\".E5.89.8D.E7.AB.AF.E9.99.90.E5.88.B62\",\"type\":\"h5\"},{\"children\":[{\"text\":\"위의 AJAX PUT를 참조하여 업로드하고,파일 선택 시 하나의 판단만 추가하면 됩니다.\"}],\"id\":\"BG1vtx4bBkJ_9hIpRYREb\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"// 기타 코드 생략\"}],\"id\":\"48n8w8MJIPFF-QiVa9hct\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"document.getElementById('submitBtn').onclick = function (e) {\"}],\"id\":\"jDUN3dq3r2nNrq8vxJeID\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const file = document.getElementById('fileSelector').files[0];\"}],\"id\":\"02HtWY9g-4wsLDY9tCV7O\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (!file) {\"}],\"id\":\"3wkAmCu7oD5ogYqWdOa2M\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" document.getElementById('msg').innerText = '업로드 파일을 선택하지 않음';\"}],\"id\":\"ppbUxyxbk1V3ioDQTiHs6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return;\"}],\"id\":\"Wl2lwIYh4Oz5nup_D9KQx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"ga3js4eWc-CVp4JtvosFr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const fileSize = file.size;\"}],\"id\":\"PU_8u_iEdbKCnSKwwd65U\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"0Uq9OSB4AcxSS6G50uPU6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 제한하고 싶은 개체 크기로 교체하세요. 최대 하나의 개체가 5GB까지 가능합니다. 예를 들어 업로드 파일이 5MB를 초과할 수 없습니다.\"}],\"id\":\"H_yMCKeP5G1Hp1vuUxujN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (fileSize > 5 * 1024 * 1024) {\"}],\"id\":\"d_sbpDm-5JzhMlMJ_6gC5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" alert('선택한 파일이 5MB를 초과하였습니다. 다시 선택하세요.');\"}],\"id\":\"koYnqsQE60Fiua0RPZViS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return;\"}],\"id\":\"fU_w3-nHNqO4I_yHZhkgV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"29jEtAdX9oMAxVdboOzTy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"iB3cHlgb3mckeZxUwxL7Q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" file &&\"}],\"id\":\"3tgI4mHEEqzNrWGnb5w5p\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uploadFile(file, function (err, data) {\"}],\"id\":\"I4yqq7v3PfM7b0qAVVZKW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(err || data);\"}],\"id\":\"hwUBDMZ0qYhzovEKMkXeG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" document.getElementById('msg').innerText = err\"}],\"id\":\"peMEJBsefH6LdIAEBzLmA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ? err\"}],\"id\":\"e159rH1tGimshq6993pXi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" : '업로드 성공, ETag=' + data.ETag + 'url=' + data.url;\"}],\"id\":\"6FSYxrYTuPwBvSJu4t1-L\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"cMfQfluW1DU9NpLm2vldr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"};\"}],\"id\":\"eF1mAHzFCANiLLzK5Dx-4\",\"type\":\"code-line\"}],\"id\":\"qxJt41mqFB0cr_XkMEXhg\",\"language\":\"js\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"서버 측 서명 제한\"}],\"id\":\"AOr5MqGOO4Tik_L4OVPf7\",\"nodeId\":\".E6.9C.8D.E5.8A.A1.E7.AB.AF.E7.AD.BE.E5.90.8D.E9.99.90.E5.88.B62\",\"type\":\"h5\"},{\"children\":[{\"text\":\"서버 측 서명 코드 \"},{\"children\":[{\"text\":\"Nodejs 예시\"}],\"id\":\"xlkauJdsSLXjw6-aLJ_8h\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/server/upload-sign/nodejs/app.js\"},\"type\":\"ref\"},{\"text\":\" 중의 put-sign-limit 및 post-policy-limit를 참조할 수 있습니다.\"}],\"id\":\"PK_b76XhTLJ8Y7V7PGH28\",\"type\":\"p\"},{\"children\":[{\"text\":\"관련 문서\"}],\"nodeId\":\".EA.B4.80.EB.A0.A8-.EB.AC.B8.EC.84.9C\",\"type\":\"h2\",\"id\":\"83rX7hLSOWWQjLYS14JSt\"},{\"children\":[{\"text\":\"더 다양한 인터페이스 호출이 필요한 경우 다음 JavaScript SDK 문서를 참조하십시오.\"}],\"type\":\"p\",\"id\":\"h3CdF4_1rJqiHCUg_scMe\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"JavaScript SDK\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/11459\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/11459\"},\"type\":\"ref\",\"id\":\"ptx2wBOENbmLpjHojElUz\"},{\"text\":\"\"}],\"start\":false,\"type\":\"p\",\"id\":\"PxmnxIaN4ZGzbIl24Rz1G\"},{\"type\":\"p\",\"children\":[{\"text\":\"\"}],\"id\":\"3eosrJAh_NQWaNV0o-q-G\"}]"}},"9512":{"categoryId":436,"weight":65,"type":"page","extension":"","pid":32966,"id":9512,"lang":"ko","title":"정적 웹사이트 호스팅","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2025-03-29 00:59:02","recentReleaseTime":"2025-03-29 00:59:02","content":{"title":"정적 웹사이트 호스팅","body":"

소개

이 문서에서는 사용자가 텐센트 클라우드 COS(Cloud Object Storage)에서 정적 웹사이트를 호스팅하고 방문자가 COS에서 제공하는 정적 웹사이트 도메인 이름 또는 바인딩된 사용자 지정 도메인 이름(예: www.example.com)을 통해 호스팅된 정적 웹사이트에 액세스할 수 있도록 하는 방법을 설명합니다. 기존 정적 웹사이트를 COS에서 호스팅하려는 경우든 처음부터 웹사이트를 구축하려는 경우든 이 문서는 COS에서 정적 웹사이트를 호스팅하는 데 도움이 됩니다. 다음은 구체적인 단계입니다.

\"\"


주의:
2024년 1월 1일 이후에 생성된 버킷의 경우 사용자가 기본 도메인 이름(정적 웹사이트 도메인 포함)을 사용하여 파일에 액세스할 때 미리 보기가 지원되지 않습니다. 자세한 내용은 COS 버킷 도메인 이름 사용 관리 보안 알림을 참조하십시오. 정적 웹사이트를 활성화한 후 사용자 지정 도메인 이름(원본 서버 유형을 정적 웹사이트로 설정)을 구성한 다음 사용자 지정 도메인 이름을 통해 액세스할 것을 권장합니다.
COS 기본 도메인 이름으로 접근 시 정적 웹사이트 효과가 없습니다.

전제 조건

다음은 실습 과정에서 사용할 수 있는 관련 서비스입니다.
도메인 이름 등록 : 정적 웹사이트를 호스팅하기 전에 도메인 이름이 필요합니다 . 예를 들어 www.example.com입니다. Tencent Cloud 도메인 이름 등록 서비스를 통해 도메인 이름을 신청할 수 있습니다.
Cloud Object Storage COS : COS를 사용하여 버킷을 생성하면 업로드한 웹페이지 콘텐츠가 버킷에 저장됩니다.
DNS 파싱 관련 서비스: DNS 파싱을 사용하여 사용자 정의 도메인으로 정적 웹사이트에 액세스할 수 있습니다.
설명:
이 가이드의 모든 단계에서는 예제 도메인으로 www.example.com을 사용합니다. 실제 조작 시에는 본인의 도메인으로 해당 도메인을 교체해 주세요.

1단계: 도메인 등록

도메인 등록은 인터넷에서 모든 서비스를 구축하는 기반입니다. 상황에 맞게 진행해 주세요.
도메인을 이미 등록한 경우 이 단계를 건너뛰고 2단계로 진행할 수 있습니다.
도메인을 등록하지 않으셨습니다. 먼저 도메인 등록을 진행해 주세요.

2단계: 버킷을 생성하고 콘텐츠를 업로드합니다.

도메인 등록을 완료한 후, COS 콘솔에서 웹사이트 콘텐츠를 생성하고 구성하기 위해 다음 작업을 수행해야 합니다.

1. 버킷 생성

COS 콘솔에 텐센트 클라우드 계정으로 로그인하여 웹사이트에 대한 버킷을 생성하십시오. 버킷은 데이터를 저장하는 데 사용되며 웹사이트 콘텐츠를 하나의 버킷에 저장할 수 있습니다.
COS를 처음 사용하는 경우 콘솔의 개요 화면에서 버킷 생성을 통해 직접 버킷을 생성하거나 왼쪽 버킷 리스트 내비게이션 바를 클릭하여 생성할 수 있습니다. 자세한 내용은 버킷 생성 문서를 참조하세요.

2. 버킷을 구성하고 콘텐츠를 업로드합니다

1. 버킷의 정적 웹사이트 설정을 활성화하려면 아래 단계를 따르세요. 자세한 내용은 정적 웹사이트 설정 문서를 참조하세요.
1.1 COS 콘솔에 로그인한 후 왼쪽 메뉴에서 버킷 리스트를 클릭하여 방금 생성한 버킷을 찾은 다음 오른쪽의 구성 관리를 클릭합니다.
1.2 왼쪽 메뉴에서 기본 설정 > 정적 웹사이트를 선택한 후 편집을 클릭하여 현재 상태를 활성화하고, 인덱스 문서를 index.html 로 설정하며, 나머지는 일단 구성하지 않은 후 저장을 클릭합니다.
2. 생성한 버킷에 웹사이트 콘텐츠를 업로드합니다. 자세한 내용은 객체 업로드 문서를 참조하세요.
버킷에 저장할 수 있는 내용은 텍스트 파일, 사진, 동영상 또는 호스팅하려는 모든 콘텐츠일 수 있습니다. 아직 웹사이트를 구축하지 않았다면 이 실습에 따라 파일을 하나 만드세요.
예를 들어, 다음 HTML 을 사용하여 파일을 만들고 버킷에 업로드할 수 있습니다. 웹사이트의 기본 페이지 파일 이름은 일반적으로 index.html 입니다. 이후 단계에서 이 파일을 웹사이트의 인덱스 문서로 제공하게 됩니다.
<!DOCTYPE html>
<html>
<head>
<title>Hello COS!</title>
<meta charset="utf-8">
</head>
<body>
<p>COS 정적 웹사이트 기능을 사용하신 것을 환영합니다.</p>
<p>이것은 홈페이지입니다!</p>
</body>
</html>
주의:
정적 웹사이트 기능을 활성화하면 사용자가 파일 지정이 없는 1단계 디렉터리에 액세스할 때 COS는 기본적으로 해당 버킷 디렉터리의 index.html 파일을 우선 매칭하고 index.htm 파일을 매칭하며, 해당 파일이 없으면 404 오류를 반환합니다.

3단계: 커스텀 도메인 바인딩

1. 도메인 추가

1. COS 콘솔에 로그인한 후 왼쪽 메뉴에서 버킷 리스트를 클릭하고 웹사이트 콘텐츠를 저장하는 버킷을 클릭하여 해당 버킷에 들어갑니다.
2. 왼쪽 메뉴에서 도메인 및 전송 관리 > 커스텀 오리진 도메인을 클릭하여 커스텀 오리진 도메인 관리 페이지로 이동합니다.
3. ‘원본 주소 도메인’ 항목에서 도메인 추가를 클릭하면 주요 설정 항목이 나타납니다.
도메인: 구매한 커스텀 도메인(예: www.example.com)을 입력합니다. 자세한 내용은 커스텀 오리진 도메인 사용을 참조하세요.
오리진 유형: 정적 웹사이트 오리진을 선택합니다.
4. 생성을 클릭합니다. 설정이 완료되면 몇 분 정도 기다려 도메인 배포 및 온라인 상태가 완료되기를 기다립니다. 그런 다음 해당 CNAME 레코드를 복사하고 도메인 해석 단계를 진행합니다.

2. 도메인 해석

사용자 지정 도메인에 대해 CNAME 레코드를 추가하고 위의 도메인 추가 단계에서 복사한 CNAME 레코드를 입력하십시오. 도메인 이름 해석 설정에 대한 자세한 내용은 부록: 도메인 해석 설정을 참조하십시오.

4단계: 테스트 확인

위 과정을 완료한 후, 브라우저 주소창에 웹사이트 도메인을 입력하여 결과를 확인할 수 있습니다. 예를 들어 www.example.com
http://www.example.com ——버킷 example의 인덱스 페이지(index.html)로 이동합니다.
http://www.example.com/folder/ ——버킷 example의 폴더 directory(folder/index.html)로 이동합니다.
http://www.example.com/test.html(존재하지 않는 파일) ——404 메시지를 반환합니다. 사용자 지정 오류 문서가 필요한 경우 단계 2 정적 웹사이트 구성에서 오류 문서 추가 설정을 할 수 있으며, 이 오류 문서는 존재하지 않는 파일을 요청할 때 표시됩니다.
설명:
일부 상황에서는 예상 결과를 보려면 브라우저 캐시를 지워야 할 수도 있습니다.
오류 문서는 하위 디렉터리에 배치할 수 있습니다. 예: pages/404.html. 그러나 다른 하위 디렉터리에 대해 다른 오류 문서를 구성하는 것은 지원되지 않으며 각 버킷에는 하나의 오류 문서만 구성할 수 있습니다.
","recentReleaseTime":"2025-03-28 16:59:02","slate":"[{\"children\":[{\"text\":\"소개\"}],\"id\":\"xM7fG1bNs9HYvxF3kvaZf\",\"nodeId\":\".E7.AE.80.E4.BB.8B\",\"type\":\"h2\"},{\"children\":[{\"text\":\"이 문서에서는 사용자가 텐센트 클라우드 COS(Cloud Object Storage)에서 정적 웹사이트를 호스팅하고 방문자가 COS에서 제공하는 정적 웹사이트 도메인 이름 또는 바인딩된 사용자 지정 도메인 이름(예: \"},{\"code\":1,\"text\":\"www.example.com\"},{\"text\":\")을 통해 호스팅된 정적 웹사이트에 액세스할 수 있도록 하는 방법을 설명합니다. 기존 정적 웹사이트를 COS에서 호스팅하려는 경우든 처음부터 웹사이트를 구축하려는 경우든 이 문서는 COS에서 정적 웹사이트를 호스팅하는 데 도움이 됩니다. 다음은 구체적인 단계입니다.\"}],\"id\":\"LiJyaVr8Gh-QI6u5zIuZZ\",\"type\":\"p\"},{\"type\":\"p\",\"children\":[{\"text\":\"\"},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/151eb4370abb11f0ae6a525400454e06.png\",\"alt\":\"\",\"inline\":true,\"children\":[{\"text\":\"\"}],\"id\":\"YLf6rbcfnNFw4p2yf_T-s\",\"naturalSize\":[697,111],\"size\":[697,111]},{\"text\":\"\"}],\"id\":\"7Hs8fOHz9pQG9QzwTYHVm\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"주의:\"}],\"id\":\"tb_q3oB2rq0NABr6kNcFk\",\"type\":\"p\"},{\"children\":[{\"text\":\"2024년 1월 1일 이후에 생성된 버킷의 경우 사용자가 기본 도메인 이름(정적 웹사이트 도메인 포함)을 사용하여 파일에 액세스할 때 미리 보기가 지원되지 않습니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"COS 버킷 도메인 이름 사용 관리 보안 알림\"}],\"id\":\"GOH6UvAbJcbLf1WYk-B4P\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/57456\"},\"type\":\"ref\"},{\"text\":\"을 참조하십시오. 정적 웹사이트를 활성화한 후 사용자 지정 도메인 이름(원본 서버 유형을 정적 웹사이트로 설정)을 구성한 다음 사용자 지정 도메인 이름을 통해 액세스할 것을 권장합니다.\"}],\"id\":\"jrB29sBUzsi1_IPHk2L_2\",\"type\":\"uli\"},{\"children\":[{\"text\":\"COS 기본 도메인 이름으로 접근 시 정적 웹사이트 효과가 없습니다.\"}],\"id\":\"p7_ApjloeBHtbII6adxMF\",\"type\":\"uli\"}],\"hintType\":\"alert\",\"id\":\"euKk8ARDuao04nGahulaX\",\"type\":\"hint\"},{\"children\":[{\"text\":\"전제 조건\"}],\"id\":\"sUIMIkQj7wGochMHDHALv\",\"nodeId\":\".E4.BA.8B.E5.89.8D.E5.87.86.E5.A4.87\",\"type\":\"h2\"},{\"children\":[{\"text\":\"다음은 실습 과정에서 사용할 수 있는 관련 서비스입니다.\"}],\"id\":\"ZmIRe4bjJbc4YCV_KJKAA\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"도메인 이름 등록\"}],\"id\":\"2TvGMzmT20Zm27k1nL5MI\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/products/domain\"},\"type\":\"ref\"},{\"text\":\" : 정적 웹사이트를 호스팅하기 전에 도메인 이름이 필요합니다 . 예를 들어 \"},{\"code\":1,\"text\":\"www.example.com\"},{\"text\":\"입니다. Tencent Cloud \"},{\"children\":[{\"text\":\"도메인 이름 등록\"}],\"id\":\"EMRI70nAOG-ePTJL7qe7R\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/products/domain\"},\"type\":\"ref\"},{\"text\":\" 서비스를 통해 도메인 이름을 신청할 수 있습니다.\"}],\"id\":\"mguOBiyfCsmPGq85NwF9q\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/products/cos\"},\"children\":[{\"text\":\"Cloud Object Storage COS\"}],\"id\":\"deDqGxTpc5lJ0AQ8cvoEb\"},{\"text\":\" : COS를 사용하여 버킷을 생성하면 업로드한 웹페이지 콘텐츠가 버킷에 저장됩니다.\"}],\"id\":\"vNUMRNj5iSlL9JqE8TYrg\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"DNS 파싱 관련 서비스: DNS 파싱을 사용하여 사용자 정의 도메인으로 정적 웹사이트에 액세스할 수 있습니다.\"}],\"id\":\"zi3t75fXp-BWOmBeIH82c\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"설명:\"}],\"id\":\"8WiaCMdXw7X5hj90Jp2Bd\",\"type\":\"p\"},{\"children\":[{\"text\":\"이 가이드의 모든 단계에서는 예제 도메인으로 \"},{\"code\":1,\"text\":\"www.example.com\"},{\"text\":\"을 사용합니다. 실제 조작 시에는 본인의 도메인으로 해당 도메인을 교체해 주세요.\"}],\"id\":\"BM9Z8f4L0Kp8TlZ1jU1Z5\",\"type\":\"p\"}],\"hintType\":\"info\",\"id\":\"8NY9nP8ObdFBP9PSsKxVy\",\"type\":\"hint\"},{\"children\":[{\"text\":\"1단계: 도메인 등록\"}],\"id\":\"jzSqO0QdIrT9sR9-Io3R1\",\"nodeId\":\".E6.AD.A5.E9.AA.A41.EF.BC.9A.E6.B3.A8.E5.86.8C.E5.9F.9F.E5.90.8D.E4.B8.8E.E5.A4.87.E6.A1.88.EF.BC.88.E5.8F.AF.E9.80.89.EF.BC.89\",\"type\":\"h2\"},{\"children\":[{\"text\":\"도메인 등록은 인터넷에서 모든 서비스를 구축하는 기반입니다. 상황에 맞게 진행해 주세요.\"}],\"id\":\"9c-11xL8BJ0hhxgn_8p10\",\"type\":\"p\"},{\"children\":[{\"text\":\"도메인을 이미 등록한 경우 이 단계를 건너뛰고 \"},{\"children\":[{\"text\":\"2단계\"}],\"id\":\"6DLGrrEmk1g6SZCxHKvqI\",\"props\":{\"type\":\"link\",\"url\":\"#step2\"},\"type\":\"ref\"},{\"text\":\"로 진행할 수 있습니다.\"}],\"id\":\"VXaJe5xEq74xb-Xeonpds\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"도메인을 등록하지 않으셨습니다. 먼저 \"},{\"children\":[{\"text\":\"도메인 등록\"}],\"id\":\"O0awbWNtJpHqvpedTOorJ\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/products/domain\"},\"type\":\"ref\"},{\"text\":\"을 진행해 주세요.\"}],\"id\":\"nv2ecMSP4MSDDHc8znrPM\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"2단계: 버킷을 생성하고 콘텐츠를 업로드합니다.\"}],\"id\":\"LnO-g5u0_M-M-kXCpNhtG\",\"nodeId\":\"step2\",\"type\":\"h2\"},{\"children\":[{\"text\":\"도메인 등록을 완료한 후, COS 콘솔에서 웹사이트 콘텐츠를 생성하고 구성하기 위해 다음 작업을 수행해야 합니다.\"}],\"id\":\"1oOjlFx5f_a75uuVe9NuK\",\"type\":\"p\"},{\"children\":[{\"b\":1,\"text\":\"1. 버킷 생성\"}],\"id\":\"qKc-mc8BUNYMtZQGVUMgb\",\"nodeId\":\"8520e5c9-b7bc-4105-8bcb-9a9a0fd6440c\",\"type\":\"h3\"},{\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos\"},\"children\":[{\"text\":\"COS 콘솔\"}],\"id\":\"HIHmFiro5xfG86pvJwZtH\"},{\"text\":\"에 텐센트 클라우드 계정으로 로그인하여 웹사이트에 대한 버킷을 생성하십시오. 버킷은 데이터를 저장하는 데 사용되며 웹사이트 콘텐츠를 하나의 버킷에 저장할 수 있습니다.\"}],\"id\":\"Xt92t9xNMn7ThDZ1KJqzI\",\"type\":\"p\"},{\"children\":[{\"text\":\"COS를 처음 사용하는 경우 콘솔의 개요 화면에서 \"},{\"b\":1,\"text\":\"버킷 생성\"},{\"text\":\"을 통해 직접 버킷을 생성하거나 왼쪽 \"},{\"b\":1,\"text\":\"버킷 리스트\"},{\"text\":\" 내비게이션 바를 클릭하여 생성할 수 있습니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"id\":\"Il0Vb_T2PxBZGCm8yDgrs\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/13309\"},\"type\":\"ref\"},{\"text\":\" 문서를 참조하세요.\"}],\"id\":\"HJl2JUns1KlSzo0e8r76L\",\"type\":\"p\"},{\"children\":[{\"text\":\"2. \"},{\"b\":1,\"text\":\"버킷을 구성하고 콘텐츠를 업로드합니다\"}],\"id\":\"Z6jsOFyR4i5wZkqSGAcmj\",\"nodeId\":\"98fbf19a-9741-4852-88f8-50f2fc44aea2\",\"type\":\"h3\"},{\"children\":[{\"text\":\"버킷의 \"},{\"b\":1,\"text\":\"정적 웹사이트\"},{\"text\":\" 설정을 활성화하려면 아래 단계를 따르세요. 자세한 내용은 \"},{\"children\":[{\"text\":\"정적 웹사이트 설정\"}],\"id\":\"8z_E-U6ElX6w9aVu9abFg\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14984\"},\"type\":\"ref\"},{\"text\":\" 문서를 참조하세요.\"}],\"id\":\"Mx0kCsupt-pALRkw16Rps\",\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"COS 콘솔\"}],\"id\":\"x7IF9DYUyffbPwkYLNM0C\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos\"},\"type\":\"ref\"},{\"text\":\"에 로그인한 후 왼쪽 메뉴에서 \"},{\"b\":1,\"text\":\"버킷 리스트\"},{\"text\":\"를 클릭하여 방금 생성한 버킷을 찾은 다음 오른쪽의 \"},{\"b\":1,\"text\":\"구성 관리\"},{\"text\":\"를 클릭합니다.\"}],\"id\":\"B1fqUjqXffjnaP87RYv1t\",\"indent\":1,\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"왼쪽 메뉴에서 \"},{\"b\":1,\"text\":\"기본 설정\"},{\"text\":\" > \"},{\"b\":1,\"text\":\"정적 웹사이트\"},{\"text\":\"를 선택한 후 \"},{\"b\":1,\"text\":\"편집\"},{\"text\":\"을 클릭하여 현재 상태를 활성화하고, 인덱스 문서를 index.html 로 설정하며, 나머지는 일단 구성하지 않은 후 \"},{\"b\":1,\"text\":\"저장\"},{\"text\":\"을 클릭합니다.\"}],\"id\":\"mMlW5YK1aG7ssskO_gxq6\",\"indent\":1,\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"생성한 버킷에 웹사이트 콘텐츠를 업로드합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"객체 업로드\"}],\"id\":\"e0_mOVlN7n09Ws2gLrgFI\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/13321\"},\"type\":\"ref\"},{\"text\":\" 문서를 참조하세요.\"}],\"id\":\"VWmSsiCnfXSHPJvekpW_a\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"버킷에 저장할 수 있는 내용은 텍스트 파일, 사진, 동영상 또는 호스팅하려는 모든 콘텐츠일 수 있습니다. 아직 웹사이트를 구축하지 않았다면 이 실습에 따라 파일을 하나 만드세요.\"}],\"id\":\"RVQD0GDaZG9RryZB3J6gB\",\"indent\":1,\"start\":false,\"type\":\"p\"},{\"children\":[{\"text\":\"예를 들어, 다음 HTML 을 사용하여 파일을 만들고 버킷에 업로드할 수 있습니다. 웹사이트의 기본 페이지 파일 이름은 일반적으로 index.html 입니다. 이후 단계에서 이 파일을 웹사이트의 인덱스 문서로 제공하게 됩니다.\"}],\"id\":\"h6ZPsBzjfRfB8su24fXh-\",\"indent\":1,\"start\":false,\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"\"}],\"id\":\"EXRFjFsyu7CnSNFbbtwH_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"kJXa3jYXQJYdbP8keOfxz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"98Cl0sz51EmX2KydMepB7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Hello COS!\"}],\"id\":\"zm77ujYMUnulr2YtGXvFf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"YYidofu6Uut5d40irA0gO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"ln2HXcu7G6dm5y4ix1i-b\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"NdCct2DdNrKRt9zMzeXV2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"

COS 정적 웹사이트 기능을 사용하신 것을 환영합니다.

\"}],\"id\":\"a0xKv5L7cbovF_kNIHo11\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"

이것은 홈페이지입니다!

\"}],\"id\":\"4w06BoDVszqmP7ZOtWft3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"JZJ2n9BKc-ess6rDLny0w\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"ZYyXXtdrVWoq_Ti9Mm62Y\",\"type\":\"code-line\"}],\"id\":\"HemGjFYYReLDsKZ8s2dMK\",\"indent\":1,\"language\":\"xml\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"주의:\"}],\"id\":\"F7KjMDsqBgfPcwESwBuY4\",\"type\":\"p\"},{\"children\":[{\"text\":\"정적 웹사이트 기능을 활성화하면 사용자가 파일 지정이 없는 1단계 디렉터리에 액세스할 때 COS는 기본적으로 해당 버킷 디렉터리의 index.html 파일을 우선 매칭하고 index.htm 파일을 매칭하며, 해당 파일이 없으면 404 오류를 반환합니다.\"}],\"id\":\"zzx79QN97tYdAhzw8a6Cl\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"m_i-OnVhBtQU9LlO3Wono\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"3단계: 커스텀 도메인 바인딩\"}],\"id\":\"Xo-lwN0wrNTXfRuyslFZ1\",\"nodeId\":\".E6.AD.A5.E9.AA.A43.EF.BC.9A.E7.BB.91.E5.AE.9A.E8.87.AA.E5.AE.9A.E4.B9.89.E5.9F.9F.E5.90.8D\",\"type\":\"h2\"},{\"children\":[{\"text\":\"1. 도메인 추가\"}],\"id\":\"inrmroUq03ygeGrczYU-j\",\"nodeId\":\"134e7fef-be50-435d-919e-3feb6976e7df\",\"start\":true,\"type\":\"h3\"},{\"children\":[{\"children\":[{\"text\":\"COS 콘솔\"}],\"id\":\"rLINgR4sEFiyBdaGlxzIU\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos\"},\"type\":\"ref\"},{\"text\":\"에 로그인한 후 왼쪽 메뉴에서 \"},{\"b\":1,\"text\":\"버킷 리스트\"},{\"text\":\"를 클릭하고 웹사이트 콘텐츠를 저장하는 버킷을 클릭하여 해당 버킷에 들어갑니다.\"}],\"id\":\"m_f9QyKnjDgYQFk97NDJu\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"왼쪽 메뉴에서 \"},{\"b\":1,\"text\":\"도메인 및 전송 관리\"},{\"text\":\" > \"},{\"b\":1,\"text\":\"커스텀 오리진 도메인\"},{\"text\":\"을 클릭하여 커스텀 오리진 도메인 관리 페이지로 이동합니다.\"}],\"id\":\"B8cwqcoUZbbz9pF5hnbue\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"‘원본 주소 도메인’ 항목에서 \"},{\"b\":1,\"text\":\"도메인 추가\"},{\"text\":\"를 클릭하면 주요 설정 항목이 나타납니다.\"}],\"id\":\"Npxte7D5JaZFqGCjMeiyC\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"도메인\"},{\"text\":\": 구매한 커스텀 도메인(예: www.example.com)을 입력합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"커스텀 오리진 도메인 사용\"}],\"id\":\"-E4yptbX9Ur3kmTMC0eq1\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/31507\"},\"type\":\"ref\"},{\"text\":\"을 참조하세요.\"}],\"id\":\"h-9AgSFUTc2iIACg_pjYe\",\"indent\":1,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"오리진 유형:\"},{\"text\":\" \"},{\"b\":1,\"text\":\"정적 웹사이트 오리진\"},{\"text\":\"을 선택합니다.\"}],\"id\":\"TYS5mXpEX5qTuWg1rWtK_\",\"indent\":1,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"생성\"},{\"text\":\"을 클릭합니다. 설정이 완료되면 몇 분 정도 기다려 도메인 배포 및 온라인 상태가 완료되기를 기다립니다. 그런 다음 해당 CNAME 레코드를 복사하고 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"#2cda9996-3838-4957-ba6f-215174a7f0b3\"},\"children\":[{\"text\":\"도메인 해석\"}],\"id\":\"WjgGM0UQz4hq4MLQ0cPPz\"},{\"text\":\" 단계를 진행합니다.\"}],\"id\":\"kf-FgAejMudIs7pqWS8Af\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"2. 도메인 해석\"}],\"id\":\"A2s4Sc1n4I7vWXVtqdJ7Q\",\"nodeId\":\"2cda9996-3838-4957-ba6f-215174a7f0b3\",\"type\":\"h3\"},{\"children\":[{\"text\":\"사용자 지정 도메인에 대해 CNAME 레코드를 추가하고 위의 도메인 추가 단계에서 복사한 CNAME 레코드를 입력하십시오. 도메인 이름 해석 설정에 대한 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/31507#a6d96c6d-fa71-456c-94d3-3649f39b8f09\"},\"children\":[{\"text\":\"부록: 도메인 해석 설정\"}],\"id\":\"UTy0CI54oJLAgxF2WlpTF\"},{\"text\":\"을 참조하십시오.\"}],\"id\":\"lx897Q7dkC-GH2xfZ-tZx\",\"type\":\"p\"},{\"children\":[{\"text\":\"4단계: 테스트 확인\"}],\"id\":\"i0uasor8VUVaDnfJJATkK\",\"nodeId\":\".E6.AD.A5.E9.AA.A44.EF.BC.9A.E6.B5.8B.E8.AF.95.E9.AA.8C.E8.AF.81\",\"type\":\"h2\"},{\"children\":[{\"text\":\"위 과정을 완료한 후, 브라우저 주소창에 웹사이트 도메인을 입력하여 결과를 확인할 수 있습니다. 예를 들어 \"},{\"code\":1,\"text\":\"www.example.com\"}],\"id\":\"pJFQDXGQj8fYsli3YytIV\",\"type\":\"p\"},{\"children\":[{\"code\":1,\"text\":\"http://www.example.com\"},{\"text\":\" ——버킷 example의 인덱스 페이지(index.html)로 이동합니다.\"}],\"id\":\"0tgyh5U3Q7IC-09J4BtOx\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"code\":1,\"text\":\"http://www.example.com/folder/\"},{\"text\":\" ——버킷 example의 폴더 directory(folder/index.html)로 이동합니다.\"}],\"id\":\"69I7OoCbDUdetHzdwvxB-\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"code\":1,\"text\":\"http://www.example.com/test.html\"},{\"text\":\"(존재하지 않는 파일) ——404 메시지를 반환합니다. 사용자 지정 오류 문서가 필요한 경우 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"#98fbf19a-9741-4852-88f8-50f2fc44aea2\"},\"children\":[{\"text\":\"단계 2\"}],\"id\":\"0Iu9PKreffYNum_boqV4b\"},{\"text\":\" 정적 웹사이트 구성에서 \"},{\"b\":1,\"text\":\"오류 문서\"},{\"text\":\" 추가 설정을 할 수 있으며, 이 오류 문서는 존재하지 않는 파일을 요청할 때 표시됩니다.\"}],\"id\":\"6GCvCJHhrHc4C3YJVScht\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"설명:\"}],\"id\":\"pVm-EctHZT5rNdLrLDSbR\",\"type\":\"p\"},{\"children\":[{\"text\":\"일부 상황에서는 예상 결과를 보려면 브라우저 캐시를 지워야 할 수도 있습니다.\"}],\"id\":\"VfRZX1nGMCYsQHnvAyL71\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"오류 문서는 하위 디렉터리에 배치할 수 있습니다. 예: pages/404.html. 그러나 다른 하위 디렉터리에 대해 다른 오류 문서를 구성하는 것은 지원되지 않으며 각 버킷에는 하나의 오류 문서만 구성할 수 있습니다.\"}],\"id\":\"uO_LpmLZAvyOfriiIGh6z\",\"start\":false,\"type\":\"uli\"}],\"hintType\":\"info\",\"id\":\"fwxrvmIi3H3IX8e0Yux7D\",\"type\":\"hint\"}]"}},"11142":{"categoryId":436,"weight":90,"type":"page","extension":"","pid":32966,"id":11142,"lang":"ko","title":"사용자 지정 엔드포인트에 대한 HTTPS 지원","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:12","recentReleaseTime":"2019-12-06 19:34:12","content":{"title":"사용자 지정 엔드포인트에 대한 HTTPS 지원","body":"

소개

자체 도메인(사용자 정의 도메인, 예: test.cos.com)을 통해 버킷(Bucket)의 객체(Object)에 액세스할 수 있습니다. 구체적인 작업 가이드는 다음과 같습니다.

작업 단계

CDN 가속 활성화

1단계: 사용자 정의 도메인 바인딩

버킷을 자체 도메인에 바인딩하고 CDN 가속을 활성화합니다. 자세한 작업 가이드는 사용자 정의 CDN 가속 도메인 활성화 문서를 참고하십시오.

2단계: HTTPS 액세스 설정

CDN 콘솔에서 HTTPS를 설정합니다. 자세한 작업 가이드는 HTTPS 가속 설정 가이드를 참고하십시오.

CDN 가속 비활성화

본 챕터에서는 Cloud Object Storage(COS)에서 리버스 프록시를 통해 사용자 정의 도메인(CDN 가속 비활성화)을 설정하고 HTTPS 액세스를 지원하는 작업을 예시를 통해 소개합니다. 본 예시에서는 CDN 가속이 비활성화된 상태에서 직접 사용자 정의 도메인 https://test.cos.com을 통해 소속 리전이 광저우이고 이름이 testhttps-1250000000인 버킷에 액세스하게 됩니다. 구체적인 작업 순서는 다음과 같습니다.

1단계: 사용자 정의 도메인 바인딩

COS 중국 내 공유 클라우드 리전과 싱가포르 리전은 이미 사용자 정의 원본 서버 도메인 호스팅을 위한 HTTPS 인증서를 지원하고 있으며, 추가된 사용자 정의 원본 서버 도메인은 콘솔을 통해 인증서를 바인딩 할 수 있습니다. 자세한 내용은 방법1을 참고하십시오. 도메인에 HTTPS 인증서가 없는 경우 Tencent Cloud 인증서 신청을 클릭할 수 있습니다.
기타 해외 리전의 경우 현재 HTTPS 인증서 호스팅이 지원되지 않으며, HTTPS 인증서를 사용해야 하는 경우 방법2를 참고하십시오.

방법1
: COS 콘솔을 통해 사용자 정의 원본 서버 도메인 바인딩
버킷 testhttps-1250000000를 https://test.cos.com 도메인에 바인딩하고, CDN 가속을 비활성화합니다. 자세한 작업 가이드는 사용자 정의 원본 서버 도메인 활성화 문서를 참고하십시오.

방법2
: 도메인에 리버스 프록시 설정
서버 상의 https://test.cos.com 도메인에 리버스 프록시를 설정합니다. 구체적인 설정 방법은 다음을 참고하십시오(Nginx 설정은 참고용으로만 제공).
server {
listen 443;
server_name test.cos.com ;

ssl on;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server.key;

error_log logs/test.cos.com.error_log;
access_log logs/test.cos.com.access_log;
location / {
root /data/www/;
proxy_pass http://testhttps-1250000000.cos.ap-guangzhou.myqcloud.com; //버킷(Bucket)의 기본 다운로드 도메인 설정
}
}
server.crt;, server.key는 귀하의 자체(사용자 정의) 도메인 HTTPS 인증서입니다. 귀하의 도메인에 HTTPS 인증서가 없는 경우 Tencent Cloud SSL 인증서 페이지에서 신청하십시오.\n현재 인증서가 없는 경우 다음과 같은 설정 정보를 삭제할 수 있습니다. 액세스 시 알람이 뜰 수 있으나 계속을 클릭하면 액세스할 수 있습니다.
ssl on;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server.key;

2단계: 서버로 도메인 리졸브

도메인 DNS 리졸브 서비스 제공 업체에서 사용자의 도메인을 리졸브합니다.

3단계: 고급 설정

브라우저로 직접 웹 페이지 열기\n사용자 정의 도메인의 HTTPS 액세스 지원 설정을 완료하면 사용자의 도메인을 통해 버킷(Bucket)에 있는 객체(Object)를 다운로드할 수 있습니다. 비즈니스 수요에 따라 브라우저에서 직접 웹 페이지 및 이미지 등을 액세스해야 하는 경우 정적 웹 사이트 기능을 통해 실행할 수 있습니다. 자세한 작업 가이드는 정적 웹 사이트 설정을 참고하십시오.\n설정 완료 후, Nginx 설정에 정보를 한 행 추가한 다음 Nginx를 재시작해 브라우저 캐시를 새로 고칩니다.
proxy_set_header Host $http_host;
refer 링크 도용 방지 설정\n버킷(Bucket)이 공용인 경우 링크 도용 리스크가 있습니다. 링크 도용 방지 설정을 통해 Referer 얼로우리스트를 활성화하여 악성 링크 도용을 방지할 수 있습니다. 구체적인 작업 순서는 다음과 같습니다.
1.1 COS 콘솔에 로그인한 후, 링크 도용 방지 설정 기능을 활성화하여 얼로우리스트를 선택합니다. 자세한 작업 가이드는 링크 도용 방지 설정을 참고하십시오.
1.2 Nginx 구성 파일에 정보를 한 행 추가한 다음 Nginx를 재시작해 브라우저 캐시를 새로 고칩니다.
proxy_set_header Referer www.test.com;
1.3 설정 완료 후, 바로 파일을 열면 errorcode: -46616 오류 알림이 뜹니다. 오류 알림: refer 얼로우리스트가 미스되었으나 프록시를 통해 사용자 정의 도메인에 액세스하면 정상적으로 웹 페이지를 열 수 있습니다.
{
errorcode: -46616,
errormsg: "not hit white refer, retcode:-46616"
}

","recentReleaseTime":"2025-11-14 17:29:10","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"hoUf6wIoAr_kvA7E-InQa\"},{\"children\":[{\"text\":\"자체 도메인(사용자 정의 도메인, 예: \"},{\"code\":1,\"text\":\"test.cos.com\"},{\"text\":\")을 통해 버킷(Bucket)의 객체(Object)에 액세스할 수 있습니다. 구체적인 작업 가이드는 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"8m9ZYg5roGjLp3u18iGw8\"},{\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"#enabling-cdn-acceleration\"},\"children\":[{\"text\":\"CDN 가속 활성화 시 사용자 정의 도메인에 HTTPS 액세스 지원 설정\"}],\"id\":\"Q7Et6C_YbzES_QTd0n6N0\"},{\"text\":\"\"}],\"start\":false,\"type\":\"uli\",\"id\":\"MTFvB4_vkoiQKxbsoKoEJ\"},{\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"#disabling-cdn-acceleration\"},\"children\":[{\"text\":\"CDN 가속 비활성화 시 사용자 정의 도메인에 HTTPS 액세스 지원 설정\"}],\"id\":\"Ain7GxDdKCUnQULhJolD4\"},{\"text\":\"\"}],\"start\":false,\"type\":\"uli\",\"id\":\"IA_tEtb_HW_QLFQKqoSoP\"},{\"children\":[{\"text\":\"작업 단계\"}],\"nodeId\":\".EC.9E.91.EC.97.85-.EB.8B.A8.EA.B3.84\",\"type\":\"h2\",\"id\":\"-Uc40ogErxeIsW2KGFKpV\"},{\"children\":[{\"text\":\"CDN 가속 활성화\"}],\"nodeId\":\"enabling-cdn-acceleration\",\"type\":\"h3\",\"id\":\"dxX0GfKoOoCMsUe9M5MMT\"},{\"children\":[{\"text\":\"1단계: 사용자 정의 도메인 바인딩\"}],\"nodeId\":\"1.EB.8B.A8.EA.B3.84.3A-.EC.82.AC.EC.9A.A9.EC.9E.90-.EC.A0.95.EC.9D.98-.EB.8F.84.EB.A9.94.EC.9D.B8-.EB.B0.94.EC.9D.B8.EB.94.A9\",\"type\":\"h4\",\"id\":\"vM7CrOUwBLzfWJQAB-ZlR\"},{\"children\":[{\"text\":\"버킷을 자체 도메인에 바인딩하고 CDN 가속을 활성화합니다. 자세한 작업 가이드는 \"},{\"children\":[{\"text\":\"사용자 정의 CDN 가속 도메인 활성화\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/31506\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/31506\"},\"type\":\"ref\",\"id\":\"yQlYqOI3o_bu6xgVqXDh_\"},{\"text\":\" 문서를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"2svSor6PkUrJIwjqRyAHE\"},{\"children\":[{\"text\":\"2단계: HTTPS 액세스 설정\"}],\"nodeId\":\"2.EB.8B.A8.EA.B3.84.3A-https-.EC.95.A1.EC.84.B8.EC.8A.A4-.EC.84.A4.EC.A0.95\",\"type\":\"h4\",\"id\":\"wAqaHnyMSZqR1rvzgxVBH\"},{\"children\":[{\"children\":[{\"text\":\"CDN 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cdn\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cdn\"},\"type\":\"ref\",\"id\":\"t-OQqXWhwxk2i1zJfLet4\"},{\"text\":\"에서 HTTPS를 설정합니다. 자세한 작업 가이드는 \"},{\"children\":[{\"text\":\"HTTPS 가속 설정 가이드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/228/35213\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/228/35213\"},\"type\":\"ref\",\"id\":\"ma5T_k6fiWAG949-U6xiL\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"BfSdkjV9TyDRDLPfv4W8g\"},{\"children\":[{\"text\":\"CDN 가속 비활성화\"}],\"nodeId\":\"disabling-cdn-acceleration\",\"type\":\"h3\",\"id\":\"IdByfFOL85gf1h6G9oWLP\"},{\"children\":[{\"text\":\"본 챕터에서는 Cloud Object Storage(COS)에서 리버스 프록시를 통해 사용자 정의 도메인(CDN 가속 비활성화)을 설정하고 HTTPS 액세스를 지원하는 작업을 예시를 통해 소개합니다. 본 예시에서는 CDN 가속이 비활성화된 상태에서 직접 사용자 정의 도메인 \"},{\"code\":1,\"text\":\"https://test.cos.com\"},{\"text\":\"을 통해 소속 리전이 광저우이고 이름이 testhttps-1250000000인 버킷에 액세스하게 됩니다. 구체적인 작업 순서는 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"w056cE02Vqtn4wXT_2fwH\"},{\"children\":[{\"text\":\"1단계: 사용자 정의 도메인 바인딩\"}],\"nodeId\":\"1.EB.8B.A8.EA.B3.84.3A-.EC.82.AC.EC.9A.A9.EC.9E.90-.EC.A0.95.EC.9D.98-.EB.8F.84.EB.A9.94.EC.9D.B8-.EB.B0.94.EC.9D.B8.EB.94.A92\",\"type\":\"h4\",\"id\":\"w_pXbw9ubjPO7DgWwQcQO\"},{\"children\":[{\"text\":\"COS 중국 내 공유 클라우드 리전과 싱가포르 리전은 이미 사용자 정의 원본 서버 도메인 호스팅을 위한 HTTPS 인증서를 지원하고 있으며, 추가된 사용자 정의 원본 서버 도메인은 콘솔을 통해 인증서를 바인딩 할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"#Method 1\"},\"children\":[{\"text\":\"방법1\"}],\"id\":\"a9rDoCYpjRNa5VUGGcB80\"},{\"text\":\"을 참고하십시오. 도메인에 HTTPS 인증서가 없는 경우 \"},{\"children\":[{\"text\":\"Tencent Cloud 인증서 신청\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/ssl\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/ssl\"},\"type\":\"ref\",\"id\":\"tNyxxRc-AtF-g5daESwh3\"},{\"text\":\"을 클릭할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"LStPRLX-sSnE0ukGTUjG5\"},{\"children\":[{\"text\":\"기타 해외 리전의 경우 현재 HTTPS 인증서 호스팅이 지원되지 않으며, HTTPS 인증서를 사용해야 하는 경우 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"#Method 2\"},\"children\":[{\"text\":\"방법2\"}],\"id\":\"DFIW3FnwNgU2ddckF1K5J\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"x9xCSJs4-yfwPADTVFec6\"},{\"children\":[{\"text\":\"\"},{\"type\":\"inline-anchor\",\"nodeId\":\"Method 1\",\"children\":[{\"text\":\"방법1\"}],\"id\":\"zgF4KTcN_Jeo1B_u4rCyw\"},{\"text\":\": COS 콘솔을 통해 사용자 정의 원본 서버 도메인 바인딩\"}],\"start\":false,\"type\":\"uli\",\"id\":\"gxP3P9lujV8sEdBwk0UvD\"},{\"start\":false,\"type\":\"p\",\"id\":\"BpgtQS9lK1bOGLzOnpfJ0\",\"children\":[{\"text\":\"버킷 testhttps-1250000000를 \"},{\"code\":1,\"text\":\"https://test.cos.com\"},{\"text\":\" 도메인에 바인딩하고, CDN 가속을 비활성화합니다. 자세한 작업 가이드는 \"},{\"children\":[{\"text\":\"사용자 정의 원본 서버 도메인 활성화\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/31507\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/31507\"},\"type\":\"ref\",\"id\":\"IB9eTOfPPVQwE6y_14BqN\"},{\"text\":\" 문서를 참고하십시오.\"}],\"indent\":1},{\"children\":[{\"text\":\"\"},{\"type\":\"inline-anchor\",\"nodeId\":\"Method 2\",\"children\":[{\"text\":\"방법2\"}],\"id\":\"QHfaKx8Gm0s6zbLktuWDk\"},{\"text\":\": 도메인에 리버스 프록시 설정\"}],\"start\":false,\"type\":\"uli\",\"id\":\"2mMb_QQekkIWxJoaG4fNc\"},{\"start\":false,\"type\":\"p\",\"id\":\"c7ykAEFUUbVlSkH1Bqb8Y\",\"children\":[{\"text\":\"서버 상의 \"},{\"code\":1,\"text\":\"https://test.cos.com\"},{\"text\":\" 도메인에 리버스 프록시를 설정합니다. 구체적인 설정 방법은 다음을 참고하십시오(Nginx 설정은 참고용으로만 제공).\"}],\"indent\":1},{\"children\":[{\"children\":[{\"text\":\"server {\"}],\"type\":\"code-line\",\"id\":\"-xIPF6wumfvWvNL2AmFt7\"},{\"children\":[{\"text\":\" listen 443;\"}],\"type\":\"code-line\",\"id\":\"UnnTqXvfzYMI26xx63pd_\"},{\"children\":[{\"text\":\" server_name test.cos.com ;\"}],\"type\":\"code-line\",\"id\":\"g9YvMLaZNHlraVtArL7xD\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"M70YAVbuxqgR30n0JDeM1\"},{\"children\":[{\"text\":\" ssl on;\"}],\"type\":\"code-line\",\"id\":\"oOPaQaSEEDmKvYFkyOcT1\"},{\"children\":[{\"text\":\" ssl_certificate /usr/local/nginx/conf/server.crt;\"}],\"type\":\"code-line\",\"id\":\"j2AkjpUTGsFi-bL3CoAko\"},{\"children\":[{\"text\":\" ssl_certificate_key /usr/local/nginx/conf/server.key;\"}],\"type\":\"code-line\",\"id\":\"Yonw7JLhZI9eFWY8A-xt9\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"RCU0gXKH3GeX8p9r---xd\"},{\"children\":[{\"text\":\" error_log logs/test.cos.com.error_log;\"}],\"type\":\"code-line\",\"id\":\"ip6kUA43-B7-jKqNCPixL\"},{\"children\":[{\"text\":\" access_log logs/test.cos.com.access_log;\"}],\"type\":\"code-line\",\"id\":\"ugLrzC3IypVjmE6mv8PYJ\"},{\"children\":[{\"text\":\" location / {\"}],\"type\":\"code-line\",\"id\":\"5uq-WIxof5Hd2FJaru4gr\"},{\"children\":[{\"text\":\" root /data/www/;\"}],\"type\":\"code-line\",\"id\":\"NtaWWLvUPdqsxz6ADVg7r\"},{\"children\":[{\"text\":\" proxy_pass http://testhttps-1250000000.cos.ap-guangzhou.myqcloud.com; //버킷(Bucket)의 기본 다운로드 도메인 설정 \"}],\"type\":\"code-line\",\"id\":\"2r-FHZi0pc6aw01KBEBSJ\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"i3uIOOHWcOPizt2GD5vRm\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"Gc_mW9k_wS3MaRO_SEy1T\"}],\"indent\":1,\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"4g2_nSUk5tL3ro5XQSAKU\",\"autoWrap\":false},{\"children\":[{\"code\":1,\"text\":\"server.crt;\"},{\"text\":\", \"},{\"code\":1,\"text\":\"server.key\"},{\"text\":\"는 귀하의 자체(사용자 정의) 도메인 HTTPS 인증서입니다. 귀하의 도메인에 HTTPS 인증서가 없는 경우 \"},{\"children\":[{\"text\":\"Tencent Cloud SSL 인증서\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/products/ssl\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/products/ssl\"},\"type\":\"ref\",\"id\":\"btZlybWeWM8G7eXqurDbj\"},{\"text\":\" 페이지에서 신청하십시오.\\n현재 인증서가 없는 경우 다음과 같은 설정 정보를 삭제할 수 있습니다. 액세스 시 알람이 뜰 수 있으나 계속을 클릭하면 액세스할 수 있습니다.\"}],\"indent\":1,\"type\":\"p\",\"id\":\"9ASCAs44Kb8k212lit30u\"},{\"children\":[{\"children\":[{\"text\":\"ssl on;\"}],\"type\":\"code-line\",\"id\":\"E-yk-eXxXFjsyZIcwIFxh\"},{\"children\":[{\"text\":\"ssl_certificate /usr/local/nginx/conf/server.crt;\"}],\"type\":\"code-line\",\"id\":\"zasmrgq3mfOG0deM8H3Dq\"},{\"children\":[{\"text\":\"ssl_certificate_key /usr/local/nginx/conf/server.key;\"}],\"type\":\"code-line\",\"id\":\"_acqukwEPHJo3ALqwLUkJ\"}],\"indent\":1,\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"Y4m1xTfEk07ShSDSmspQ_\",\"autoWrap\":false},{\"children\":[{\"text\":\"2단계: 서버로 도메인 리졸브\"}],\"nodeId\":\"2.EB.8B.A8.EA.B3.84.3A-.EC.84.9C.EB.B2.84.EB.A1.9C-.EB.8F.84.EB.A9.94.EC.9D.B8-.EB.A6.AC.EC.A1.B8.EB.B8.8C\",\"type\":\"h4\",\"id\":\"DOruvMeRBK_S_DDfs8CG2\"},{\"children\":[{\"text\":\"도메인 DNS 리졸브 서비스 제공 업체에서 사용자의 도메인을 리졸브합니다.\"}],\"type\":\"p\",\"id\":\"37HvIP3Eaw0j7kR71ZtWx\"},{\"children\":[{\"text\":\"3단계: 고급 설정\"}],\"nodeId\":\"3.EB.8B.A8.EA.B3.84.3A-.EA.B3.A0.EA.B8.89-.EC.84.A4.EC.A0.95\",\"type\":\"h4\",\"id\":\"YBIhbILZ4PJXlSoO3Dhpm\"},{\"children\":[{\"b\":1,\"text\":\"브라우저로 직접 웹 페이지 열기\"},{\"text\":\"\\n사용자 정의 도메인의 HTTPS 액세스 지원 설정을 완료하면 사용자의 도메인을 통해 버킷(Bucket)에 있는 객체(Object)를 다운로드할 수 있습니다. 비즈니스 수요에 따라 브라우저에서 직접 웹 페이지 및 이미지 등을 액세스해야 하는 경우 정적 웹 사이트 기능을 통해 실행할 수 있습니다. 자세한 작업 가이드는 \"},{\"children\":[{\"text\":\"정적 웹 사이트 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/14984\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/14984\"},\"type\":\"ref\",\"id\":\"D_HIYlIBxWx4thlFeIXMW\"},{\"text\":\"을 참고하십시오.\\n설정 완료 후, Nginx 설정에 정보를 한 행 추가한 다음 Nginx를 재시작해 브라우저 캐시를 새로 고칩니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"AYMoFMFHkXxuATep5RSMA\"},{\"children\":[{\"children\":[{\"text\":\"proxy_set_header Host $http_host;\"}],\"type\":\"code-line\",\"id\":\"t2FengFKDSlavRv1N8rPD\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"egVs68b6PHWMb4OUb89up\",\"autoWrap\":false},{\"children\":[{\"b\":1,\"text\":\"refer 링크 도용 방지 설정\"},{\"text\":\"\\n버킷(Bucket)이 공용인 경우 링크 도용 리스크가 있습니다. 링크 도용 방지 설정을 통해 Referer 얼로우리스트를 활성화하여 악성 링크 도용을 방지할 수 있습니다. 구체적인 작업 순서는 다음과 같습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"QrXkEZRlHEh8dSZuGCIbF\"},{\"children\":[{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\",\"id\":\"TpO2EvxdaR-tq3yNPOeaH\"},{\"text\":\"에 로그인한 후, 링크 도용 방지 설정 기능을 활성화하여 얼로우리스트를 선택합니다. 자세한 작업 가이드는 \"},{\"children\":[{\"text\":\"링크 도용 방지 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13319\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13319\"},\"type\":\"ref\",\"id\":\"evGTGFAUOfMTwhElyJpVH\"},{\"text\":\"을 참고하십시오.\"}],\"indent\":1,\"start\":true,\"type\":\"oli\",\"id\":\"1Xum_x7uDoXTfQd7rMWHk\"},{\"children\":[{\"text\":\"Nginx 구성 파일에 정보를 한 행 추가한 다음 Nginx를 재시작해 브라우저 캐시를 새로 고칩니다.\"}],\"indent\":1,\"start\":false,\"type\":\"oli\",\"id\":\"8ZGySawgvXLOEIgmnSWuC\"},{\"children\":[{\"children\":[{\"text\":\"proxy_set_header Referer www.test.com;\"}],\"type\":\"code-line\",\"id\":\"ecTnwV2SOno-Koq8oHhV3\"}],\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"JjT_3p3TWvSif5JG20KFt\",\"autoWrap\":false},{\"children\":[{\"text\":\"설정 완료 후, 바로 파일을 열면 \"},{\"code\":1,\"text\":\"errorcode: -46616\"},{\"text\":\" 오류 알림이 뜹니다. 오류 알림: refer 얼로우리스트가 미스되었으나 프록시를 통해 사용자 정의 도메인에 액세스하면 정상적으로 웹 페이지를 열 수 있습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"oli\",\"id\":\"NTFxhIouAu2OvyYrTKahO\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"rvUcbSn2bPsvw6WC0FXsc\"},{\"children\":[{\"text\":\"errorcode: -46616,\"}],\"type\":\"code-line\",\"id\":\"7eh0XrtafDpoT8JkNlA_z\"},{\"children\":[{\"text\":\"errormsg: \\\"not hit white refer, retcode:-46616\\\"\"}],\"type\":\"code-line\",\"id\":\"WVQU76BgMi2qJBVSan7_y\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"SgNsRppbn3wmKUSzROmtz\"}],\"indent\":2,\"language\":\"json\",\"type\":\"code-block\",\"id\":\"2EVRS6bkh24WhEViBSEy_\",\"autoWrap\":false},{\"type\":\"p\",\"children\":[{\"text\":\"\"}],\"id\":\"EEuMNZd04r1QQTaS3lsN9\"}]"}},"11488":{"categoryId":436,"weight":75,"type":"page","extension":"","pid":32966,"id":11488,"lang":"ko","title":"CORS 설정","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-05 22:47:02","recentReleaseTime":"2019-12-05 22:47:02","content":{"title":"CORS 설정","body":"

동일 출처 정책

동일 출처 정책은 어떤 출처에서 불러온 파일이나 스크립트가 다른 출처에서 가져온 리소스와 상호작용하는 것을 제한하며, 악성 위험이 있는 파일을 격리하는 핵심 보안 메커니즘에 사용됩니다. 동일한 프로토콜, 동일한 도메인(또는 IP), 동일한 포트를 동일한 출처로 보며, 한 출처 내의 스크립트는 해당 출처 내의 권한만 가집니다. 즉, 해당 출처의 스크립트는 해당 출처 내의 리소스만 읽고 쓸 수 있고 다른 출처의 리소스는 액세스할 수 없습니다. 이러한 보안 제한을 동일 출처 정책이라고 합니다.

동일 출처의 정의

두 페이지의 프로토콜, 도메인, 포트(포트를 지정한 경우)가 동일한 경우 동일 출처로 봅니다. 다음 표는 http://www.example.com/dir/page.html과의 동일 출처를 점검하는 예시입니다.
URL
결과
이유
http://www.example.com/dir2/other.html
성공
프로토콜, 도메인, 포트 동일
http://www.example.com/dir/inner/another.html
성공
프로토콜, 도메인, 포트 동일
https://www.example.com/secure.html
실패
프로토콜 불일치(HTTPS)
http://www.example.com:81/dir/etc.html
실패
포트 불일치(81)
http://news.example.com/dir/other.html
실패
도메인 불일치

크로스 도메인 액세스

Cross-Origin Resource Sharing(CORS) 메커니즘은 크로스 도메인 액세스라고도 하며, Web 애플리케이션 서버에서의 크로스 도메인 액세스 제어를 허용해 크로스 도메인 데이터 전송 시 보안을 보장합니다. CORS는 브라우저 및 서버에서 모두 지원해야 하며, 현재 모든 브라우저에서 해당 기능을 지원하고, IE 브라우저는 IE10 이상의 버전만 지원합니다.
모든 CORS 통신 프로세스는 브라우저에서 자동으로 완료하며 사용자가 개입할 필요가 없습니다. 개발자 입장에서 CORS 통신과 동일 출처의 AJAX 통신은 차이가 없으며 코드도 완전히 동일합니다. 브라우저에서 AJAX의 크로스 도메인 요청을 발견하면 자동으로 일부 헤더 정보가 추가되며, 때때로 다시 한번 부가 요청이 있게 되지만 사용자는 이를 감지할 수 없습니다.
따라서 CORS 통신 구현의 핵심은 서버입니다. 서버가 CORS 인터페이스를 구현하면 바로 크로스 도메인으로 통신됩니다.

CORS의 주요 사용 시나리오

사용자는 브라우저를 사용하는 상황에서 CORS를 사용할 수 있으며, 서버가 아닌 브라우저가 액세스 권한을 제어하기 때문에 다른 클라이언트를 사용해도 크로스 도메인 문제를 걱정하지 않아도 됩니다.
CORS의 주요 애플리케이션은 사용자의 애플리케이션 서버를 통한 중개가 필요 없이 브라우저에서 AJAX를 사용해 직접 COS 데이터에 액세스하거나 데이터의 업로드 및 다운로드를 실현합니다. 동시에 COS와 AJAX 기술을 사용한 웹 사이트는 CORS를 사용해 COS와 직접 통신하는 것을 권장합니다.

COS의 CORS에 대한 지원

COS에서 CORS 규칙 설정을 설정하여 필요에 따라 해당 크로스 도메인 요청을 허용하거나 거부할 수 있습니다. CORS 규칙 설정은 버킷 등급에 귀속됩니다.
CORS 요청의 통과 여부는 COS의 인증 등과 완전히 독립적입니다. 즉 COS의 CORS 규칙은 CORS 관련 Header 추가 여부를 결정하는 하나의 규칙일 뿐입니다. 해당 요청을 차단할지 여부는 완전히 브라우저에 의해 결정됩니다.
현재 COS의 모든 Object 관련 인터페이스에서 CORS 관련 인증을 제공하며, 이외에도 현재 Multipart와 관련한 인터페이스에서도 CORS 인증을 완벽하게 지원합니다.
설명:
동일한 브라우저 상의 각 www.a.comwww.b.com 두 페이지에서 동시에 동일한 크로스 도메인 리소스를 요청했을 때, www.a.com의 요청이 먼저 서버에 도달한 경우 서버는 리소스에 Access-Control-Allow-Origin 헤더를 추가하여 www.a.com 사용자에게 반환합니다. 이때 www.b.com에서 다시 요청하는 경우 서버는 Cache의 이전 요청에 대한 응답을 사용자에게 반환하여 헤더 내용과 CORS 요청이 매칭되지 않아 www.b.com의 요청이 실패하게 됩니다.

CORS 설정 예시

다음은 AJAX를 사용해 COS에서 데이터를 획득할 수 있도록 설정하는 간단한 예시입니다. 예시에서 사용한 버킷(Bucket)의 권한은 공유(Public)로 설정되어 있으며, 액세스 권한이 개인 버킷(Bucket)인 경우 요청에 서명만 추가하면 되고 다른 설정은 모두 동일합니다.\n다음 예시에서 사용한 버킷 이름은 corstest이며, 버킷 액세스 권한은 공개 읽기, 개인 쓰기입니다.

준비 과정

1. 파일에 정상적으로 액세스할 수 있는지 확인\ntest.txt의 텍스트 파일을 corstest에 업로드합니다. test.txt의 액세스 주소는 http://corstest-125xxxxxxx.cos.ap-beijing.myqcloud.com/test.txt가 됩니다.\ncurl을 사용해 직접 해당 텍스트 파일에 액세스합니다. 다음 주소를 사용자의 파일 주소로 대체합니다.
curl http://corstest-125xxxxxxx.cos.ap-beijing.myqcloud.com/test.txt
test.txt 파일 반환 내용이 test이면, 해당 파일에 정상적으로 액세스할 수 있다는 의미입니다.\n
\"\"

2. AJAX 기술을 사용해 파일 액세스\n이제 AJAX 기술을 사용해 직접 해당 test.txt 파일에 액세스를 시도해 봅니다.
1. 간단한 HTML 파일을 생성하여 다음 코드를 복사한 후, 로컬에 HTML 파일로 저장하여 브라우저로 파일을 엽니다. 사용자 정의 헤더를 설정하지 않았기 때문에 해당 요청은 사전 인증이 필요 없습니다.
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<a href="javascript:test()">Test CORS</a>
<script>
function test() {
var url = 'http://corstest-125xxxxxxx.cos.ap-beijing.myqcloud.com/test.txt';
var xhr = new XMLHttpRequest();
xhr.open('HEAD', url);
xhr.onload = function () {
var headers = xhr.getAllResponseHeaders().replace(/\\r\\n/g, '\\n');
alert('request success, CORS allow.\\n' +
'url: ' + url + '\\n' +
'status: ' + xhr.status + '\\n' +
'headers:\\n' + headers);
};
xhr.onerror = function () {
alert('request error, maybe CORS error.');
};
xhr.send();
}
</script>
</body>
</html>
2. 브라우저에서 해당 HTML 파일을 열고 Test CORS를 클릭하여 요청을 발송하면 다음 오류가 나타납니다. 오류 안내: 액세스 권한이 없습니다. 오류 발생 원인은 Access-Control-Allow-Origin Header를 찾을 수 없기 때문으로, 이는 서버에서 CORS를 설정하지 않기 때문입니다.\n
\"\"

3. 액세스에 실패한 후, 다시 Header 인터페이스로 이동해 원인을 확인하면 브라우저에서 Origin이 있는 Request를 발송했다는 것을 확인할 수 있으며, 이에 따라 해당 요청은 크로스 도메인인 것을 알 수 있습니다.\n
\"\"

설명:
웹 페이지를 서버에 구축할 때 주소가 http://127.0.0.1:8081이면 Origin은 http://127.0.0.1:8081이 됩니다.

CORS 설정

액세스 실패 원인을 확인한 후, 버킷에 관련된 CORS 설정을 하여 해당 문제를 해결할 수 있습니다. COS 콘솔에서 CORS를 설정할 수 있으며, 본 예시에서는 콘솔을 사용해 CORS를 설정하는 방법을 소개합니다. 사용자의 CORS 설정이 특별하게 복잡하지 않다면 콘솔을 사용해 CORS를 설정하는 것을 권장합니다.
1. COS 콘솔에 로그인한 후 버킷 리스트를 클릭하여 해당 버킷으로 이동하고, 보안 관리 탭을 클릭한 뒤 페이지를 내리면 "CORS 설정"을 찾을 수 있습니다.
2. 규칙 추가를 클릭해 첫 번째 규칙을 추가하고, 다음과 같이 가장 완화된 설정을 사용합니다.\n
\"\"

주의:
CORS 설정은 규칙 하나 하나가 모여 구성되며, 첫 번째 규칙부터 차례로 매칭하고 가장 처음에 매칭된 규칙을 기준으로 합니다.

인증 결과

설정 완료 후, 다시 text.txt 텍스트 파일에 액세스를 시도합니다. 다음과 같은 결과가 나타나면 액세스 요청이 정상적으로 처리된 것입니다.\n
\"\"


장애 해결 및 권장사항

크로스 도메인으로 인한 액세스 문제를 해결해야 하는 경우 CORS 설정을 다음과 같이 완화된 설정으로 설정합니다. 해당 설정은 모든 크로스 도메인 요청을 허용하며, 해당 설정 후에도 여전히 문제가 발생하는 경우 CORS가 아닌 다른 부분에서 오류가 발생한 것입니다.
가장 완화된 설정 이외에도, 더 자세한 제어 메커니즘을 설정하여 맞춤형 제어를 실현할 수 있습니다. 예를 들어, 본 예시에 다음과 같은 최소 설정을 사용해 매칭에 성공할 수 있습니다.\n
\"\"

\n따라서 대부분의 시나리오에서는 실제 필요에 따라 최소 설정을 사용해 보안성을 보장하십시오.

CORS 설정 항목 설명

CORS 설정에는 다음과 같은 설정 항목이 있습니다.

출처 Origin

크로스 도메인 요청을 허용하는 출처입니다.
동시에 여러 개의 출처를 지정할 수 있으며, 한 행에 하나만 입력합니다.
* 설정을 지원하며, 모든 도메인을 허용한다는 의미로 권장하지 않습니다.
http://www.abc.com과 같은 단일의 구체적인 도메인을 지원합니다.
http://*.abc.com 형식의 두 번째 레벨 와일드카드 도메인 이름이 지원되지만 각 줄에는 *가 하나만 포함될 수 있습니다.
프로토콜명 HTTP 또는 HTTPS를 반드시 입력해야 하며, 포트가 기본값이 80이 아닌 경우 포트가 포함되어 있어야 합니다.

작업 Methods

허용하는 크로스 도메인 요청 방법(1개 이상)을 열거합니다.\n예시: GET, PUT, POST, DELETE, HEAD

Allow-Header

허용하는 크로스 도메인 요청 Header입니다.
동시에 여러 개의 출처를 지정할 수 있으며, 한 행에 하나만 입력합니다.
Header는 쉽게 누락될 수 있으며, 특별히 필요한 경우가 아니라면 *로 설정하는 것을 장합니다. 이는 모두 허용한다는 의미입니다.
대소문자를 구분하지 않습니다.
Access-Control-Request-Headers에 지정된 각 Header는 Allowed-Header의 값과 일치해야 합니다.

Expose-Header

브라우저에 노출되는 Header 리스트입니다. 즉, 사용자가 응용 프로그램에서 액세스하는 응답 헤더(예: Javascript의 XMLHttpRequest 객체)입니다.
구체적인 설정은 애플리케이션의 수요에 따라 확정되며, 기본적으로 Etag 입력을 권장합니다.
와일드카드 부호는 사용할 수 없으며, 대소문자를 구분하지 않고 각 행에 하나만 입력할 수 있습니다.

시간 초과 Max-Age

브라우저의 특정 리소스의 선취 요청(OPTIONS 요청)에 대한 반환 결과 캐시 시간으로, 단위는 초입니다. 특별한 요구가 없는 경우 약간 크게 설정할 수 있으며(예: 60초), 해당 항목은 선택 설정 항목입니다.
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"동일 출처 정책\"}],\"nodeId\":\".EB.8F.99.EC.9D.BC-.EC.B6.9C.EC.B2.98-.EC.A0.95.EC.B1.85\",\"type\":\"h2\"},{\"children\":[{\"text\":\"동일 출처 정책은 어떤 출처에서 불러온 파일이나 스크립트가 다른 출처에서 가져온 리소스와 상호작용하는 것을 제한하며, 악성 위험이 있는 파일을 격리하는 핵심 보안 메커니즘에 사용됩니다. 동일한 프로토콜, 동일한 도메인(또는 IP), 동일한 포트를 동일한 출처로 보며, 한 출처 내의 스크립트는 해당 출처 내의 권한만 가집니다. 즉, 해당 출처의 스크립트는 해당 출처 내의 리소스만 읽고 쓸 수 있고 다른 출처의 리소스는 액세스할 수 없습니다. 이러한 보안 제한을 동일 출처 정책이라고 합니다. \"}],\"type\":\"p\"},{\"children\":[{\"text\":\"동일 출처의 정의\"}],\"nodeId\":\".EB.8F.99.EC.9D.BC-.EC.B6.9C.EC.B2.98.EC.9D.98-.EC.A0.95.EC.9D.98\",\"type\":\"h4\"},{\"children\":[{\"text\":\"두 페이지의 프로토콜, 도메인, 포트(포트를 지정한 경우)가 동일한 경우 동일 출처로 봅니다. 다음 표는 \"},{\"code\":1,\"text\":\"http://www.example.com/dir/page.html\"},{\"text\":\"과의 동일 출처를 점검하는 예시입니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"b\":1,\"text\":\"URL\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"결과\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"이유\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"code\":1,\"text\":\"http://www.example.com/dir2/other.html\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"성공\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"프로토콜, 도메인, 포트 동일\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"code\":1,\"text\":\"http://www.example.com/dir/inner/another.html\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"성공\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"프로토콜, 도메인, 포트 동일\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"code\":1,\"text\":\"https://www.example.com/secure.html\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"실패\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"프로토콜 불일치(HTTPS)\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"code\":1,\"text\":\"http://www.example.com:81/dir/etc.html\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"실패\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"포트 불일치(81)\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"code\":1,\"text\":\"http://news.example.com/dir/other.html\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"실패\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"도메인 불일치\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\"},{\"children\":[{\"text\":\"크로스 도메인 액세스\"}],\"nodeId\":\".ED.81.AC.EB.A1.9C.EC.8A.A4-.EB.8F.84.EB.A9.94.EC.9D.B8-.EC.95.A1.EC.84.B8.EC.8A.A4\",\"type\":\"h4\"},{\"children\":[{\"text\":\"Cross-Origin Resource Sharing(CORS) 메커니즘은 크로스 도메인 액세스라고도 하며, Web 애플리케이션 서버에서의 크로스 도메인 액세스 제어를 허용해 크로스 도메인 데이터 전송 시 보안을 보장합니다. CORS는 브라우저 및 서버에서 모두 지원해야 하며, 현재 모든 브라우저에서 해당 기능을 지원하고, IE 브라우저는 IE10 이상의 버전만 지원합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"모든 CORS 통신 프로세스는 브라우저에서 자동으로 완료하며 사용자가 개입할 필요가 없습니다. 개발자 입장에서 CORS 통신과 동일 출처의 AJAX 통신은 차이가 없으며 코드도 완전히 동일합니다. 브라우저에서 AJAX의 크로스 도메인 요청을 발견하면 자동으로 일부 헤더 정보가 추가되며, 때때로 다시 한번 부가 요청이 있게 되지만 사용자는 이를 감지할 수 없습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"따라서 CORS 통신 구현의 핵심은 서버입니다. 서버가 CORS 인터페이스를 구현하면 바로 크로스 도메인으로 통신됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"CORS의 주요 사용 시나리오\"}],\"nodeId\":\"cors.EC.9D.98-.EC.A3.BC.EC.9A.94-.EC.82.AC.EC.9A.A9-.EC.8B.9C.EB.82.98.EB.A6.AC.EC.98.A4\",\"type\":\"h2\"},{\"children\":[{\"text\":\"사용자는 브라우저를 사용하는 상황에서 CORS를 사용할 수 있으며, 서버가 아닌 브라우저가 액세스 권한을 제어하기 때문에 다른 클라이언트를 사용해도 크로스 도메인 문제를 걱정하지 않아도 됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"CORS의 주요 애플리케이션은 사용자의 애플리케이션 서버를 통한 중개가 필요 없이 브라우저에서 AJAX를 사용해 직접 COS 데이터에 액세스하거나 데이터의 업로드 및 다운로드를 실현합니다. 동시에 COS와 AJAX 기술을 사용한 웹 사이트는 CORS를 사용해 COS와 직접 통신하는 것을 권장합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"COS의 CORS에 대한 지원\"}],\"nodeId\":\"cos.EC.9D.98-cors.EC.97.90-.EB.8C.80.ED.95.9C-.EC.A7.80.EC.9B.90\",\"type\":\"h2\"},{\"children\":[{\"text\":\"COS에서 CORS 규칙 설정을 설정하여 필요에 따라 해당 크로스 도메인 요청을 허용하거나 거부할 수 있습니다. CORS 규칙 설정은 버킷 등급에 귀속됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"CORS 요청의 통과 여부는 COS의 인증 등과 완전히 독립적입니다. 즉 COS의 CORS 규칙은 CORS 관련 Header 추가 여부를 결정하는 하나의 규칙일 뿐입니다. 해당 요청을 차단할지 여부는 완전히 브라우저에 의해 결정됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"현재 COS의 모든 Object 관련 인터페이스에서 CORS 관련 인증을 제공하며, 이외에도 현재 Multipart와 관련한 인터페이스에서도 CORS 인증을 완벽하게 지원합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"동일한 브라우저 상의 각 \"},{\"code\":1,\"text\":\"www.a.com\"},{\"text\":\"와 \"},{\"code\":1,\"text\":\"www.b.com\"},{\"text\":\" 두 페이지에서 동시에 동일한 크로스 도메인 리소스를 요청했을 때, \"},{\"code\":1,\"text\":\"www.a.com\"},{\"text\":\"의 요청이 먼저 서버에 도달한 경우 서버는 리소스에 Access-Control-Allow-Origin 헤더를 추가하여 \"},{\"code\":1,\"text\":\"www.a.com\"},{\"text\":\" 사용자에게 반환합니다. 이때 \"},{\"code\":1,\"text\":\"www.b.com\"},{\"text\":\"에서 다시 요청하는 경우 서버는 Cache의 이전 요청에 대한 응답을 사용자에게 반환하여 헤더 내용과 CORS 요청이 매칭되지 않아 \"},{\"code\":1,\"text\":\"www.b.com\"},{\"text\":\"의 요청이 실패하게 됩니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"CORS 설정 예시\"}],\"nodeId\":\"cors-.EC.84.A4.EC.A0.95-.EC.98.88.EC.8B.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"다음은 AJAX를 사용해 COS에서 데이터를 획득할 수 있도록 설정하는 간단한 예시입니다. 예시에서 사용한 버킷(Bucket)의 권한은 공유(Public)로 설정되어 있으며, 액세스 권한이 개인 버킷(Bucket)인 경우 요청에 서명만 추가하면 되고 다른 설정은 모두 동일합니다.\\n다음 예시에서 사용한 버킷 이름은 corstest이며, 버킷 액세스 권한은 공개 읽기, 개인 쓰기입니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"준비 과정\"}],\"nodeId\":\".EC.A4.80.EB.B9.84-.EA.B3.BC.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"b\":1,\"text\":\"파일에 정상적으로 액세스할 수 있는지 확인\"},{\"text\":\"\\ntest.txt의 텍스트 파일을 corstest에 업로드합니다. test.txt의 액세스 주소는 \"},{\"code\":1,\"text\":\"http://corstest-125xxxxxxx.cos.ap-beijing.myqcloud.com/test.txt\"},{\"text\":\"가 됩니다.\\ncurl을 사용해 직접 해당 텍스트 파일에 액세스합니다. 다음 주소를 사용자의 파일 주소로 대체합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"curl http://corstest-125xxxxxxx.cos.ap-beijing.myqcloud.com/test.txt\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"test.txt 파일 반환 내용이 test이면, 해당 파일에 정상적으로 액세스할 수 있다는 의미입니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/d9e4cee0e6ac49d9774bab3be46bed46.png\"}],\"indent\":1,\"type\":\"p\"},{\"children\":[{\"b\":1,\"text\":\"AJAX 기술을 사용해 파일 액세스\"},{\"text\":\"\\n이제 AJAX 기술을 사용해 직접 해당 test.txt 파일에 액세스를 시도해 봅니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"간단한 HTML 파일을 생성하여 다음 코드를 복사한 후, 로컬에 HTML 파일로 저장하여 브라우저로 파일을 엽니다. 사용자 정의 헤더를 설정하지 않았기 때문에 해당 요청은 사전 인증이 필요 없습니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"\\u003c!doctype html\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003chtml lang=\\\"en\\\"\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003chead\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cmeta charset=\\\"UTF-8\\\"\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/head\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cbody\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003ca href=\\\"javascript:test()\\\"\\u003eTest CORS\\u003c/a\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cscript\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"function test() {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" var url = 'http://corstest-125xxxxxxx.cos.ap-beijing.myqcloud.com/test.txt';\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" var xhr = new XMLHttpRequest();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" xhr.open('HEAD', url);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" xhr.onload = function () {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" var headers = xhr.getAllResponseHeaders().replace(/\\\\r\\\\n/g, '\\\\n');\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" alert('request success, CORS allow.\\\\n' +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'url: ' + url + '\\\\n' +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'status: ' + xhr.status + '\\\\n' +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'headers:\\\\n' + headers);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" xhr.onerror = function () {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" alert('request error, maybe CORS error.');\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" xhr.send();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/script\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/body\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/html\\u003e\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"브라우저에서 해당 HTML 파일을 열고 \"},{\"b\":1,\"text\":\"Test CORS\"},{\"text\":\"를 클릭하여 요청을 발송하면 다음 오류가 나타납니다. 오류 안내: 액세스 권한이 없습니다. 오류 발생 원인은 Access-Control-Allow-Origin Header를 찾을 수 없기 때문으로, 이는 서버에서 CORS를 설정하지 않기 때문입니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/db84b59f4e48ec50b3b577fa116fe7ba.jpg\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"액세스에 실패한 후, 다시 Header 인터페이스로 이동해 원인을 확인하면 브라우저에서 Origin이 있는 Request를 발송했다는 것을 확인할 수 있으며, 이에 따라 해당 요청은 크로스 도메인인 것을 알 수 있습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/0ba03fd90d9e6bb59785a6ba3b17d812.jpg\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"웹 페이지를 서버에 구축할 때 주소가 \"},{\"code\":1,\"text\":\"http://127.0.0.1:8081\"},{\"text\":\"이면 Origin은 \"},{\"code\":1,\"text\":\"http://127.0.0.1:8081\"},{\"text\":\"이 됩니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"CORS 설정\"}],\"nodeId\":\"cors-.EC.84.A4.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"text\":\"액세스 실패 원인을 확인한 후, 버킷에 관련된 CORS 설정을 하여 해당 문제를 해결할 수 있습니다. COS 콘솔에서 CORS를 설정할 수 있으며, 본 예시에서는 콘솔을 사용해 CORS를 설정하는 방법을 소개합니다. 사용자의 CORS 설정이 특별하게 복잡하지 않다면 콘솔을 사용해 CORS를 설정하는 것을 권장합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\"},{\"text\":\"에 로그인한 후 \"},{\"b\":1,\"text\":\"버킷 리스트\"},{\"text\":\"를 클릭하여 해당 버킷으로 이동하고, \"},{\"b\":1,\"text\":\"보안 관리\"},{\"text\":\" 탭을 클릭한 뒤 페이지를 내리면 \\\"CORS 설정\\\"을 찾을 수 있습니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"규칙 추가\"},{\"text\":\"를 클릭해 첫 번째 규칙을 추가하고, 다음과 같이 가장 완화된 설정을 사용합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/6a1f4bed7f42fba69449514822759c42.png\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" CORS 설정은 규칙 하나 하나가 모여 구성되며, 첫 번째 규칙부터 차례로 매칭하고 가장 처음에 매칭된 규칙을 기준으로 합니다.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"인증 결과\"}],\"nodeId\":\".EC.9D.B8.EC.A6.9D-.EA.B2.B0.EA.B3.BC\",\"type\":\"h4\"},{\"children\":[{\"text\":\"설정 완료 후, 다시 text.txt 텍스트 파일에 액세스를 시도합니다. 다음과 같은 결과가 나타나면 액세스 요청이 정상적으로 처리된 것입니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://qcloudimg.tencent-cloud.cn/raw/b3725a24d973dd4799ec58ddb081dffd.jpg\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"장애 해결 및 권장사항\"}],\"nodeId\":\".EC.9E.A5.EC.95.A0-.ED.95.B4.EA.B2.B0-.EB.B0.8F-.EA.B6.8C.EC.9E.A5.EC.82.AC.ED.95.AD\",\"type\":\"h3\"},{\"children\":[{\"text\":\"크로스 도메인으로 인한 액세스 문제를 해결해야 하는 경우 CORS 설정을 다음과 같이 완화된 설정으로 설정합니다. 해당 설정은 모든 크로스 도메인 요청을 허용하며, 해당 설정 후에도 여전히 문제가 발생하는 경우 CORS가 아닌 다른 부분에서 오류가 발생한 것입니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"가장 완화된 설정 이외에도, 더 자세한 제어 메커니즘을 설정하여 맞춤형 제어를 실현할 수 있습니다. 예를 들어, 본 예시에 다음과 같은 최소 설정을 사용해 매칭에 성공할 수 있습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/6a1f4bed7f42fba69449514822759c42.png\"},{\"text\":\"\\n따라서 대부분의 시나리오에서는 실제 필요에 따라 최소 설정을 사용해 보안성을 보장하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"CORS 설정 항목 설명\"}],\"nodeId\":\"cors-.EC.84.A4.EC.A0.95-.ED.95.AD.EB.AA.A9-.EC.84.A4.EB.AA.85\",\"type\":\"h2\"},{\"children\":[{\"text\":\"CORS 설정에는 다음과 같은 설정 항목이 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"출처 Origin\"}],\"nodeId\":\".EC.B6.9C.EC.B2.98-origin\",\"type\":\"h4\"},{\"children\":[{\"text\":\"크로스 도메인 요청을 허용하는 출처입니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"동시에 여러 개의 출처를 지정할 수 있으며, 한 행에 하나만 입력합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"code\":1,\"text\":\"*\"},{\"text\":\" 설정을 지원하며, 모든 도메인을 허용한다는 의미로 권장하지 않습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"code\":1,\"text\":\"http://www.abc.com\"},{\"text\":\"과 같은 단일의 구체적인 도메인을 지원합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"code\":1,\"text\":\"http://*.abc.com\"},{\"text\":\" 형식의 두 번째 레벨 와일드카드 도메인 이름이 지원되지만 각 줄에는 \"},{\"code\":1,\"text\":\"*\"},{\"text\":\"가 하나만 포함될 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"프로토콜명 HTTP 또는 HTTPS를 반드시 입력해야 하며, 포트가 기본값이 80이 아닌 경우 포트가 포함되어 있어야 합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"작업 Methods\"}],\"nodeId\":\".EC.9E.91.EC.97.85-methods\",\"type\":\"h4\"},{\"children\":[{\"text\":\"허용하는 크로스 도메인 요청 방법(1개 이상)을 열거합니다.\\n예시: GET, PUT, POST, DELETE, HEAD\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"Allow-Header\"}],\"nodeId\":\"allow-header\",\"type\":\"h4\"},{\"children\":[{\"text\":\"허용하는 크로스 도메인 요청 Header입니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"동시에 여러 개의 출처를 지정할 수 있으며, 한 행에 하나만 입력합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"Header는 쉽게 누락될 수 있으며, 특별히 필요한 경우가 아니라면 \"},{\"code\":1,\"text\":\"*\"},{\"text\":\"로 설정하는 것을 장합니다. 이는 모두 허용한다는 의미입니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"대소문자를 구분하지 않습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"Access-Control-Request-Headers에 지정된 각 Header는 Allowed-Header의 값과 일치해야 합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"Expose-Header\"}],\"nodeId\":\"expose-header\",\"type\":\"h4\"},{\"children\":[{\"text\":\"브라우저에 노출되는 Header 리스트입니다. 즉, 사용자가 응용 프로그램에서 액세스하는 응답 헤더(예: Javascript의 XMLHttpRequest 객체)입니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"구체적인 설정은 애플리케이션의 수요에 따라 확정되며, 기본적으로 Etag 입력을 권장합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"와일드카드 부호는 사용할 수 없으며, 대소문자를 구분하지 않고 각 행에 하나만 입력할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"시간 초과 Max-Age\"}],\"nodeId\":\".EC.8B.9C.EA.B0.84-.EC.B4.88.EA.B3.BC-max-age\",\"type\":\"h4\"},{\"children\":[{\"text\":\"브라우저의 특정 리소스의 선취 요청(OPTIONS 요청)에 대한 반환 결과 캐시 시간으로, 단위는 초입니다. 특별한 요구가 없는 경우 약간 크게 설정할 수 있으며(예: 60초), 해당 항목은 선택 설정 항목입니다.\"}],\"type\":\"p\"}]"}},"11714":{"categoryId":436,"weight":80,"type":"page","extension":"","pid":12473,"id":11714,"lang":"ko","title":"서브 계정에 COS 액세스 권한 부여","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:10","recentReleaseTime":"2019-12-06 19:34:10","content":{"title":"서브 계정에 COS 액세스 권한 부여","body":"

개요

CAM(Cloud Access Management)을 통해 COS(Cloud Object Storage) 버킷 또는 객체에 대해 서로 다른 작업 권한을 설정할 수 있으므로 서로 다른 회사 또는 부서의 서로 다른 팀 또는 사용자가 서로 더 잘 협업할 수 있습니다.
먼저 루트 계정, 서브 계정(사용자), 사용자 그룹 등 몇 가지 핵심 개념을 이해하고 있어야 합니다. CAM과 관련된 용어 및 설정에 대한 자세한 설명은 CAM Glossary를 참조하십시오.

루트 계정

루트 계정은 개발사라고도 합니다. 사용자가 Tencent Cloud 계정을 신청하면 시스템은 Tencent Cloud 서비스에 로그인할 루트 계정 정보를 생성합니다. 루트 계정은 Tencent Cloud 리소스의 사용 용량 계산 및 과금의 기본 주체입니다.
루트 계정은 기본적으로 해당 계정의 모든 리소스에 대해 청구서 정보 확인, 사용자 비밀번호 변경, 사용자 및 사용자 그룹 생성, 기타 클라우드 서비스 리소스 액세스 등을 포함한 완전한 액세스 권한을 보유하고 있습니다. 기본 설정 시 리소스는 루트 계정만 액세스할 수 있으며 다른 사용자는 루트 계정에서 권한을 부여해야만 액세스할 수 있습니다.

서브 계정(사용자) 및 사용자 그룹

서브 계정은 루트 계정에서 생성하는 엔터티로, 확실한 ID 및 자격 증명을 가지고 있으며 Tencent Cloud 콘솔에 로그인할 수 있는 권한을 가지고 있습니다.
서브 계정은 기본적으로 리소스를 보유하고 있지 않으며, 반드시 소속된 루트 계정에서 권한을 부여해야 합니다.
하나의 루트 계정은 여러 개의 서브 계정(사용자)을 생성할 수 있습니다.
하나의 서브 계정은 여러 개의 루트 계정에 소속될 수 있으며, 각각의 루트 계정과 협업하여 루트 계정별 클라우드 리소스를 관리할 수 있습니다. 단, 하나의 서브 계정이 동시에 여러 루트 계정에 로그인할 수는 없으며, 하나의 루트 계정 소속으로 로그인하여 해당 루트 계정의 클라우드 리소스만 관리할 수 있습니다.
서브 계정은 콘솔을 통해 개발사(루트 계정)를 전환할 수 있으며, 하나의 루트 계정에서 다른 루트 계정으로 전환할 수 있습니다.
서브 계정은 콘솔에 로그인할 때 자동으로 기본 루트 계정으로 전환되며, 기본 루트 계정에서 부여한 액세스 권한을 가집니다.
개발사를 전환하면 서브 계정은 전환된 루트 계정이 부여한 액세스 권한을 가지며, 전환 전의 루트 계정이 부여한 액세스 권한은 즉시 효력이 사라집니다.
사용자 그룹은 동일한 직무의 여러 사용자(서브 계정)가 모인 집합체입니다. 업무 필요에 따라 서로 다른 사용자 그룹을 생성할 수 있으며, 사용자 그룹에 적합한 정책을 연결하여 각 권한을 할당할 수 있습니다.

작업 단계

서브 계정에 COS 액세스 권한을 부여하는 순서는 서브 계정 생성, 서브 계정에 권한 부여, 서브 계정으로 COS 리소스에 액세스, 해당 세 단계로 나뉩니다.

1단계: 서브 계정 생성

CAM 콘솔에서 서브 계정을 생성하고 액세스 권한을 설정할 수 있습니다. 자세한 작업 방법은 다음과 같습니다.
1. CAM 콘솔에 로그인합니다.
2. 사용자 > 사용자 목록 > 사용자 생성을 선택하여 사용자 생성 페이지로 이동합니다.
3. 사용자 정의 생성을 선택하고 리소스 액세스 및 메시지 수신을 설정한 후 다음을 클릭합니다.
4. 필요에 따라 사용자 관련 정보를 입력합니다.
사용자 정보: 서브 계정의 사용자 이름 및 이메일 주소를 설정합니다. 이메일 주소는 서브 계정을 WeChat 계정과 연결하기 위해 Tencent Cloud에서 보낸 이메일을 수신하는 데 필요합니다.
액세스 방식: 프로그래밍 액세스 및 Tencent Cloud 콘솔 액세스를 선택하고, 다른 설정은 필요에 따라 선택합니다.
5. 사용자 정보를 모두 작성한 후, 다음 단계를 클릭하여 자격을 인증합니다.
6. 서브 계정에 권한을 부여합니다. 제공된 정책 옵션으로 서브 계정에 COS 버킷 목록에 대한 액세스 권한 또는 읽기 전용 권한을 부여하는 것과 같은 간단한 정책을 구성할 수 있습니다. 보다 복잡한 정책을 설정하려면 2단계: 서브 계정에 권한 부여를 진행하십시오.
7. 사용자 태그를 선택적으로 설정하고 다음 단계을 클릭합니다.
8. 완료를 클릭하면 서브 계정이 생성됩니다.

2단계: 서브 계정에 권한 부여

사용자 지정 정책을 생성하거나 기존 정책을 선택하고 서브 계정과 연결합니다.
1. CAM 콘솔에 로그인합니다.
2. 정책 > 사용자 정의 정책 생성 > 정책 구문 생성을 선택하여 정책 생성 페이지로 이동합니다.
3. 실제 필요에 따라 빈 템플릿을 선택하여 권한 부여 정책을 사용자 정의하거나 COS와 연결할 시스템 템플릿을 선택하고 다음을 클릭합니다.
4. 기억하기 쉬운 정책 이름을 입력합니다. 빈 템플릿을 선택한 경우 정책 구문을 입력해야 합니다. 자세한 내용은 정책 예시 를 참고하십시오. 정책 내용을 복사하여 정책 내용 상자에 붙여넣고 입력한 정보가 정확한지 확인한 후 완료를 클릭합니다.
5. 생성 완료 후, 방금 생성한 정책을 서브 계정에 연결합니다.
\"\"

6. 서브 계정을 선택하고 확인을 클릭해 권한을 부여하면, 서브 계정을 이용해 한정된 COS 리소스에 액세스할 수 있습니다.
\"\"


3단계: 서브 계정으로 COS 리소스에 액세스

위 1단계에서 설정한 프로그래밍 액세스 및 Tencent Cloud 콘솔 액세스 방법을 다음과 같이 소개합니다.
(1) 프로그래밍 액세스
서브 계정을 사용하여 프로그램(예: API, SDK, 툴 등)으로 COS 리소스에 액세스할 때에는 루트 계정의 APPID와 서브 계정의 SecretId, SecretKey 정보가 필요합니다. CAM 콘솔에서 서브 계정의 SecretId와 SecretKey를 생성할 수 있습니다.
1. 루트 계정으로 CAM 콘솔에 로그인합니다.
2. 사용자 리스트를 선택하여 사용자 리스트 페이지로 이동합니다.
3. 서브 계정의 사용자 이름을 클릭하여 서브 계정 정보 상세 페이지로 이동합니다.
4. API Keys 탭을 클릭하고 키 생성을 클릭하여 서브 계정에 SecretId와 SecretKey를 생성합니다.
이제 서브 계정의 SecretId와 SecretKey, 루트 계정의 APPID를 사용해 COS 리소스에 액세스할 수 있습니다.
주의:
서브 계정은 XML API 또는 XML API 기반의 SDK를 통해 COS 리소스에 액세스할 수 있습니다.

XML 기반의 Java SDK를 통한 액세스 예시

XML 기반의 Java SDK 명령 라인 예시이며, 다음과 같이 매개변수를 입력해야 합니다.
// 사용자 인증 정보 초기화
COSCredentials cred = new BasicCOSCredentials("<루트 계정 APPID>", "<서브 계정 SecretId>", "<서브 계정 SecretKey>");
인스턴스는 다음과 같습니다.
String secretId = System.getenv("secretId");//서브 계정의 SecretId. 리스크를 줄이기 위해 최소 권한 원칙을 따릅니다. 서브 계정 키를 얻는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/598/37140
String secretKey = System.getenv("secretKey");//서브 계정의 SecretKey. 리스크를 줄이기 위해 최소 권한 원칙을 따릅니다. 서브 계정 키를 얻는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/598/37140
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

// 사용자 인증 정보 초기화
COSCredentials cred = new BasicCOSCredentials("<루트 계정 APPID>", secretId, secretKey);

COSCMD TCCLI를 이용한 액세스 예시

COSCMD의 명령어 설정 예시이며, 다음과 같이 매개변수를 입력해야 합니다.
coscmd config -u <루트 계정 APPID> -a <서브 계정 SecretId> -s <서브 계정 SecretKey> -b <루트 계정 bucketname> -r <루트 계정 bucket의 소속 리전>
인스턴스는 다음과 같습니다.
coscmd config -u 1250000000 -a ************************************ -s e8Sdeasdfas2238Vi**** -b examplebucket -r ap-beijing
(2) Tencent Cloud 콘솔 액세스
서브 계정는 권한 부여 후 서브 계정 로그인 페이지에서 루트 계정 아이디, 서브 계정 이름, 서브 계정 비밀번호를 입력하여 콘솔에 로그인할 수 있습니다. 그런 다음 제품에서 Cloud Object Storage를 클릭하여 루트 계정에서 스토리지 리소스에 액세스할 수 있습니다.

정책 예시

다음과 같은 일반적인 샘플 정책이 여기에서 제공됩니다. 정책을 구성할 때 아래 코드를 참고하여 정책 내용 란에 복사 붙여넣기 하시고 필요에 따라 수정하시면 됩니다. 다른 일반적인 COS 시나리오에 대한 자세한 정책 구문은 액세스 정책 언어 개요 또는 CAM 제품 문서비즈니스 사용 사례 부분을 참고하십시오.

예시1: 서브 계정에 COS 전체 읽기 및 쓰기 권한 설정

주의:
본 정책의 권한 부여 범위가 넓습니다. 설정 시 유의하십시오.
자세한 정책 설정 구문은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action":[
"name/cos:*"
],
"resource": "*",
"effect": "allow"
},
{
"effect": "allow",
"action": "monitor:*",
"resource": "*"
}
]
}

예시2: 서브 계정에 읽기 전용 권한 설정

서브 계정에 읽기 전용 권한을 부여하는 자세한 정책 설정 구문은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action":[
"name/cos:List*",
"name/cos:Get*",
"name/cos:Head*",
"name/cos:OptionsObject"
],
"resource": "*",
"effect": "allow"
},
{
"effect": "allow",
"action": "monitor:*",
"resource": "*"
}
]
}

예시3: 서브 계정에 쓰기 전용 권한 설정(삭제 제외)

자세한 정책 설정 구문은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"effect": "allow",
"action":[
"cos:ListParts",
"cos:PostObject",
"cos:PutObject*",
"cos:InitiateMultipartUpload",
"cos:UploadPart",
"cos:UploadPartCopy",
"cos:CompleteMultipartUpload",
"cos:AbortMultipartUpload",
"cos:ListMultipartUploads"
],
"resource": "*"
}
]
}

예시4: 특정 IP 범위에 대한 서브 계정 읽기/쓰기 권한 부여

다음 예시는 192.168.1.0/24192.168.2.0/24 주소 범위에 대해서만 읽기/쓰기 권한을 부여합니다.\n더 많은 조건을 입력하려면 조건을 참고하십시오.
{
"version": "2.0",
"statement": [
{
"action":[
"cos:*"
],
"resource": "*",
"effect": "allow",
"condition":{
"ip_equal":{
"qcs:ip": ["192.168.1.0/24", "192.168.2.0/24"]
}
}
}
]
}

","recentReleaseTime":"2025-11-18 16:41:55","slate":"[{\"children\":[{\"text\":\"개요\"}],\"id\":\"kYet6an7v8miuVb7OCCS8\",\"nodeId\":\".EA.B0.9C.EC.9A.94\",\"type\":\"h2\"},{\"children\":[{\"text\":\"CAM(Cloud Access Management)을 통해 COS(Cloud Object Storage) 버킷 또는 객체에 대해 서로 다른 작업 권한을 설정할 수 있으므로 서로 다른 회사 또는 부서의 서로 다른 팀 또는 사용자가 서로 더 잘 협업할 수 있습니다.\"}],\"id\":\"WAdj_ZfE6OQpM_5fQyJu_\",\"type\":\"p\"},{\"children\":[{\"text\":\"먼저 루트 계정, 서브 계정(사용자), 사용자 그룹 등 몇 가지 핵심 개념을 이해하고 있어야 합니다. CAM과 관련된 용어 및 설정에 대한 자세한 설명은 CAM \"},{\"children\":[{\"text\":\"Glossary\"}],\"id\":\"w5bfTFYSgEL0b4b3V79Si\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/598/18564\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/598/18564\"},\"type\":\"ref\"},{\"text\":\"를 참조하십시오.\"}],\"id\":\"EoEanFUArB83PiroF5zQ1\",\"type\":\"p\"},{\"children\":[{\"text\":\"루트 계정\"}],\"id\":\"9BZrgTkpvS-xB-35qt2W4\",\"nodeId\":\".EB.A3.A8.ED.8A.B8-.EA.B3.84.EC.A0.95\",\"type\":\"h4\"},{\"children\":[{\"text\":\"루트 계정은 개발사라고도 합니다. 사용자가 Tencent Cloud 계정을 신청하면 시스템은 Tencent Cloud 서비스에 로그인할 루트 계정 정보를 생성합니다. 루트 계정은 Tencent Cloud 리소스의 사용 용량 계산 및 과금의 기본 주체입니다.\"}],\"id\":\"D_Wsfonb1Kmd-Wq3XB8ji\",\"type\":\"p\"},{\"children\":[{\"text\":\"루트 계정은 기본적으로 해당 계정의 모든 리소스에 대해 청구서 정보 확인, 사용자 비밀번호 변경, 사용자 및 사용자 그룹 생성, 기타 클라우드 서비스 리소스 액세스 등을 포함한 완전한 액세스 권한을 보유하고 있습니다. 기본 설정 시 리소스는 루트 계정만 액세스할 수 있으며 다른 사용자는 루트 계정에서 권한을 부여해야만 액세스할 수 있습니다.\"}],\"id\":\"88jAqPI-JXFJ0TBPEBIlG\",\"type\":\"p\"},{\"children\":[{\"text\":\"서브 계정(사용자) 및 사용자 그룹\"}],\"id\":\"cXPOUaQscfE0M0A30oB5c\",\"nodeId\":\".EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95(.EC.82.AC.EC.9A.A9.EC.9E.90)-.EB.B0.8F-.EC.82.AC.EC.9A.A9.EC.9E.90-.EA.B7.B8.EB.A3.B9\",\"type\":\"h4\"},{\"children\":[{\"text\":\"서브 계정은 루트 계정에서 생성하는 엔터티로, 확실한 ID 및 자격 증명을 가지고 있으며 Tencent Cloud 콘솔에 로그인할 수 있는 권한을 가지고 있습니다.\"}],\"id\":\"tujRBfPeqgmVv-_W_tTZk\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"서브 계정은 기본적으로 리소스를 보유하고 있지 않으며, 반드시 소속된 루트 계정에서 권한을 부여해야 합니다.\"}],\"id\":\"7XLYLBZETqCgL_e8lHshO\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"하나의 루트 계정은 여러 개의 서브 계정(사용자)을 생성할 수 있습니다.\"}],\"id\":\"Q9QWRhQoVApKvu6kjy-Aa\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"하나의 서브 계정은 여러 개의 루트 계정에 소속될 수 있으며, 각각의 루트 계정과 협업하여 루트 계정별 클라우드 리소스를 관리할 수 있습니다. 단, 하나의 서브 계정이 동시에 여러 루트 계정에 로그인할 수는 없으며, 하나의 루트 계정 소속으로 로그인하여 해당 루트 계정의 클라우드 리소스만 관리할 수 있습니다.\"}],\"id\":\"B68_19cSKMpl9WaiEXFDS\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"서브 계정은 콘솔을 통해 개발사(루트 계정)를 전환할 수 있으며, 하나의 루트 계정에서 다른 루트 계정으로 전환할 수 있습니다.\"}],\"id\":\"DKOCLPen-6bsHeoJCJjRF\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"서브 계정은 콘솔에 로그인할 때 자동으로 기본 루트 계정으로 전환되며, 기본 루트 계정에서 부여한 액세스 권한을 가집니다.\"}],\"id\":\"Odch8mIzEkFdcKNN818YG\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"개발사를 전환하면 서브 계정은 전환된 루트 계정이 부여한 액세스 권한을 가지며, 전환 전의 루트 계정이 부여한 액세스 권한은 즉시 효력이 사라집니다.\"}],\"id\":\"53VJJMgyzw1Uvrgm2B2mY\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"사용자 그룹은 동일한 직무의 여러 사용자(서브 계정)가 모인 집합체입니다. 업무 필요에 따라 서로 다른 사용자 그룹을 생성할 수 있으며, 사용자 그룹에 적합한 정책을 연결하여 각 권한을 할당할 수 있습니다.\"}],\"id\":\"KJFkFPU_qYGxprBXrxlD7\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"작업 단계\"}],\"id\":\"zw014pp28kQkkBNa69Flp\",\"nodeId\":\".EC.9E.91.EC.97.85-.EB.8B.A8.EA.B3.84\",\"type\":\"h2\"},{\"children\":[{\"text\":\"서브 계정에 COS 액세스 권한을 부여하는 순서는 서브 계정 생성, 서브 계정에 권한 부여, 서브 계정으로 COS 리소스에 액세스, 해당 세 단계로 나뉩니다.\"}],\"id\":\"tINsOlUyGVvnsgALIX8ON\",\"type\":\"p\"},{\"children\":[{\"text\":\"1단계: 서브 계정 생성\"}],\"id\":\"O2DPcB7X6aPsOeMgXy_Tt\",\"nodeId\":\"1.EB.8B.A8.EA.B3.84.3A-.EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95-.EC.83.9D.EC.84.B1\",\"type\":\"h3\"},{\"children\":[{\"text\":\"CAM 콘솔에서 서브 계정을 생성하고 액세스 권한을 설정할 수 있습니다. 자세한 작업 방법은 다음과 같습니다.\"}],\"id\":\"rDPM9Kjsq4mLYR6AHpEKC\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"CAM 콘솔\"}],\"id\":\"W1j85TjO3-J_l2yUHljCD\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cam\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam\"},\"type\":\"ref\"},{\"text\":\"에 로그인합니다.\"}],\"id\":\"rLP_tVkK1j5Q15lxmYMZv\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"사용자 \\u003e 사용자 목록 \\u003e 사용자 생성\"},{\"text\":\"을 선택하여 사용자 생성 페이지로 이동합니다.\"}],\"id\":\"LD30u-J_zWsFuGKGS92mC\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"사용자 정의 생성\"},{\"text\":\"을 선택하고 \"},{\"b\":1,\"text\":\"리소스 액세스 및 메시지 수신\"},{\"text\":\"을 설정한 후 \"},{\"b\":1,\"text\":\"다음\"},{\"text\":\"을 클릭합니다.\"}],\"id\":\"7aVuqz9mYKiyP6xr8fuxQ\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"필요에 따라 사용자 관련 정보를 입력합니다.\"}],\"id\":\"_TE8zHCm5J_Ezwpt8O7kE\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"사용자 정보\"},{\"text\":\": 서브 계정의 사용자 이름 및 이메일 주소를 설정합니다. 이메일 주소는 서브 계정을 WeChat 계정과 연결하기 위해 Tencent Cloud에서 보낸 이메일을 수신하는 데 필요합니다.\"}],\"id\":\"Qam2IZt4L5-EqOEYEXugr\",\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"액세스 방식\"},{\"text\":\": 프로그래밍 액세스 및 Tencent Cloud 콘솔 액세스를 선택하고, 다른 설정은 필요에 따라 선택합니다.\"}],\"id\":\"_XBceNe6Gd6cHoIKmIuoi\",\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"사용자 정보를 모두 작성한 후, \"},{\"b\":1,\"text\":\"다음 단계\"},{\"text\":\"를 클릭하여 자격을 인증합니다.\"}],\"id\":\"Mo-v_lcZz1KnCqbgr8IVD\",\"indent\":0,\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"서브 계정에 권한을 부여합니다. 제공된 정책 옵션으로 서브 계정에 COS 버킷 목록에 대한 액세스 권한 또는 읽기 전용 권한을 부여하는 것과 같은 간단한 정책을 구성할 수 있습니다. 보다 복잡한 정책을 설정하려면 \"},{\"children\":[{\"text\":\"2단계: 서브 계정에 권한 부여\"}],\"id\":\"4-NTbS7YsMXBg8gAQZntY\",\"props\":{\"type\":\"link\",\"url\":\"#step2\"},\"type\":\"ref\"},{\"text\":\"를 진행하십시오.\"}],\"id\":\"1wR5hC1uyKxI6NPOzkx0l\",\"indent\":0,\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"사용자 태그를 선택적으로 설정하고 \"},{\"b\":1,\"text\":\"다음 단계\"},{\"text\":\"을 클릭합니다.\"}],\"id\":\"ATNcXi2bP18gfGiYJcF9d\",\"indent\":0,\"start\":false,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"완료\"},{\"text\":\"를 클릭하면 서브 계정이 생성됩니다.\"}],\"id\":\"yb3JcIeEg56ehRB0EI5yx\",\"indent\":0,\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"2단계: 서브 계정에 권한 부여\"}],\"id\":\"NgGkjzM_dvTsuw73ao3b2\",\"nodeId\":\"step2\",\"type\":\"h3\"},{\"children\":[{\"text\":\"사용자 지정 정책을 생성하거나 기존 정책을 선택하고 서브 계정과 연결합니다.\"}],\"id\":\"95_g5mc2ZtEDTvBimCrpY\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"CAM 콘솔\"}],\"id\":\"m76cr37tkNgk24oRDYvF4\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cam\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam\"},\"type\":\"ref\"},{\"text\":\"에 로그인합니다.\"}],\"id\":\"laFkKZhqvL-TOj3r82j0f\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"정책 \\u003e 사용자 정의 정책 생성 \\u003e 정책 구문 생성\"},{\"text\":\"을 선택하여 정책 생성 페이지로 이동합니다.\"}],\"id\":\"M3CEyg8MQpXXz6K6xKlLp\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"실제 필요에 따라 \"},{\"b\":1,\"text\":\"빈 템플릿\"},{\"text\":\"을 선택하여 권한 부여 정책을 사용자 정의하거나 COS와 연결할 \"},{\"b\":1,\"text\":\"시스템 템플릿\"},{\"text\":\"을 선택하고 \"},{\"b\":1,\"text\":\"다음\"},{\"text\":\"을 클릭합니다.\"}],\"id\":\"z_GFydGg6xVCeG5YLWsUR\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"기억하기 쉬운 정책 이름을 입력합니다. \"},{\"b\":1,\"text\":\"빈 템플릿\"},{\"text\":\"을 선택한 경우 정책 구문을 입력해야 합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"정책 예시\"}],\"id\":\"1pbXYLClz4nx2yktWbcwm\",\"linkTarget\":\"self\",\"props\":{\"anchor\":\".EC.A0.95.EC.B1.85-.EC.98.88.EC.8B.9C\",\"id\":\"131519815050022912\",\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/11714#.EC.A0.95.EC.B1.85-.EC.98.88.EC.8B.9C\"},\"type\":\"ref\"},{\"text\":\" 를 참고하십시오. 정책 내용을 복사하여 \"},{\"b\":1,\"text\":\"정책 내용\"},{\"text\":\" 상자에 붙여넣고 입력한 정보가 정확한지 확인한 후 \"},{\"b\":1,\"text\":\"완료\"},{\"text\":\"를 클릭합니다.\"}],\"id\":\"gQ9sDzBMMsaIavmfoLT-P\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"생성 완료 후, 방금 생성한 정책을 서브 계정에 연결합니다.\"}],\"id\":\"0gvZgVWtsHInxkZYSsZb1\",\"start\":false,\"type\":\"oli\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"z_ijFyUvUtlDEanLzOCEp\",\"indent\":1,\"inline\":false,\"naturalSize\":[1300,101],\"size\":[507,39],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/f5b8faee4d9d11f0ada05254007c27c5.png\"},{\"children\":[{\"text\":\"서브 계정을 선택하고 \"},{\"b\":1,\"text\":\"확인\"},{\"text\":\"을 클릭해 권한을 부여하면, 서브 계정을 이용해 한정된 COS 리소스에 액세스할 수 있습니다.\"}],\"id\":\"ldmA_syCN_bH7IjbNB_j6\",\"start\":false,\"type\":\"oli\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"jb-BTy_avHp1Kl8tuG2j6\",\"indent\":1,\"inline\":false,\"naturalSize\":[874,271],\"size\":[507,157],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7f7a805a4da211f0a6ac525400bf7822.png\"},{\"children\":[{\"text\":\"3단계: 서브 계정으로 COS 리소스에 액세스\"}],\"id\":\"ltKXprJzAFem3I4nWmM9X\",\"nodeId\":\"3.EB.8B.A8.EA.B3.84.3A-.EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95.EC.9C.BC.EB.A1.9C-cos-.EB.A6.AC.EC.86.8C.EC.8A.A4.EC.97.90-.EC.95.A1.EC.84.B8.EC.8A.A4\",\"type\":\"h3\"},{\"children\":[{\"text\":\"위 1단계에서 설정한 프로그래밍 액세스 및 Tencent Cloud 콘솔 액세스 방법을 다음과 같이 소개합니다.\"}],\"id\":\"7AS2o0fclueyZTPUNgmZb\",\"type\":\"p\"},{\"children\":[{\"text\":\"(1) 프로그래밍 액세스\"}],\"id\":\"ro1CWCZZEWMDTp00DBQsh\",\"type\":\"p\"},{\"children\":[{\"text\":\"서브 계정을 사용하여 프로그램(예: API, SDK, 툴 등)으로 COS 리소스에 액세스할 때에는 루트 계정의 APPID와 서브 계정의 SecretId, SecretKey 정보가 필요합니다. CAM 콘솔에서 서브 계정의 SecretId와 SecretKey를 생성할 수 있습니다.\"}],\"id\":\"kdCxALVtH8XteY7qeu_3r\",\"type\":\"p\"},{\"children\":[{\"text\":\"루트 계정으로 \"},{\"children\":[{\"text\":\"CAM 콘솔\"}],\"id\":\"1MvZ3QBskoFe_slrq0k04\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cam/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/capi\"},\"type\":\"ref\"},{\"text\":\"에 로그인합니다.\"}],\"id\":\"PA_E1o8sKMQEAX1TEx4IZ\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"사용자 리스트\"},{\"text\":\"를 선택하여 사용자 리스트 페이지로 이동합니다.\"}],\"id\":\"cdUlcZBRKL3kcu5VvrtHz\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"서브 계정의 사용자 이름을 클릭하여 서브 계정 정보 상세 페이지로 이동합니다.\"}],\"id\":\"u8cIPdvVDHLN1eEYlnSKj\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"API Keys\"},{\"text\":\" 탭을 클릭하고 \"},{\"b\":1,\"text\":\"키 생성\"},{\"text\":\"을 클릭하여 서브 계정에 SecretId와 SecretKey를 생성합니다.\"}],\"id\":\"zNPjHxJfREvUMStjRrKYj\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"이제 서브 계정의 SecretId와 SecretKey, 루트 계정의 APPID를 사용해 COS 리소스에 액세스할 수 있습니다. \"}],\"id\":\"nLJQSqJ7QZDARW8OyQ98E\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"id\":\"U56Pvn45t0HqAHdjr5fCs\",\"type\":\"p\"},{\"children\":[{\"text\":\"서브 계정은 XML API 또는 XML API 기반의 SDK를 통해 COS 리소스에 액세스할 수 있습니다.\"}],\"id\":\"cfOTwMc6XFQRUScFJozqQ\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"mGThdcHhqSemZS-G0NPfY\",\"type\":\"hint\"},{\"children\":[{\"text\":\"XML 기반의 Java SDK를 통한 액세스 예시\"}],\"id\":\"jgtlyVcZMGwetRywSXZSW\",\"nodeId\":\"xml-.EA.B8.B0.EB.B0.98.EC.9D.98-java-sdk.EB.A5.BC-.ED.86.B5.ED.95.9C-.EC.95.A1.EC.84.B8.EC.8A.A4-.EC.98.88.EC.8B.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"XML 기반의 Java SDK 명령 라인 예시이며, 다음과 같이 매개변수를 입력해야 합니다.\"}],\"id\":\"k-lwlOYDD9p7Bz_Od7MxR\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"// 사용자 인증 정보 초기화\"}],\"id\":\"0Hm0Xr6aYh8DxSr73894g\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"COSCredentials cred = new BasicCOSCredentials(\\\"\\u003c루트 계정 APPID\\u003e\\\", \\\"\\u003c서브 계정 SecretId\\u003e\\\", \\\"\\u003c서브 계정 SecretKey\\u003e\\\");\"}],\"id\":\"4vY1MtneEqnpyk8FQY5Cl\",\"type\":\"code-line\"}],\"id\":\"sSDDNY79xFA_PqRMGZxMg\",\"language\":\"java\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"인스턴스는 다음과 같습니다.\"}],\"id\":\"Y31KBH0b2d57atIh2VtX5\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"String secretId = System.getenv(\\\"secretId\\\");//서브 계정의 SecretId. 리스크를 줄이기 위해 최소 권한 원칙을 따릅니다. 서브 계정 키를 얻는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/598/37140\"}],\"id\":\"hjx9kRJuwefiijPvZVWrK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"String secretKey = System.getenv(\\\"secretKey\\\");//서브 계정의 SecretKey. 리스크를 줄이기 위해 최소 권한 원칙을 따릅니다. 서브 계정 키를 얻는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/598/37140\"}],\"id\":\"WgSvfs8FWQmpKkCwX5Qwv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);\"}],\"id\":\"ItJ6IFzFtEFn7tRh9B9ps\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"BC3HfBBHteOr3JctuSs7I\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"// 사용자 인증 정보 초기화\"}],\"id\":\"cE9jqijbIv9Gulr7KhwKI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"COSCredentials cred = new BasicCOSCredentials(\\\"\\u003c루트 계정 APPID\\u003e\\\", secretId, secretKey);\"}],\"id\":\"ylksymbB6JHktn7N9qXeZ\",\"type\":\"code-line\"}],\"id\":\"P_svGhvTtVtp4U0VPGvsU\",\"language\":\"java\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"COSCMD TCCLI를 이용한 액세스 예시\"}],\"id\":\"ma8i5M6qia7WsM44nGNG4\",\"nodeId\":\"coscmd-tccli.EB.A5.BC-.EC.9D.B4.EC.9A.A9.ED.95.9C-.EC.95.A1.EC.84.B8.EC.8A.A4-.EC.98.88.EC.8B.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"COSCMD의 명령어 설정 예시이며, 다음과 같이 매개변수를 입력해야 합니다.\"}],\"id\":\"KSu4C2CKNmW5Win1XboEO\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"coscmd config -u \\u003c루트 계정 APPID\\u003e -a \\u003c서브 계정 SecretId\\u003e -s \\u003c서브 계정 SecretKey\\u003e -b \\u003c루트 계정 bucketname\\u003e -r \\u003c루트 계정 bucket의 소속 리전\\u003e\"}],\"id\":\"0I8vS9u999RCgmSWLyRsH\",\"type\":\"code-line\"}],\"id\":\"WstLh-YNt4Wp2k5L8sEZh\",\"language\":\"sh\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"인스턴스는 다음과 같습니다.\"}],\"id\":\"KTIHa2L5x0y3h0EW5H_MH\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"coscmd config -u 1250000000 -a ************************************ -s e8Sdeasdfas2238Vi**** -b examplebucket -r ap-beijing\"}],\"id\":\"oF0eXlb7iQ_-vnUgx0gCP\",\"type\":\"code-line\"}],\"id\":\"OAZGwIbqmRFbhpYg3pnaN\",\"language\":\"sh\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"(2) Tencent Cloud 콘솔 액세스\"}],\"id\":\"cT34rGrzImJn-cBfoAvEc\",\"type\":\"p\"},{\"children\":[{\"text\":\"서브 계정는 권한 부여 후 \"},{\"children\":[{\"text\":\"서브 계정 로그인\"}],\"id\":\"a4qiMbwsCFjjRuMseSefz\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/account/login/subAccount\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/account/login/subAccount\"},\"type\":\"ref\"},{\"text\":\" 페이지에서 루트 계정 아이디, 서브 계정 이름, 서브 계정 비밀번호를 입력하여 콘솔에 로그인할 수 있습니다. 그런 다음 \"},{\"b\":1,\"text\":\"제품\"},{\"text\":\"에서 \"},{\"b\":1,\"text\":\"Cloud Object Storage\"},{\"text\":\"를 클릭하여 루트 계정에서 스토리지 리소스에 액세스할 수 있습니다.\"}],\"id\":\"gY2T2eprfVL3GjgY3vR7P\",\"type\":\"p\"},{\"children\":[{\"text\":\"정책 예시\"}],\"id\":\"sx5pSxOcwzxOc40iH7fwC\",\"nodeId\":\".EC.A0.95.EC.B1.85-.EC.98.88.EC.8B.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"다음과 같은 일반적인 샘플 정책이 여기에서 제공됩니다. 정책을 구성할 때 아래 코드를 참고하여 \"},{\"b\":1,\"text\":\"정책 내용\"},{\"text\":\" 란에 복사 붙여넣기 하시고 필요에 따라 수정하시면 됩니다. 다른 일반적인 COS 시나리오에 대한 자세한 정책 구문은 \"},{\"children\":[{\"text\":\"액세스 정책 언어 개요\"}],\"id\":\"bfuOzSW31FIzkuUALgKHr\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/18023\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/18023\"},\"type\":\"ref\"},{\"text\":\" 또는 \"},{\"children\":[{\"text\":\"CAM 제품 문서\"}],\"id\":\"-3ov39EP88nzIi286HxA6\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/598\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/598\"},\"type\":\"ref\"},{\"text\":\"의 \"},{\"b\":1,\"text\":\"비즈니스 사용 사례\"},{\"text\":\" 부분을 참고하십시오.\"}],\"id\":\"j45pCNqwX8fMUBZ6CcrwK\",\"type\":\"p\"},{\"children\":[{\"text\":\"예시1: 서브 계정에 COS 전체 읽기 및 쓰기 권한 설정\"}],\"id\":\"8AaLfR0C8ThUdHMqy5ktG\",\"nodeId\":\".EC.98.88.EC.8B.9C1.3A-.EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95.EC.97.90-cos-.EC.A0.84.EC.B2.B4-.EC.9D.BD.EA.B8.B0-.EB.B0.8F-.EC.93.B0.EA.B8.B0-.EA.B6.8C.ED.95.9C-.EC.84.A4.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"id\":\"cTqRd45BARQsxDf3CzZcs\",\"type\":\"p\"},{\"children\":[{\"text\":\"본 정책의 권한 부여 범위가 넓습니다. 설정 시 유의하십시오.\"}],\"id\":\"Id1IQpQ6-oosvugeI7otv\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"xZLUvXOhm0KxZ7m2nd2pb\",\"type\":\"hint\"},{\"children\":[{\"text\":\"자세한 정책 설정 구문은 다음과 같습니다.\"}],\"id\":\"o7fy2RH-pqWZdymrMciW5\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"z5gGfnVVG3oiJ1ihLvDBg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"id\":\"eq-g7TwOSo8J03IiVdhyh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"id\":\"qA9O9GYEKG8SEydNtNsII\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"_Cw-Mo8fBaNXGQ_TDVzSD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"2mX9sSyPUsr3tu90w6nt3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:*\\\"\"}],\"id\":\"8riK254pr2NepJfk_1mF6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"YPRd_741sbOIy1OwbqzBc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": \\\"*\\\",\"}],\"id\":\"mIfZCCo9wfghP___gJCPE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\"\"}],\"id\":\"0sPrg3Fsg6q5VDswHpYdb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"qpMhRN3NOlUtGdcW3SlsX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"evT1LpDfZM4OKAXPfaYfa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"Aw9LTNpww6NiBZ0LoXTj3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\": \\\"monitor:*\\\",\"}],\"id\":\"_YdsOjgw0elgXX6iz0Jq3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": \\\"*\\\"\"}],\"id\":\"eOHKs-iwi2jyXs4Koju-F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"Nm4duTJxrHEHI2ELxh045\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"5bhhTFSXARp_LBPGWwaPH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"zQCyhAPjKvupqEK3tyy4L\",\"type\":\"code-line\"}],\"id\":\"PFvc9WPHD1xez87NG5di6\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"예시2: 서브 계정에 읽기 전용 권한 설정\"}],\"id\":\"Geg3ZIRErM4UIZ1HUsy8B\",\"nodeId\":\".EC.98.88.EC.8B.9C2.3A-.EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95.EC.97.90-.EC.9D.BD.EA.B8.B0-.EC.A0.84.EC.9A.A9-.EA.B6.8C.ED.95.9C-.EC.84.A4.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"text\":\"서브 계정에 읽기 전용 권한을 부여하는 자세한 정책 설정 구문은 다음과 같습니다.\"}],\"id\":\"MbH2c_aIFRvB6aMSKyKHa\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"FNqnjsMvNGg0nsk4R4iWX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"id\":\"nbjoOG1D08jBCgo-sZeIN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"id\":\"CRCDl4gCL2mY339we3XAk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"RA-2tpCTU0vPJXfAeJoU6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"rQ3Hot6XvAddhut6zYqFR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:List*\\\",\"}],\"id\":\"AojJDZQtBICWjutd03oTR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:Get*\\\",\"}],\"id\":\"QridNOETuPxczz_hKOEEd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:Head*\\\",\"}],\"id\":\"jHemnr90SoU9j_iX80-xp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:OptionsObject\\\"\"}],\"id\":\"kgV6kD3wCtrlKWBcWRBVu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"4LblNn54n5yZn5agOplhp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": \\\"*\\\",\"}],\"id\":\"gg2hFeBNk24x5SecBqsVW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\"\"}],\"id\":\"OCYGTvc3oMZ_zSpT4Dy9v\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"sOPLMJRD9BV5vwuQ_vk_t\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"ksc96gBx31CCQH4Ih3Vyt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"h0opWR-XuYJpcwhWW_Hzi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\": \\\"monitor:*\\\",\"}],\"id\":\"t_rWvpLocQrArs-c0CeBg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": \\\"*\\\"\"}],\"id\":\"0vwrp5MN6A6xn7UKKNJ6Q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"HNuap9iuWQBe2Na6tVFT8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"WdpePA5DzLrszJtvNuotB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"oPauNG09gbXiiNgskk1FB\",\"type\":\"code-line\"}],\"id\":\"D4gL2BaPECUw1JnK6sDUA\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"예시3: 서브 계정에 쓰기 전용 권한 설정(삭제 제외)\"}],\"id\":\"tGO-JGgdGPFxoItgPXuA0\",\"nodeId\":\".EC.98.88.EC.8B.9C3.3A-.EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95.EC.97.90-.EC.93.B0.EA.B8.B0-.EC.A0.84.EC.9A.A9-.EA.B6.8C.ED.95.9C-.EC.84.A4.EC.A0.95(.EC.82.AD.EC.A0.9C-.EC.A0.9C.EC.99.B8)\",\"type\":\"h3\"},{\"children\":[{\"text\":\"자세한 정책 설정 구문은 다음과 같습니다.\"}],\"id\":\"nDpaMaCkuK9rjApk1eCbV\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"4IpdZeGHTIJ06YY0gMhTM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"id\":\"AFZUApKfNc3_smvYiUz03\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"id\":\"OOBsibO92xC3Cjp1SOMJA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"49X3LRcPpwNWsxlpHubN7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"1mDgnD1681Ask47HwsSYo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"2jEOca5ju7BNnzeC_zlWg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:ListParts\\\",\"}],\"id\":\"UbBsyspbomCGtPc_GJ8y1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:PostObject\\\",\"}],\"id\":\"1NhmMKfESurftVEJaE0qE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:PutObject*\\\",\"}],\"id\":\"RJP2kMgURAw9mib7WqyMv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:InitiateMultipartUpload\\\",\"}],\"id\":\"izLiy6EUZub_SCdL78VmJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:UploadPart\\\",\"}],\"id\":\"3CNezf8ss7Ze3WdPsEDCA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:UploadPartCopy\\\",\"}],\"id\":\"hvhjmZpE_oaBg6gOpG9Rb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:CompleteMultipartUpload\\\",\"}],\"id\":\"x0H3qsStghNBsiTg_1H2S\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:AbortMultipartUpload\\\",\"}],\"id\":\"M8jIAXsT2I3CSLDKuIxB2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:ListMultipartUploads\\\"\"}],\"id\":\"tWf6pRDQVO7E5H3UQNWvW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"ufn7SCfBS7fkrWohkT2Ze\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": \\\"*\\\"\"}],\"id\":\"D5TTQFzIe1cj5u920VKjc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"LdRwYCpge5XhO-3hdfRhm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"gh0YZ9mKzTBDWb_d0vVKx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"HfKQnEVOO_jJwHdKVI0iw\",\"type\":\"code-line\"}],\"id\":\"Pyz5kzM5mGAljFXJlKYjI\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"예시4: 특정 IP 범위에 대한 서브 계정 읽기/쓰기 권한 부여\"}],\"id\":\"l1eBRxwCuGsOBQS6B_NpN\",\"nodeId\":\".EC.98.88.EC.8B.9C4.3A-.ED.8A.B9.EC.A0.95-ip-.EB.B2.94.EC.9C.84.EC.97.90-.EB.8C.80.ED.95.9C-.EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95-.EC.9D.BD.EA.B8.B0.2F.EC.93.B0.EA.B8.B0-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h3\"},{\"children\":[{\"text\":\"다음 예시는 \"},{\"code\":1,\"text\":\"192.168.1.0/24\"},{\"text\":\" 및 \"},{\"code\":1,\"text\":\"192.168.2.0/24\"},{\"text\":\" 주소 범위에 대해서만 읽기/쓰기 권한을 부여합니다.\\n더 많은 조건을 입력하려면 \"},{\"children\":[{\"text\":\"조건\"}],\"id\":\"CgU7nNzzdJRIo1aU60K_D\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/598/10608\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/598/10608\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"WlQOvW_Y72kvCN9eAArho\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"mKd8ALk0XTWsNM2TuIWaJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"id\":\"rlYiha3bUJjdIso7hjHns\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"id\":\"8mbduu1HM8XNfjF_sEz5i\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"hPuwKm1PzG5NTJil2sgh3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"WRwkJGdoRhOJcWpEvMiq4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:*\\\"\"}],\"id\":\"7VC6faOLqNSw1timC8uL_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"A9X8YFbhBYcxcTD_xd5W8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": \\\"*\\\",\"}],\"id\":\"v0UAAsU6qRL5jkogynxPd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"E3LRb9zzipWyxcoDiWlS-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"oUe9SowdjN_XuPr4n3owb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"ip_equal\\\":{\"}],\"id\":\"E-tE73Hj7QNqj1YD6ecdJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs:ip\\\": [\\\"192.168.1.0/24\\\", \\\"192.168.2.0/24\\\"]\"}],\"id\":\"mUpBVWIFycun7ABH-6Nu7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"137kKJj8xKmihqYGiD7st\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"vv8mmI5R7I-J8Ir-3jtIT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"pPXP9sPSP8TEMCsNMn87A\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"6pM20prHpdTwtAKj_w9nV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"oR95kJ3aFXIRMvWsGABJe\",\"type\":\"code-line\"}],\"id\":\"OI-ZckMNOBUFmc_OE1ZKB\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"\"}],\"id\":\"y9zFPPaYiuTqyZ6LLg3lL\",\"type\":\"p\"}]"}},"12469":{"categoryId":436,"weight":90,"type":"page","extension":"","pid":12473,"id":12469,"lang":"ko","title":"CAM 사례","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:10","recentReleaseTime":"2019-12-06 19:34:10","content":{"title":"CAM 사례","body":"

CAM 개요

Cloud Access Management(CAM)는 Tencent Cloud 리소스에 대한 액세스를 관리하는 데 도움이 되는 Tencent Cloud 인증 및 권한 부여 서비스입니다. 승인된 객체, 리소스 및 작업을 관리하고 권한을 부여할 때 액세스를 제어하는 정책을 설정할 수 있습니다.

기능

루트 계정에서 리소스에 대한 액세스 권한 부여

루트 계정의 자격 증명을 공유하지 않고도 서브 계정 및 기타 루트 계정을 비롯한 다른 사용자에게 루트 계정의 리소스에 대한 액세스 권한을 부여할 수 있습니다.

세분화된 권한 관리

사용자별로 각 리소스에 대해 각각 다른 액세스 권한을 부여할 수 있습니다. 예를 들어 일부 서브 계정에 Cloud Object Storage(COS) 버킷에 대한 읽기 액세스 권한을 부여하고, 다른 서브 계정 또는 루트 계정에는 COS 객체에 대한 쓰기 액세스 권한을 부여할 수 있습니다. 또한 상기 리소스, 액세스 권한, 사용자를 일괄적으로 관리할 수도 있습니다.

최종 일관성

CAM은 현재 정책 복사를 통한 Tencent Cloud 리전 간의 데이터 동기화를 지원합니다. CAM 정책은 적시에 수정할 수 있지만 리전 간 정책 동기화가 적용되는 데 시간이 걸릴 수 있습니다. 또한 CAM은 캐시(현재 1분 동안 유효)를 사용하여 성능을 개선하며 캐시가 만료될 때까지 정책 업데이트가 적용되지 않습니다.

응용 시나리오

기업의 서브 계정 액세스 권한 관리
기업 내의 각 직급별 직원은 해당 기업의 클라우드 리소스에 대한 최소한의 액세스 권한이 필요합니다. 예를 들어 CVM, VPC 인스턴스, CDN 인스턴스, COS 버킷 및 객체 등 방대한 클라우드 리소스를 가지고 있고 개발자, 테스트 직원, 유지보수 직원 등을 포함한 수 많은 직원이 근무하고 있는 기업이 있다고 가정합니다.\n개발자는 개발 서버의 프로젝트 관련 클라우드 리소스에 대한 읽기 및 쓰기 권한이 필요하며, 테스트 직원은 테스트 서버의 프로젝트 관련 클라우드 리소스에 대한 읽기 및 쓰기 권한이 필요하고, 유지보수 직원은 서버의 구매 및 일상 유지보수를 책임져야 합니다. 직원의 직무나 프로젝트가 변경된 경우 해당 권한을 종료해야 합니다.
기업 간의 액세스 권한 관리
기업 간에 클라우드 리소스를 공유해야 하는 경우가 있습니다. 예를 들어 클라우드 리소스가 많은 회사는 제품 R&D에 집중하고 클라우드 리소스 운영을 다른 회사에 아웃소싱하려고 하며, 또한 아웃소싱 서비스 계약이 종료되는 즉시 부여된 모든 권한을 취소해야 합니다.

정책 구문

CAM 정책(policy)은 여러 요소로 구성되며 권한 부여에 대한 특정 정보를 설명하는 데 사용됩니다. 핵심 요소는 주체(principal), 작업(action), 리소스(resource), 조건(condition), 효과(effect)가 있으며, 자세한 내용은 액세스 정책 언어 개요를 참고하십시오.
설명:
정책 구문의 설명에는 특별한 순서가 없으며, 행동(action) 요소는 영어 대소문자를 구분합니다.
특정 조건이 필요하지 않은 경우 condition 요소는 옵션 항목입니다.
콘솔에서는 principal 요소는 정의할 수 없으며, 정책 관리 API 또는 정책 구문 관련 매개변수에서를 통해서만 principal을 정의할 수 있습니다.

핵심 요소

핵심 요소
설명
필수 입력 여부
버전 version
정책 구문 버전을 지정합니다. 유효 값: 2.0
주체 principal
사용자(개발자, 서브 계정, 익명의 사용자) 및 사용자 그룹이 포함하여 정책에 의해 권한이 부여되는 엔터티를 설명합니다.
정책 관리 API 및 정책 구문 관련 매개변수에서만 해당 요소를 사용할 수 있습니다.
명령 statement
action, resource, condition, effect 등 다른 요소에 의해 정의된 권한 또는 권한 집합에 대한 세부 정보를 설명합니다. 하나의 정책에는 하나의 statement만 있습니다.
작업 action
허용 또는 거부할 작업을 설명합니다. API 작업 또는 API 작업 집합일 수 있습니다. 작업(action) 요소는 영어 대소문자를 구분합니다. 예: name/cos:GetService
리소스 resource
권한이 적용되는 리소스를 설명합니다. 리소스는 6세그먼트 형식으로 설명됩니다. 자세한 리소스 정의는 제품에 따라 다릅니다. 리소스를 지정하는 방법에 대한 자세한 내용은 다음 항목에 대한 설명을 작성할 해당 리소스가 있는 제품 문서를 참고하십시오.
조건 condition
정책이 적용되는 조건을 설명합니다. 조건은 연산자, 작업 키 및 작업 값으로 구성됩니다. 조건 값은 시간, IP 주소 등이 될 수 있습니다. 일부 서비스에서는 조건에 추가 값을 지정할 수 있습니다.
아니오
효과 effect
명령문 결과가 allow(허용)인지 deny(명시적 거부)인지를 설명합니다.

정책 제한

제한 항목
제한 값
루트 계정의 사용자 그룹 수
300
루트 계정의 서브 계정 수
1000
루트 계정의 역할 수
1000
서브 계정을 추가할 수 있는 사용자 그룹 수
10
공동 작업자가 연결할 수 있는 루트 계정 수
10
사용자 그룹의 서브 계정 수
100
루트 계정에 대해 생성된 사용자 지정 정책 수
1500
CAM 사용자/사용자 그룹/역할에 연결된 정책 수
200
정책 구문에 허용되는 최대 문자 수
4096

정책 예시

다음은 ID가 100000000001(APPID는 1250000000)인 루트 계정 아래의 ID가 100000000011인 서브 계정에 베이징 리전의 버킷 examplebucket-bj와 광저우 리전의 버킷 examplebucket-gz의 객체 exampleobject에 대해, 액세스 IP가 10.*.*.10/24 대역인 경우 객체 업로드객체 다운로드 권한을 부여하는 정책 예시입니다.
{
"version": "2.0",
"principal":{
"qcs": ["qcs::cam::uin/100000000001:uin/100000000011"]
},
"statement": [{
"effect": "allow",
"action": ["name/cos:PutObject", "name/cos:GetObject"],
"resource": ["qcs::cos:ap-beijing:uid/1250000000:examplebucket-bj-1250000000/*",
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-gz-1250000000/exampleobject"
],
"condition":{
"ip_equal":{
"qcs:ip": "10.*.*.10/24"
}
}
}]
}

","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"CAM 개요\"}],\"nodeId\":\"cam-.EA.B0.9C.EC.9A.94\",\"type\":\"h2\",\"id\":\"Z5osE66HqLMiaeFrRs8OZ\"},{\"children\":[{\"text\":\"Cloud Access Management(CAM)는 Tencent Cloud 리소스에 대한 액세스를 관리하는 데 도움이 되는 Tencent Cloud 인증 및 권한 부여 서비스입니다. 승인된 객체, 리소스 및 작업을 관리하고 권한을 부여할 때 액세스를 제어하는 정책을 설정할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"M-FoKoN9wAdH2a3jRxExS\"},{\"children\":[{\"text\":\"기능\"}],\"nodeId\":\".EA.B8.B0.EB.8A.A5\",\"type\":\"h2\",\"id\":\"17U_uaB29_J7BwIq483aP\"},{\"children\":[{\"text\":\"루트 계정에서 리소스에 대한 액세스 권한 부여\"}],\"nodeId\":\".EB.A3.A8.ED.8A.B8-.EA.B3.84.EC.A0.95.EC.97.90.EC.84.9C-.EB.A6.AC.EC.86.8C.EC.8A.A4.EC.97.90-.EB.8C.80.ED.95.9C-.EC.95.A1.EC.84.B8.EC.8A.A4-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h4\",\"id\":\"wffmqgkGWcvrnr5D7wQUw\"},{\"children\":[{\"text\":\"루트 계정의 자격 증명을 공유하지 않고도 서브 계정 및 기타 루트 계정을 비롯한 다른 사용자에게 루트 계정의 리소스에 대한 액세스 권한을 부여할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"-dRsY1LPQIbJD7QLtHU4O\"},{\"children\":[{\"text\":\"세분화된 권한 관리\"}],\"nodeId\":\".EC.84.B8.EB.B6.84.ED.99.94.EB.90.9C-.EA.B6.8C.ED.95.9C-.EA.B4.80.EB.A6.AC\",\"type\":\"h4\",\"id\":\"U-nVzUfG139b21dFmN0ue\"},{\"children\":[{\"text\":\"사용자별로 각 리소스에 대해 각각 다른 액세스 권한을 부여할 수 있습니다. 예를 들어 일부 서브 계정에 Cloud Object Storage(COS) 버킷에 대한 읽기 액세스 권한을 부여하고, 다른 서브 계정 또는 루트 계정에는 COS 객체에 대한 쓰기 액세스 권한을 부여할 수 있습니다. 또한 상기 리소스, 액세스 권한, 사용자를 일괄적으로 관리할 수도 있습니다.\"}],\"type\":\"p\",\"id\":\"_G5MPDdkVOtdVvddzIno0\"},{\"children\":[{\"text\":\"최종 일관성\"}],\"nodeId\":\".EC.B5.9C.EC.A2.85-.EC.9D.BC.EA.B4.80.EC.84.B1\",\"type\":\"h4\",\"id\":\"e2rAy2LsO3QJ_a_ssZjX5\"},{\"children\":[{\"text\":\"CAM은 현재 정책 복사를 통한 Tencent Cloud 리전 간의 데이터 동기화를 지원합니다. CAM 정책은 적시에 수정할 수 있지만 리전 간 정책 동기화가 적용되는 데 시간이 걸릴 수 있습니다. 또한 CAM은 캐시(현재 1분 동안 유효)를 사용하여 성능을 개선하며 캐시가 만료될 때까지 정책 업데이트가 적용되지 않습니다.\"}],\"type\":\"p\",\"id\":\"ct82sdDan2rSSvDVaY-dF\"},{\"children\":[{\"text\":\"응용 시나리오\"}],\"nodeId\":\".EC.9D.91.EC.9A.A9-.EC.8B.9C.EB.82.98.EB.A6.AC.EC.98.A4\",\"type\":\"h2\",\"id\":\"7yecMGW4TmIOPPRVsgrjE\"},{\"children\":[{\"b\":1,\"text\":\"기업의 서브 계정 액세스 권한 관리\"}],\"type\":\"p\",\"id\":\"RipTGltotaFzxV99hAtV-\"},{\"children\":[{\"text\":\"기업 내의 각 직급별 직원은 해당 기업의 클라우드 리소스에 대한 최소한의 액세스 권한이 필요합니다. 예를 들어 CVM, VPC 인스턴스, CDN 인스턴스, COS 버킷 및 객체 등 방대한 클라우드 리소스를 가지고 있고 개발자, 테스트 직원, 유지보수 직원 등을 포함한 수 많은 직원이 근무하고 있는 기업이 있다고 가정합니다.\\n개발자는 개발 서버의 프로젝트 관련 클라우드 리소스에 대한 읽기 및 쓰기 권한이 필요하며, 테스트 직원은 테스트 서버의 프로젝트 관련 클라우드 리소스에 대한 읽기 및 쓰기 권한이 필요하고, 유지보수 직원은 서버의 구매 및 일상 유지보수를 책임져야 합니다. 직원의 직무나 프로젝트가 변경된 경우 해당 권한을 종료해야 합니다.\"}],\"type\":\"p\",\"id\":\"cEjuc-kSM3W7cgRY-MjsM\"},{\"children\":[{\"b\":1,\"text\":\"기업 간의 액세스 권한 관리\"}],\"type\":\"p\",\"id\":\"nbKgvlIUDo6YEBqpHh4WW\"},{\"children\":[{\"text\":\"기업 간에 클라우드 리소스를 공유해야 하는 경우가 있습니다. 예를 들어 클라우드 리소스가 많은 회사는 제품 R&D에 집중하고 클라우드 리소스 운영을 다른 회사에 아웃소싱하려고 하며, 또한 아웃소싱 서비스 계약이 종료되는 즉시 부여된 모든 권한을 취소해야 합니다.\"}],\"type\":\"p\",\"id\":\"9LwDuSKHWevlM8PT4D0hJ\"},{\"children\":[{\"text\":\"정책 구문\"}],\"nodeId\":\".EC.A0.95.EC.B1.85-.EA.B5.AC.EB.AC.B8\",\"type\":\"h2\",\"id\":\"iMdebW547K6s_OCRBNSMm\"},{\"children\":[{\"text\":\"CAM 정책(policy)은 여러 요소로 구성되며 권한 부여에 대한 특정 정보를 설명하는 데 사용됩니다. 핵심 요소는 주체(principal), 작업(action), 리소스(resource), 조건(condition), 효과(effect)가 있으며, 자세한 내용은 \"},{\"children\":[{\"text\":\"액세스 정책 언어 개요\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/18023\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/18023\"},\"type\":\"ref\",\"id\":\"sO8rGLwEGaU_qUi1rjAC8\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"GG2gYTUgllaYQ3bu0yqgT\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"rxaPpRQrkoxHCYeHUbV38\"},{\"children\":[{\"text\":\"정책 구문의 설명에는 특별한 순서가 없으며, 행동(action) 요소는 영어 대소문자를 구분합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"gktzDUJIQQfj8-qT_bxHq\"},{\"children\":[{\"text\":\"특정 조건이 필요하지 않은 경우 condition 요소는 옵션 항목입니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"2JCFW9LzLpCvMXy-gh33m\"},{\"children\":[{\"text\":\"콘솔에서는 principal 요소는 정의할 수 없으며, 정책 관리 API 또는 정책 구문 관련 매개변수에서를 통해서만 principal을 정의할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"BpxD-7AV7Jd6RBNhXPSuB\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"D2gMdmXdkTPzlvZtp4yZD\"},{\"children\":[{\"text\":\"핵심 요소\"}],\"nodeId\":\".ED.95.B5.EC.8B.AC-.EC.9A.94.EC.86.8C\",\"type\":\"h4\",\"id\":\"IZFG8dklMZICuN4zwz5Ck\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"핵심 요소\"}],\"type\":\"p\",\"id\":\"HoqX_TmopPna1ZlCtY4Ij\"}],\"type\":\"cell\",\"id\":\"uuHft7HFNN9IF-_FBuB2Y\"},{\"children\":[{\"children\":[{\"text\":\"설명\"}],\"type\":\"p\",\"id\":\"vMXwUXlnMIC9bbHHqid21\"}],\"type\":\"cell\",\"id\":\"cIqtPRjESouNA6R0z7xUO\"},{\"children\":[{\"children\":[{\"text\":\"필수 입력 여부\"}],\"type\":\"p\",\"id\":\"L19LK1rsifZEUHzCB_XQd\"}],\"type\":\"cell\",\"id\":\"IX8nsmOb8QQ-7g8qXJIP2\"}],\"type\":\"row\",\"id\":\"U6f8V-odIK5hbWBVs-H4h\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"버전 version\"}],\"type\":\"p\",\"id\":\"smuUEfxE28VBcC2-E5_gB\"}],\"type\":\"p\",\"id\":\"s7ZBjT8MqXJoji7kyfBf2\"}],\"type\":\"cell\",\"id\":\"NvFTYr2ItET8HafqhzX7X\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"정책 구문 버전을 지정합니다. 유효 값: 2.0\"}],\"type\":\"p\",\"id\":\"ouizCuWs_t2NoKwnLD-YF\"}],\"type\":\"p\",\"id\":\"DKXVrkF-0NAWJmTwZy3FT\"}],\"type\":\"cell\",\"id\":\"w3O_npkDt6rzeB718Y3xq\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"예\"}],\"type\":\"p\",\"id\":\"8nUPcAHHRcS0KVTFaAwz2\"}],\"type\":\"p\",\"id\":\"AZwAkk44a3WboY7ZvcqHJ\"}],\"type\":\"cell\",\"id\":\"JVB9XmNlvpJtWdKh1IhXY\"}],\"type\":\"row\",\"id\":\"b_RXeo1C728lDl4hI0KrJ\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"주체 principal\"}],\"type\":\"p\",\"id\":\"ZFt8Sns9uqhkuTJUwIY78\"}],\"type\":\"p\",\"id\":\"pAdpxdWCCxeFd0zlhhfwJ\"}],\"type\":\"cell\",\"id\":\"so19yp2GMP7yKZpr_QzYs\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"사용자(개발자, 서브 계정, 익명의 사용자) 및 사용자 그룹이 포함하여 정책에 의해 권한이 부여되는 엔터티를 설명합니다.\"}],\"type\":\"p\",\"id\":\"G5Bmx0DffLzBwTT9XCado\"}],\"type\":\"p\",\"id\":\"CDqkuoBJUQha4Lm01Q7tr\"}],\"type\":\"cell\",\"id\":\"0Bz56gR_oX7FkW7ND3hDg\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"정책 관리 API 및 정책 구문 관련 매개변수에서만 해당 요소를 사용할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"Rt8gl2IZ22VaSpAmj8zvB\"}],\"type\":\"p\",\"id\":\"_4DDl4wZ_Ztqp9KAzDerX\"}],\"type\":\"cell\",\"id\":\"gsi1TdQjvagRyeMXRJREs\"}],\"type\":\"row\",\"id\":\"JiMtK7XiOu18KNnlBSN6Z\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"명령 statement\"}],\"type\":\"p\",\"id\":\"gXzE2P4Y3M3q49JegAJex\"}],\"type\":\"p\",\"id\":\"qyVcy8D_GUB7A0kQl1RVo\"}],\"type\":\"cell\",\"id\":\"SdtRWWfcu4GRFHGJeudFb\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"action, resource, condition, effect 등 다른 요소에 의해 정의된 권한 또는 권한 집합에 대한 세부 정보를 설명합니다. 하나의 정책에는 하나의 statement만 있습니다.\"}],\"type\":\"p\",\"id\":\"xFDo7Tdg00_ra4AXLjJVC\"}],\"type\":\"p\",\"id\":\"kb2oyA2FTdTBnf_xXK5PP\"}],\"type\":\"cell\",\"id\":\"_NBuswRk_2HG_PekC7jUL\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"예\"}],\"type\":\"p\",\"id\":\"TahBqUiKNxAHdlPxlUm6T\"}],\"type\":\"p\",\"id\":\"UcujUL5IESk5--BQTEtBy\"}],\"type\":\"cell\",\"id\":\"I9j1BcRPJwWzazsRuNF-r\"}],\"type\":\"row\",\"id\":\"l9abhNR6TSQDgeCERovBf\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"작업 action\"}],\"type\":\"p\",\"id\":\"NbASWHqjAzZQiyvoWwF0T\"}],\"type\":\"p\",\"id\":\"dYmw15QhdKODZCSh9eDSb\"}],\"type\":\"cell\",\"id\":\"1SSHfvRhhn7qvU4r_rANx\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"허용 또는 거부할 작업을 설명합니다. API 작업 또는 API 작업 집합일 수 있습니다. 작업(action) 요소는 영어 대소문자를 구분합니다. 예: \"},{\"code\":1,\"text\":\"name/cos:GetService\"}],\"type\":\"p\",\"id\":\"JSzQa1ZgetJNp7xIwVPpC\"}],\"type\":\"p\",\"id\":\"qTOy_tq3r5rJCPEyu2dI8\"}],\"type\":\"cell\",\"id\":\"_BXh0I9fD0yD_2Q5tJS82\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"예\"}],\"type\":\"p\",\"id\":\"OrotHmfiE6jOU3dg7bz6Y\"}],\"type\":\"p\",\"id\":\"9ppbcIK0SWcakL45Z8zYA\"}],\"type\":\"cell\",\"id\":\"L7aRjIW6Q4Rp9Z91nlP2T\"}],\"type\":\"row\",\"id\":\"W0WeSzWF2or8Lg1VpBOrY\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"리소스 resource\"}],\"type\":\"p\",\"id\":\"eLdnG8tmkpm0iN4smRmr6\"}],\"type\":\"p\",\"id\":\"18yreIs3NwRYi8SQAuQtu\"}],\"type\":\"cell\",\"id\":\"wAZGMrpFO10sX7rcNUPK7\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"권한이 적용되는 리소스를 설명합니다. 리소스는 6세그먼트 형식으로 설명됩니다. 자세한 리소스 정의는 제품에 따라 다릅니다. 리소스를 지정하는 방법에 대한 자세한 내용은 다음 항목에 대한 설명을 작성할 해당 리소스가 있는 제품 문서를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"FzMAkB6kiRKMPzW5Oovsh\"}],\"type\":\"p\",\"id\":\"H_P2rlwCak6DjwmuK0Q6K\"}],\"type\":\"cell\",\"id\":\"lEGEpMiFt8r5gEs51U8jG\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"예\"}],\"type\":\"p\",\"id\":\"1CA1XxJTUGdYVNP8qvdWv\"}],\"type\":\"p\",\"id\":\"XLR6cpZMyf_tgWAsLFuZE\"}],\"type\":\"cell\",\"id\":\"HJKQWslWn4RkVpKgkgtj6\"}],\"type\":\"row\",\"id\":\"3mdvk7vgXVoDkpNEDI1ZL\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"조건 condition\"}],\"type\":\"p\",\"id\":\"sYWwwhkrlexeae0330tfE\"}],\"type\":\"p\",\"id\":\"FHYdcSUTaVtgJ8lupmTJG\"}],\"type\":\"cell\",\"id\":\"FbsnWNQqwtLRwUqf2JveQ\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"정책이 적용되는 조건을 설명합니다. 조건은 연산자, 작업 키 및 작업 값으로 구성됩니다. 조건 값은 시간, IP 주소 등이 될 수 있습니다. 일부 서비스에서는 조건에 추가 값을 지정할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"xzoVzFNXiwa1-Me9yS8At\"}],\"type\":\"p\",\"id\":\"-WroJsHLWdYJtXSusYhEN\"}],\"type\":\"cell\",\"id\":\"Qje17THggvqRmEHQHEp8M\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"아니오\"}],\"type\":\"p\",\"id\":\"-VPvVndd2nDCosgTr-ci8\"}],\"type\":\"p\",\"id\":\"BODgb7YuofjkFghbPdVzy\"}],\"type\":\"cell\",\"id\":\"7NGny7nb7HfRMLR3Bz-Ma\"}],\"type\":\"row\",\"id\":\"fGxRrJ9mutT6AtHJMYy1m\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"효과 effect\"}],\"type\":\"p\",\"id\":\"YYxBsm6no-pe7jXQ1kujU\"}],\"type\":\"p\",\"id\":\"10iNmXCXQNk8zHxzGeFzz\"}],\"type\":\"cell\",\"id\":\"1sk8851a7AAK_JuS448XB\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"명령문 결과가 allow(허용)인지 deny(명시적 거부)인지를 설명합니다.\"}],\"type\":\"p\",\"id\":\"nET6GDZ5pnNyMHDWBGIJD\"}],\"type\":\"p\",\"id\":\"G3DhIEHrByw9ws0zGMOwO\"}],\"type\":\"cell\",\"id\":\"mZ3_sYDNtl9EFk1E7p3sn\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"예\"}],\"type\":\"p\",\"id\":\"iELxRYHqkeGRAn-Ya0f_y\"}],\"type\":\"p\",\"id\":\"PPgI1FnUY4n1OiFCB_cT_\"}],\"type\":\"cell\",\"id\":\"B2kinq-HNk5P28BSrx3tb\"}],\"type\":\"row\",\"id\":\"Wglpi8F9l1rYRP5CsPF-f\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\",\"id\":\"0oDb1qDVdflk6gpatXUsa\",\"widths\":[16,59,25],\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"정책 제한\"}],\"nodeId\":\".EC.A0.95.EC.B1.85-.EC.A0.9C.ED.95.9C\",\"type\":\"h4\",\"id\":\"OCQAV6gSZeVh6xtkeukIy\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"제한 항목\"}],\"type\":\"p\",\"id\":\"4P_2haAyOyQfgtGZ2pVyi\"}],\"type\":\"cell\",\"id\":\"t0CulftG8modMe-oqSflS\"},{\"children\":[{\"children\":[{\"text\":\"제한 값\"}],\"type\":\"p\",\"id\":\"J6ezSCojIdhCrhVTahVa2\"}],\"type\":\"cell\",\"id\":\"EX1BWiiRhyTjiRoKCt0x7\"}],\"type\":\"row\",\"id\":\"U4DJS9nM0BQUhHp60pwMc\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"루트 계정의 사용자 그룹 수\"}],\"type\":\"p\",\"id\":\"kRFO9auVvkKJogvZNJDC9\"}],\"type\":\"p\",\"id\":\"jBDeujUhhRH18149CvmLA\"}],\"type\":\"cell\",\"id\":\"epg8OsOhD_NORjF6kWXBa\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"300\"}],\"type\":\"p\",\"id\":\"fK_ZBztRXL0zcrbeJ4ew8\"}],\"type\":\"p\",\"id\":\"-qH5zo7Y-y03RkduVPUOr\"}],\"type\":\"cell\",\"id\":\"6T4pw8JOEQV3qnDUF21lv\"}],\"type\":\"row\",\"id\":\"ri4Cf-HJFd4931z1EJS95\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"루트 계정의 서브 계정 수\"}],\"type\":\"p\",\"id\":\"xa-1sLBFeuMmM2Ad2TxEi\"}],\"type\":\"p\",\"id\":\"RBHhc-54zrQshvLAqya5P\"}],\"type\":\"cell\",\"id\":\"yl_7PmKcAG6JNMoyPbKl-\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"1000\"}],\"type\":\"p\",\"id\":\"r7BuZKSfOhrXgGSPBp6H_\"}],\"type\":\"p\",\"id\":\"xkS8rGsScbQJK1__rmDvh\"}],\"type\":\"cell\",\"id\":\"Cp93qzvpbCmA31GkdLIei\"}],\"type\":\"row\",\"id\":\"Cflq1HWswRHS-HWb-P6oV\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"루트 계정의 역할 수\"}],\"type\":\"p\",\"id\":\"SPNUWe7V9tin_i4ic_NSt\"}],\"type\":\"p\",\"id\":\"WjbZaSKGHl3bzenogn8GO\"}],\"type\":\"cell\",\"id\":\"0tXAWEM8YuECAjoHcafuy\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"1000\"}],\"type\":\"p\",\"id\":\"ABoiTQaQlh9wZ84K86toA\"}],\"type\":\"p\",\"id\":\"A1zu6ELTWaE4Shj3A3w8U\"}],\"type\":\"cell\",\"id\":\"1LYI05-Z6h5URn3DTaF9j\"}],\"type\":\"row\",\"id\":\"zmUZFZ4FsvjrRBsIX1wE9\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"서브 계정을 추가할 수 있는 사용자 그룹 수\"}],\"type\":\"p\",\"id\":\"_CiX-ZuR_88ppzI5POD9m\"}],\"type\":\"p\",\"id\":\"0Rd8To2b4zgLLjFCkeZTW\"}],\"type\":\"cell\",\"id\":\"A3JzHjkx43XU57KKQM7r-\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"10\"}],\"type\":\"p\",\"id\":\"FIPGDbweFXPhTn4chG2ci\"}],\"type\":\"p\",\"id\":\"lhOoSuhb3dqhlXompw3jr\"}],\"type\":\"cell\",\"id\":\"aBXUcY83Fj5DJ3ot7O47y\"}],\"type\":\"row\",\"id\":\"u9txunAyGUar780oMeX0Q\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"공동 작업자가 연결할 수 있는 루트 계정 수\"}],\"type\":\"p\",\"id\":\"-Hg43lWQiYTGK-BLYOUYB\"}],\"type\":\"p\",\"id\":\"c0WTBAzA0I5wrWC5kd-LB\"}],\"type\":\"cell\",\"id\":\"sTXaGB0SIsAvlCGzaMvsW\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"10\"}],\"type\":\"p\",\"id\":\"kCVCpaJgkXueOTvc9CzKL\"}],\"type\":\"p\",\"id\":\"lKvdxlqsOz9OHpOGGb2N6\"}],\"type\":\"cell\",\"id\":\"FHRhqP7936_CVF9viDhIS\"}],\"type\":\"row\",\"id\":\"uLzKrt5RiM3aULA-kpJt1\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"사용자 그룹의 서브 계정 수\"}],\"type\":\"p\",\"id\":\"L9QbaeQhSlucl_4T351OZ\"}],\"type\":\"p\",\"id\":\"pOdwkAjqVQKIvYEpu3dv0\"}],\"type\":\"cell\",\"id\":\"_nuyh7duRgdVnFKJn0MWv\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"100\"}],\"type\":\"p\",\"id\":\"lu7rPDIIjlWuvEgS9LXUe\"}],\"type\":\"p\",\"id\":\"kBKjV7h-2q5S1VhiSo2mW\"}],\"type\":\"cell\",\"id\":\"o8qLnaSnqWpbKIRqKySAN\"}],\"type\":\"row\",\"id\":\"IwlqOuMyvPntGyYOtqaVn\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"루트 계정에 대해 생성된 사용자 지정 정책 수\"}],\"type\":\"p\",\"id\":\"RMl6jkjiWZfinXR7HDDOr\"}],\"type\":\"p\",\"id\":\"NxGmy8rQHPrVAOnOgzwZC\"}],\"type\":\"cell\",\"id\":\"EQp-oD2CC0CV1OBuG3yhC\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"1500\"}],\"type\":\"p\",\"id\":\"qa8EugJCBHodd7LuYMtVM\"}],\"type\":\"p\",\"id\":\"nc9w7Sgw8ndjhxf9INNnP\"}],\"type\":\"cell\",\"id\":\"ryEpdczQDE9OSH_LcaDNW\"}],\"type\":\"row\",\"id\":\"S14ccefvkzkRwMJp4YoEM\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"CAM 사용자/사용자 그룹/역할에 연결된 정책 수\"}],\"type\":\"p\",\"id\":\"kPxdrr4_-5lYJr8p5jb8K\"}],\"type\":\"p\",\"id\":\"ke7Q-HzIF6D771WjQurHc\"}],\"type\":\"cell\",\"id\":\"JWFdVS2lgUEGEM9CSIVr6\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"200\"}],\"type\":\"p\",\"id\":\"IFLmtCEgMhlMXJ2aMbBpt\"}],\"type\":\"p\",\"id\":\"hjuQANp6REy2E7Cer0c4M\"}],\"type\":\"cell\",\"id\":\"8c60LQmNp2KpDqB-44JPp\"}],\"type\":\"row\",\"id\":\"M1QeFd6lWjRUnLYFxnv8P\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"정책 구문에 허용되는 최대 문자 수\"}],\"type\":\"p\",\"id\":\"Mx9DcEiCVF-B0569vLgRa\"}],\"type\":\"p\",\"id\":\"OGTxw08-saORGVCFY5Lae\"}],\"type\":\"cell\",\"id\":\"ksDx1AE0UyRBKLmKx7HI1\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"4096\"}],\"type\":\"p\",\"id\":\"dlAAKRjFYnE1JCDhyy7hh\"}],\"type\":\"p\",\"id\":\"c8eUjAQ4lVx4Q5xDbKHGy\"}],\"type\":\"cell\",\"id\":\"2l2Az305gOPHh08ZPwoej\"}],\"type\":\"row\",\"id\":\"xgWkWyR1fSCFPd6G8bpbA\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\",\"id\":\"dJUjl4ePva7UvIouieCB2\",\"widths\":[50,50],\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"정책 예시\"}],\"nodeId\":\".EC.A0.95.EC.B1.85-.EC.98.88.EC.8B.9C\",\"type\":\"h4\",\"id\":\"1gqs9KaHHQOotKUcv0gcp\"},{\"children\":[{\"text\":\"다음은 ID가 100000000001(APPID는 1250000000)인 루트 계정 아래의 ID가 100000000011인 서브 계정에 베이징 리전의 버킷 examplebucket-bj와 광저우 리전의 버킷 examplebucket-gz의 객체 exampleobject에 대해, 액세스 IP가 \"},{\"code\":1,\"text\":\"10.*.*.10/24\"},{\"text\":\" 대역인 경우 \"},{\"b\":1,\"text\":\"객체 업로드\"},{\"text\":\" 및 \"},{\"b\":1,\"text\":\"객체 다운로드\"},{\"text\":\" 권한을 부여하는 정책 예시입니다.\"}],\"type\":\"p\",\"id\":\"P05zUsQDS8LRM0FXzfeQy\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"3YjN4ULDwjFpjTvlTUSIA\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"QG8qku8a65n79hLhbR7Nj\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"type\":\"code-line\",\"id\":\"nmIC9D0zm8HrGOg3-F5kW\"},{\"children\":[{\"text\":\" \\\"qcs\\\": [\\\"qcs::cam::uin/100000000001:uin/100000000011\\\"]\"}],\"type\":\"code-line\",\"id\":\"xeLz6R-BenZRkb4lDKDUl\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\",\"id\":\"b2LeP7_WbkOi9OMhFFceH\"},{\"children\":[{\"text\":\" \\\"statement\\\": [{\"}],\"type\":\"code-line\",\"id\":\"ifUf4mpjzEWvaATSIHo8u\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"izDfdKr9BX3DeLgRRQQbf\"},{\"children\":[{\"text\":\" \\\"action\\\": [\\\"name/cos:PutObject\\\", \\\"name/cos:GetObject\\\"],\"}],\"type\":\"code-line\",\"id\":\"nMG34nGyofw37f_WJE24Y\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-bj-1250000000/*\\\",\"}],\"type\":\"code-line\",\"id\":\"0Vd8fslvz4r5GDbeaNTur\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-gz-1250000000/exampleobject\\\"\"}],\"type\":\"code-line\",\"id\":\"JsGc-EHrP8iEnuwLDlz8m\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"k3ZI6zwG5jqLRcIooCAnn\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"type\":\"code-line\",\"id\":\"YL_e4co_H7PveJ411Ndzr\"},{\"children\":[{\"text\":\" \\\"ip_equal\\\":{\"}],\"type\":\"code-line\",\"id\":\"Vgxhs5rPqqt7PHX45W0-a\"},{\"children\":[{\"text\":\" \\\"qcs:ip\\\": \\\"10.*.*.10/24\\\"\"}],\"type\":\"code-line\",\"id\":\"U7Pq1KI50j6fayXKRhnc2\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"hmNFE2bEurPxEUV2kOGa0\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"2uY0Vc3Q1UjkZThfc_0EU\"},{\"children\":[{\"text\":\" }]\"}],\"type\":\"code-line\",\"id\":\"tx21vVRQSCC3bGM3PEU5G\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"Is5INNhY-dvVHsiWh1FvV\"}],\"language\":\"json\",\"type\":\"code-block\",\"id\":\"2LKwmGR6U63tvry2xxZdP\",\"autoWrap\":false},{\"type\":\"p\",\"children\":[{\"text\":\"\"}],\"id\":\"J9_LZo64-g5aZUmYtY6FB\"}]"}},"12470":{"categoryId":436,"weight":100,"type":"page","extension":"","pid":12473,"id":12470,"lang":"ko","title":"ACL 액세스 제어 사례","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:10","recentReleaseTime":"2019-12-06 19:34:10","content":{"title":"ACL 액세스 제어 사례","body":"

ACL 개요

액세스 제어 리스트(ACL)는 리소스의 액세스 정책 옵션으로, 버킷 및 객체의 액세스를 관리할 수 있으며 다른 루트 계정 및 서브 계정, 사용자 그룹에 기본적인 읽기, 쓰기 권한을 부여할 수 있습니다.
액세스 정책과의 차이점은 ACL은 관리 권한에 다음과 같은 제한이 존재한다는 것입니다.
Tencent Cloud 계정에만 권한 부여 가능
객체 읽기, 객체 쓰기, ACL 읽기, ACL 쓰기, 모든 권한 등 다섯 개 작업 그룹만 지원
효력 발생 조건 부여 지원하지 않음
명시적 거부 효과 지원하지 않음
ACL이 지원하는 제어 단위:
버킷(Bucket)
객체 키 접두사(Prefix)
객체(Object)

ACL의 제어 요소

버킷 또는 객체 생성 시, 해당 리소스가 소속된 루트 계정이 리소스에 대한 모든 권한을 가지며 수정 또는 삭제할 수 없습니다. ACL을 통해 다른 Tencent Cloud 계정에 액세스 권한을 부여할 수 있습니다.\n버킷의 ACL 예시는 다음과 같습니다. 여기에서 100000000001은 루트 계정, 100000000011은 루트 계정 아래의 서브 계정, 100000000002는 다른 루트 계정을 나타냅니다. ACL에는 해당 버킷의 소유자인 Owner를 식별할 수 있는 요소가 포함되어 있으며, 해당 버킷의 소유자는 버킷의 모든 권한을 가지고 있습니다. 또한 Grant 요소에서 익명 읽기 권한을 부여하며, http://cam.qcloud.com/groups/global/AllUsers의 READ 권한 형식으로 표시합니다.
<AccessControlPolicy>
<Owner>
<ID>qcs::cam::uin/100000000001:uin/100000000001</ID>
<DisplayName>qcs::cam::uin/100000000001:uin/100000000001</DisplayName>
</Owner>
<AccessControlList>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="RootAccount">
<ID>qcs::cam::uin/100000000001:uin/100000000001</ID>
<DisplayName>qcs::cam::uin/100000000001:uin/100000000001</DisplayName>
</Grantee>
<Permission>FULL_CONTROL</Permission>
</Grant>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
<URI>http://cam.qcloud.com/groups/global/AllUsers</URI>
</Grantee>
<Permission>READ</Permission>
</Grant>
</AccessControlList>
</AccessControlPolicy>

권한 부여자

루트 계정\n다른 루트 계정에 사용자 액세스 권한을 부여할 수 있으며, CAM의 위탁인(principal) 정의를 이용해 권한을 부여할 수 있습니다. 예시는 다음과 같습니다.
qcs::cam::uin/100000000002:uin/100000000002
서브 계정\n사용자의 루트 계정 아래의 서브 계정(예: 100000000011) 또는 다른 루트 계정 아래의 서브 계정에 권한을 부여할 수 있으며, CAM의 위탁인(principal) 정의를 이용해 권한을 부여할 수 있습니다. 예시는 다음과 같습니다.
qcs::cam::uin/100000000001:uin/100000000011
익명 사용자\n익명 사용자에게 액세스 권한을 부여할 수 있으며, CAM의 위탁인(principal) 정의를 이용해 권한을 부여할 수 있습니다. 예시는 다음과 같습니다.
http://cam.qcloud.com/groups/global/AllUsers

권한 작업 그룹

ACL이 지원하는 권한 작업 그룹은 다음 표와 같습니다.
작업 그룹
버킷 액세스 권한
접두사 액세스 권한
객체 액세스 권한
READ
버킷의 객체 조회 및 읽기
디렉터리 아래의 객체 조회 및 읽기
객체 읽기
WRITE
버킷의 모든 객체 생성, 덮어쓰기, 삭제
디렉터리 아래의 모든 객체 생성, 덮어쓰기, 삭제
지원하지 않음
READ_ACP
버킷의 ACL 읽기
디렉터리 아래의 ACL 읽기
객체의 ACL 읽기
WRITE_ACP
버킷의 ACL 수정
디렉터리 아래의 ACL 수정
객체의 ACL 수정
FULL_CONTROL
버킷 및 객체에 대한 모든 작업
디렉터리 아래의 객체에 대한 모든 작업
객체에 대해 실행하는 모든 작업

표준 ACL 설명

COS는 일련의 사전 설정 권한을 지원합니다. 이를 표준 ACL이라 부르며, 표준 ACL의 권한 부여에 대한 의미는 다음 표와 같습니다.
주의:
루트 계정은 항상 FULL_CONTROL 권한을 가지므로 이에 대한 설명은 다음 표에 포함되어 있지 않습니다.
표준 ACL
의미
(비어 있음)
기본 정책. 다른 사용자에게 권한이 없으며, 리소스는 상위 권한 상속
private
다른 사용자에게 권한 없음
public-read
익명의 사용자 그룹에게 READ 권한이 부여됨
public-read-write
익명의 사용자 그룹에게 READ 및 WRITE 권한이 부여됨. 버킷에 해당 권한 부여는 권장하지 않음

사용 방법

콘솔을 이용한 CAL 작업

버킷에 ACL 설정\n다음은 다른 루트 계정에 특정 버킷의 읽기 권한을 부여하는 예시입니다.\n
\"\"

객체에 ACL 설정\n다음은 다른 루트 계정에 특정 객체의 읽기 권한을 부여하는 예시입니다.\n
\"\"

주의:
서브 계정을 사용해 버킷 또는 객체에 액세스할 때 액세스 권한 없음 안내가 표시되는 경우, 먼저 루트 계정에서 서브 계정에 버킷에 정상적으로 액세스할 수 있는 권한을 부여해야 합니다. 이에 대한 자세한 작업 방법은 서브 계정으로 버킷 리스트에 액세스를 참조하십시오.

API를 이용한 ACL 작업

버킷 ACL
API
작업명
설명
버킷 ACL 설정
지정 버킷 액세스 권한 제어 리스트 설정
버킷 ACL 조회
버킷 액세스 제어 리스트 조회
객체 ACL
API
작업명
설명
객체 ACL 설정
버킷의 한 객체의 액세스 제어 리스트 설정
객체 ACL 조회
객체 액세스 제어 리스트 조회
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"ACL 개요\"}],\"nodeId\":\"acl-.EA.B0.9C.EC.9A.94\",\"type\":\"h2\"},{\"children\":[{\"text\":\"액세스 제어 리스트(ACL)는 리소스의 액세스 정책 옵션으로, 버킷 및 객체의 액세스를 관리할 수 있으며 다른 루트 계정 및 서브 계정, 사용자 그룹에 기본적인 읽기, 쓰기 권한을 부여할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"b\":1,\"text\":\"액세스 정책과의 차이점은 ACL은 관리 권한에 다음과 같은 제한이 존재한다는 것입니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"Tencent Cloud 계정에만 권한 부여 가능\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"객체 읽기, 객체 쓰기, ACL 읽기, ACL 쓰기, 모든 권한 등 다섯 개 작업 그룹만 지원\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"효력 발생 조건 부여 지원하지 않음\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"명시적 거부 효과 지원하지 않음\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"ACL이 지원하는 제어 단위:\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"버킷(Bucket)\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"객체 키 접두사(Prefix)\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"객체(Object)\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"ACL의 제어 요소\"}],\"nodeId\":\"acl.EC.9D.98-.EC.A0.9C.EC.96.B4-.EC.9A.94.EC.86.8C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"버킷 또는 객체 생성 시, 해당 리소스가 소속된 루트 계정이 리소스에 대한 모든 권한을 가지며 수정 또는 삭제할 수 없습니다. ACL을 통해 다른 Tencent Cloud 계정에 액세스 권한을 부여할 수 있습니다.\\n버킷의 ACL 예시는 다음과 같습니다. 여기에서 100000000001은 루트 계정, 100000000011은 루트 계정 아래의 서브 계정, 100000000002는 다른 루트 계정을 나타냅니다. ACL에는 해당 버킷의 소유자인 Owner를 식별할 수 있는 요소가 포함되어 있으며, 해당 버킷의 소유자는 버킷의 모든 권한을 가지고 있습니다. 또한 Grant 요소에서 익명 읽기 권한을 부여하며, \"},{\"code\":1,\"text\":\"http://cam.qcloud.com/groups/global/AllUsers\"},{\"text\":\"의 READ 권한 형식으로 표시합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"\\u003cAccessControlPolicy\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cOwner\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cID\\u003eqcs::cam::uin/100000000001:uin/100000000001\\u003c/ID\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cDisplayName\\u003eqcs::cam::uin/100000000001:uin/100000000001\\u003c/DisplayName\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003c/Owner\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cAccessControlList\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cGrant\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cGrantee xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\" xsi:type=\\\"RootAccount\\\"\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cID\\u003eqcs::cam::uin/100000000001:uin/100000000001\\u003c/ID\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cDisplayName\\u003eqcs::cam::uin/100000000001:uin/100000000001\\u003c/DisplayName\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003c/Grantee\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cPermission\\u003eFULL_CONTROL\\u003c/Permission\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003c/Grant\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cGrant\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cGrantee xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\" xsi:type=\\\"Group\\\"\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cURI\\u003ehttp://cam.qcloud.com/groups/global/AllUsers\\u003c/URI\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003c/Grantee\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cPermission\\u003eREAD\\u003c/Permission\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003c/Grant\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003c/AccessControlList\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/AccessControlPolicy\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"shell\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"권한 부여자\"}],\"nodeId\":\".EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC.EC.9E.90\",\"type\":\"h4\"},{\"children\":[{\"b\":1,\"text\":\"루트 계정\"},{\"text\":\"\\n다른 루트 계정에 사용자 액세스 권한을 부여할 수 있으며, CAM의 위탁인(principal) 정의를 이용해 권한을 부여할 수 있습니다. 예시는 다음과 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"qcs::cam::uin/100000000002:uin/100000000002\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"b\":1,\"text\":\"서브 계정\"},{\"text\":\"\\n사용자의 루트 계정 아래의 서브 계정(예: 100000000011) 또는 다른 루트 계정 아래의 서브 계정에 권한을 부여할 수 있으며, CAM의 위탁인(principal) 정의를 이용해 권한을 부여할 수 있습니다. 예시는 다음과 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"qcs::cam::uin/100000000001:uin/100000000011\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"b\":1,\"text\":\"익명 사용자\"},{\"text\":\"\\n익명 사용자에게 액세스 권한을 부여할 수 있으며, CAM의 위탁인(principal) 정의를 이용해 권한을 부여할 수 있습니다. 예시는 다음과 같습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"http://cam.qcloud.com/groups/global/AllUsers\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"권한 작업 그룹\"}],\"nodeId\":\".EA.B6.8C.ED.95.9C-.EC.9E.91.EC.97.85-.EA.B7.B8.EB.A3.B9\",\"type\":\"h4\"},{\"children\":[{\"text\":\" ACL이 지원하는 권한 작업 그룹은 다음 표와 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"작업 그룹\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"버킷 액세스 권한\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"접두사 액세스 권한\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"객체 액세스 권한\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"READ\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"버킷의 객체 조회 및 읽기\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"디렉터리 아래의 객체 조회 및 읽기\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"객체 읽기\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"WRITE\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"버킷의 모든 객체 생성, 덮어쓰기, 삭제\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"디렉터리 아래의 모든 객체 생성, 덮어쓰기, 삭제\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원하지 않음\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"READ_ACP\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"버킷의 ACL 읽기\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"디렉터리 아래의 ACL 읽기\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"객체의 ACL 읽기\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"WRITE_ACP\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"버킷의 ACL 수정\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"디렉터리 아래의 ACL 수정\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"객체의 ACL 수정\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"FULL_CONTROL\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"버킷 및 객체에 대한 모든 작업\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"디렉터리 아래의 객체에 대한 모든 작업\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"객체에 대해 실행하는 모든 작업\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\"},{\"children\":[{\"text\":\"표준 ACL 설명\"}],\"nodeId\":\".ED.91.9C.EC.A4.80-acl-.EC.84.A4.EB.AA.85\",\"type\":\"h4\"},{\"children\":[{\"text\":\"COS는 일련의 사전 설정 권한을 지원합니다. 이를 표준 ACL이라 부르며, 표준 ACL의 권한 부여에 대한 의미는 다음 표와 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"루트 계정은 항상 FULL_CONTROL 권한을 가지므로 이에 대한 설명은 다음 표에 포함되어 있지 않습니다.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"type\":\"hint\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"표준 ACL\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"의미\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"(비어 있음)\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"기본 정책. 다른 사용자에게 권한이 없으며, 리소스는 상위 권한 상속\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"private\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"다른 사용자에게 권한 없음\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"public-read\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"익명의 사용자 그룹에게 READ 권한이 부여됨\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"public-read-write\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"익명의 사용자 그룹에게 READ 및 WRITE 권한이 부여됨. 버킷에 해당 권한 부여는 권장하지 않음\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\"},{\"children\":[{\"text\":\"사용 방법\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9-.EB.B0.A9.EB.B2.95\",\"type\":\"h2\"},{\"children\":[{\"text\":\"콘솔을 이용한 CAL 작업\"}],\"nodeId\":\".EC.BD.98.EC.86.94.EC.9D.84-.EC.9D.B4.EC.9A.A9.ED.95.9C-cal-.EC.9E.91.EC.97.85\",\"type\":\"h3\"},{\"children\":[{\"b\":1,\"text\":\"버킷에 ACL 설정\"},{\"text\":\"\\n다음은 다른 루트 계정에 특정 \"},{\"b\":1,\"text\":\"버킷\"},{\"text\":\"의 읽기 권한을 부여하는 예시입니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/d7fdfdcf75abd5b34fa3fc704f134ed1.png\"}],\"type\":\"p\"},{\"children\":[{\"b\":1,\"text\":\"객체에 ACL 설정\"},{\"text\":\"\\n다음은 다른 루트 계정에 특정 \"},{\"b\":1,\"text\":\"객체\"},{\"text\":\"의 읽기 권한을 부여하는 예시입니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/436257b395fd84afe85a5448d9b3280c.png\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 서브 계정을 사용해 버킷 또는 객체에 액세스할 때 \"},{\"b\":1,\"text\":\"액세스 권한 없음\"},{\"text\":\" 안내가 표시되는 경우, 먼저 루트 계정에서 서브 계정에 버킷에 정상적으로 액세스할 수 있는 권한을 부여해야 합니다. 이에 대한 자세한 작업 방법은 \"},{\"children\":[{\"text\":\"서브 계정으로 버킷 리스트에 액세스\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/17061\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/17061\"},\"type\":\"ref\"},{\"text\":\"를 참조하십시오.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"type\":\"hint\"},{\"children\":[{\"text\":\"API를 이용한 ACL 작업\"}],\"nodeId\":\"api.EB.A5.BC-.EC.9D.B4.EC.9A.A9.ED.95.9C-acl-.EC.9E.91.EC.97.85\",\"type\":\"h3\"},{\"children\":[{\"b\":1,\"text\":\"버킷 ACL\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"API\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"작업명\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"설명\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"PUT Bucket acl\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7737\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7737\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"버킷 ACL 설정\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지정 버킷 액세스 권한 제어 리스트 설정\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"GET Bucket acl\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7733\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7733\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"버킷 ACL 조회\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"버킷 액세스 제어 리스트 조회\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\"},{\"children\":[{\"b\":1,\"text\":\"객체 ACL\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"API\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"작업명\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"설명\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"PUT Object acl\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7748\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7748\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"객체 ACL 설정\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"버킷의 한 객체의 액세스 제어 리스트 설정\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"GET Object acl\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7744\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7744\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"객체 ACL 조회\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"객체 액세스 제어 리스트 조회\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\"}]"}},"12514":{"categoryId":436,"weight":60,"type":"page","extension":"","pid":12473,"id":12514,"lang":"ko","title":"권한 설정 관련 사례","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:11","recentReleaseTime":"2019-12-06 19:34:11","content":{"title":"권한 설정 관련 사례","body":"

버킷 정책(Policy)을 이용한 권한 부여 사례

준비 과정

1. 버킷 생성\n버킷 정책(Policy)을 통해 특정 버킷에 대해서만 권한을 부여하므로, 먼저 버킷 생성이 필요합니다. 계정 차원에서 권한을 부여해야 하는 경우 본 문서의 CAM을 이용한 권한 부여 사례를 참조하십시오.
2. 권한을 부여 받을 계정의 UIN 준비\n본 문서는 타깃 버킷의 루트 계정 UIN이 100000000001이고, 해당 계정의 서브 계정이 100000000011이며, 서브 계정이 권한을 받아야만 타깃 버킷에 액세스할 수 있다고 가정합니다.
설명:
루트 계정에서 생성한 서브 계정 조회가 필요한 경우 CAM 콘솔에 로그인한 후 사용자 리스트에서 확인할 수 있습니다.
새로운 서브 계정을 생성해야 하는 경우 Creating Sub-user 문서를 확인하십시오.
3. 정책 추가 대화 상자를 엽니다.\n타깃 버킷의 권한 관리로 이동하여 Policy 권한 설정 > 그래픽 설정을 선택한 후, 정책 추가 대화 상자를 클릭한 다음 본 문서의 권한 부여 사례를 참고하여 설정을 진행합니다. 정책 추가에 대한 자세한 작업 가이드는 버킷 정책 추가 문서를 참조하십시오.
다음은 몇 가지 권한 부여 사례 예시로, 사용자의 실제 상황에 따라 참고하여 설정합니다.

권한 부여 사례

사례1: 서브 계정에 특정 디렉터리의 모든 권한 부여

설정 정보는 다음과 같습니다.
설정 항목
설정값
효과
허용
사용자
서브 계정을 선택한 후 서브 계정의 UIN을 입력하고, 해당 서브 계정은 반드시 현재 루트 계정의 서브 계정이어야 합니다(예: 100000000011)
리소스
지정된 리소스 경로 선택(예: folder/sub-folder/*
작업
모든 작업 선택

사례2: 서브 계정에 특정 디렉터리 내 모든 파일의 읽기 권한 부여

설정 정보는 다음과 같습니다.
설정 항목
설정값
효과
허용
사용자
서브 계정을 선택한 후 서브 계정의 UIN을 입력하고, 해당 서브 계정은 반드시 현재 루트 계정의 서브 계정이어야 합니다(예: 100000000011)
리소스
지정된 리소스 경로 선택(예: folder/sub-folder/*
작업
읽기 작업(객체 리스트 나열 포함)

사례3: 서브 계정에 특정 파일의 읽기 및 쓰기 권한 부여

설정 정보는 다음과 같습니다.
설정 항목
설정값
효과
허용
사용자
서브 계정을 선택한 후 서브 계정의 UIN을 입력하고, 해당 서브 계정은 반드시 현재 루트 계정의 서브 계정이어야 합니다(예: 100000000011)
리소스
지정 객체 키 선택(예: folder/sub-folder/example.jpg)
작업
모든 작업

사례4: 서브 계정에 특정 디렉터리의 모든 파일에 대한 읽기/쓰기 권한 부여 및 해당 디렉터리의 지정 파일에 대한 읽기/쓰기 금지

해당 사례의 경우 허용 정책과 금지 정책, 두 가지 정책을 추가해야 합니다.
1. 허용 정책을 추가합니다. 설정 정보는 다음과 같습니다.
설정 항목
설정값
효과
허용
사용자
서브 계정을 선택한 후 서브 계정의 UIN을 입력하고, 해당 서브 계정은 반드시 현재 루트 계정의 서브 계정이어야 합니다(예: 100000000011)
리소스
지정된 디렉터리의 접두사(예: folder/sub-folder/*)
작업
모든 작업
2. 금지 정책을 추가합니다. 설정 정보는 다음과 같습니다.
설정 항목
설정값
효력
거절
사용자
서브 계정을 선택한 후 서브 계정의 UIN을 입력하고, 해당 서브 계정은 반드시 현재 루트 계정의 서브 계정이어야 합니다(예: 100000000011)
리소스
액세스를 금지할 객체 키(예: folder/sub-folder/privateobject)
작업
모든 작업

사례5: 서브 계정에 지정 접두사 파일에 대한 읽기/쓰기 권한 부여

설정 정보는 다음과 같습니다.
설정 항목
설정값
효과
허용
사용자
서브 계정을 선택한 후 서브 계정의 UIN을 입력하고, 해당 서브 계정은 반드시 현재 루트 계정의 서브 계정이어야 합니다(예: 100000000011)
리소스
지정 접두사(예: folder/sub-folder/prefix)
작업
모든 작업

CAM을 이용한 권한 부여 사례

계정 차원에서 권한을 부여하는 경우 다음 문서를 참조하여 설정하십시오.
","recentReleaseTime":"2025-11-18 16:49:47","slate":"[{\"children\":[{\"text\":\"버킷 정책(Policy)을 이용한 권한 부여 사례\"}],\"nodeId\":\".EB.B2.84.ED.82.B7-.EC.A0.95.EC.B1.85(policy).EC.9D.84-.EC.9D.B4.EC.9A.A9.ED.95.9C-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC-.EC.82.AC.EB.A1.80\",\"type\":\"h2\",\"id\":\"zFr_xM7yW5LRS5ocz-JMR\"},{\"children\":[{\"text\":\"준비 과정\"}],\"nodeId\":\".EC.A4.80.EB.B9.84-.EA.B3.BC.EC.A0.95\",\"type\":\"h3\",\"id\":\"5jOAdvkyEqq4Jy6V7nS-8\"},{\"children\":[{\"text\":\"버킷 생성\\n버킷 정책(Policy)을 통해 특정 버킷에 대해서만 권한을 부여하므로, 먼저 \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13309\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13309\"},\"type\":\"ref\",\"id\":\"Pi1WNz9dG8cQ1mrsIu4Qh\"},{\"text\":\"이 필요합니다. 계정 차원에서 권한을 부여해야 하는 경우 본 문서의 \"},{\"children\":[{\"text\":\"CAM을 이용한 권한 부여 사례\"}],\"linkTarget\":\"self\",\"linkTitle\":\"#cam\",\"props\":{\"type\":\"link\",\"url\":\"#cam\"},\"type\":\"ref\",\"id\":\"tuI666w2bSYDo9d4-wm7p\"},{\"text\":\"를 참조하십시오.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"s7zTFgpF8EOdpArWjZGVJ\"},{\"children\":[{\"text\":\"권한을 부여 받을 계정의 UIN 준비\\n본 문서는 타깃 버킷의 루트 계정 UIN이 100000000001이고, 해당 계정의 서브 계정이 100000000011이며, 서브 계정이 권한을 받아야만 타깃 버킷에 액세스할 수 있다고 가정합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"nkTaHe7Ki7B4Kb533K1dC\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"FPBqaU3lWEuwj1qxZrJ18\"},{\"children\":[{\"text\":\"루트 계정에서 생성한 서브 계정 조회가 필요한 경우 CAM 콘솔에 로그인한 후 \"},{\"children\":[{\"text\":\"사용자 리스트\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cam\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam\"},\"type\":\"ref\",\"id\":\"eF_YAFnR1ebu2Ex-lplkT\"},{\"text\":\"에서 확인할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"6pSrPWynnQrSCAkfjUyiO\"},{\"children\":[{\"text\":\"새로운 서브 계정을 생성해야 하는 경우 \"},{\"children\":[{\"text\":\"Creating Sub-user\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/598/13674\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/598/13674\"},\"type\":\"ref\",\"id\":\"yldScuLeG0VbTLjc1o3-M\"},{\"text\":\" 문서를 확인하십시오.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"vshDp677lMIj83MsWDukd\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\",\"id\":\"9QACBMAWQ6fvl0VAlWt_s\"},{\"children\":[{\"b\":1,\"text\":\"정책 추가\"},{\"text\":\" 대화 상자를 엽니다.\\n타깃 버킷의 \"},{\"b\":1,\"text\":\"권한 관리\"},{\"text\":\"로 이동하여 \"},{\"b\":1,\"text\":\"Policy 권한 설정 > 그래픽 설정\"},{\"text\":\"을 선택한 후, \"},{\"b\":1,\"text\":\"정책 추가\"},{\"text\":\" 대화 상자를 클릭한 다음 본 문서의 권한 부여 사례를 참고하여 설정을 진행합니다. 정책 추가에 대한 자세한 작업 가이드는 \"},{\"children\":[{\"text\":\"버킷 정책 추가\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/30927\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/30927\"},\"type\":\"ref\",\"id\":\"cAdZWrHUOZI3f2Lp7lY67\"},{\"text\":\" 문서를 참조하십시오.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"G6PDVSynOThj3pssaMfQU\"},{\"children\":[{\"text\":\"다음은 몇 가지 권한 부여 사례 예시로, 사용자의 실제 상황에 따라 참고하여 설정합니다.\"}],\"type\":\"p\",\"id\":\"aamu4yLxxwf-MlpZAfvwH\"},{\"children\":[{\"text\":\"권한 부여 사례\"}],\"nodeId\":\".EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC-.EC.82.AC.EB.A1.80\",\"type\":\"h3\",\"id\":\"u5tT4_O_MU0ieGLAxY9pk\"},{\"children\":[{\"text\":\"사례1: 서브 계정에 특정 디렉터리의 모든 권한 부여\"}],\"nodeId\":\".EC.82.AC.EB.A1.801.3A-.EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95.EC.97.90-.ED.8A.B9.EC.A0.95-.EB.94.94.EB.A0.89.ED.84.B0.EB.A6.AC.EC.9D.98-.EB.AA.A8.EB.93.A0-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h4\",\"id\":\"mfZH4FMZbEoH9DbiNHwXI\"},{\"children\":[{\"text\":\"설정 정보는 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"UpChuxzUeuIhqpdcDYPNr\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설정 항목\"}],\"type\":\"p\",\"id\":\"ZBT-5S_mXzCSUGsm1-Byf\"}],\"type\":\"cell\",\"id\":\"s5Pe_M8zhlqeJzFzEyYxo\"},{\"children\":[{\"children\":[{\"text\":\"설정값\"}],\"type\":\"p\",\"id\":\"WQe7cDt8r42a3Xvkh-Jib\"}],\"type\":\"cell\",\"id\":\"-b6x7ojQKijHKknzgE_Vj\"}],\"type\":\"row\",\"id\":\"wyerIfR6ypGuu56VTjvoR\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"효과\"}],\"type\":\"p\",\"id\":\"cuI25GCD2UI39pULa_-S5\"}],\"type\":\"p\",\"id\":\"HVHxbm4YK_1-BqVLCSPxR\"}],\"type\":\"cell\",\"id\":\"ehtlO_xXMNad8nSofLYF3\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"허용\"}],\"type\":\"p\",\"id\":\"EFTVeTYrbeVRyxT9YUxmB\"}],\"type\":\"p\",\"id\":\"CNpxptF7AXTpFSYPcEqD1\"}],\"type\":\"cell\",\"id\":\"SwNSRDF1ed9RdmfsgJ9zW\"}],\"type\":\"row\",\"id\":\"WvNtEJ-Lmv6Wh9cO6g7sF\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"사용자\"}],\"type\":\"p\",\"id\":\"vkr1nEaRJm_D8fPpnLRf_\"}],\"type\":\"p\",\"id\":\"4BJ5M1kkIWtUSTQTYkqec\"}],\"type\":\"cell\",\"id\":\"Ii7brxIBWfG1gmj2W1uTg\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"서브 계정을 선택한 후 서브 계정의 UIN을 입력하고, 해당 서브 계정은 반드시 현재 루트 계정의 서브 계정이어야 합니다(예: 100000000011)\"}],\"type\":\"p\",\"id\":\"wlCFiy5yq99zBviID8eHO\"}],\"type\":\"p\",\"id\":\"itf7A0Qar_g8d8_iRixKH\"}],\"type\":\"cell\",\"id\":\"_kalV3h8C8ybFPeaDn0m4\"}],\"type\":\"row\",\"id\":\"fEVmDtdZ6m-oJrxdHNxUu\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"리소스\"}],\"type\":\"p\",\"id\":\"RtsaVqTwz2CA2ky51GgVW\"}],\"type\":\"p\",\"id\":\"QAW8b57QIBIwStbkwKK-Z\"}],\"type\":\"cell\",\"id\":\"QcV8M8gy4aX84GthqmzGL\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지정된 리소스 경로 선택(예: \"},{\"code\":1,\"text\":\"folder/sub-folder/*\"}],\"type\":\"p\",\"id\":\"DlrtZh9VdLBwBrzP4SwTl\"}],\"type\":\"p\",\"id\":\"dnVDgUmyeEsskXpKmxd2U\"}],\"type\":\"cell\",\"id\":\"1IkzzHxlUXw8tk7QDxg4k\"}],\"type\":\"row\",\"id\":\"C22i4UeZ52c000Y9UVy16\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"작업\"}],\"type\":\"p\",\"id\":\"sn4e8GmCTDoRahE9Wtzq3\"}],\"type\":\"p\",\"id\":\"W7J0CIekKBdnDt1O5xAbo\"}],\"type\":\"cell\",\"id\":\"sQKZcxPaC1hKbPkDHibyb\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"모든 작업 선택\"}],\"type\":\"p\",\"id\":\"0I2aqSS1HnHtXNz8YS_h5\"}],\"type\":\"p\",\"id\":\"Jh1Kz1SP2m3OS1ED5TAlS\"}],\"type\":\"cell\",\"id\":\"FSlEQ8wCQokk0QMUIth-4\"}],\"type\":\"row\",\"id\":\"GUe3WlhzjiQkmSNbr3U-p\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\",\"id\":\"Z0qPI2p98VfEDiqvNNBGM\",\"widths\":[14,86],\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"사례2: 서브 계정에 특정 디렉터리 내 모든 파일의 읽기 권한 부여\"}],\"nodeId\":\".EC.82.AC.EB.A1.802.3A-.EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95.EC.97.90-.ED.8A.B9.EC.A0.95-.EB.94.94.EB.A0.89.ED.84.B0.EB.A6.AC-.EB.82.B4-.EB.AA.A8.EB.93.A0-.ED.8C.8C.EC.9D.BC.EC.9D.98-.EC.9D.BD.EA.B8.B0-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h4\",\"id\":\"wpHxhmZojsTTyGHo2wFNH\"},{\"children\":[{\"text\":\"설정 정보는 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"RZ4b9tTCLDlyq71eQISrB\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설정 항목\"}],\"type\":\"p\",\"id\":\"D2AoG1z01aiV1xfKVV-Jz\"}],\"type\":\"cell\",\"id\":\"t90GDEo_hIYUg6mfIUiFN\"},{\"children\":[{\"children\":[{\"text\":\"설정값\"}],\"type\":\"p\",\"id\":\"jSHgEgPalPqAF9xYJi68D\"}],\"type\":\"cell\",\"id\":\"3lsupy9LIn83QDy4FuIc8\"}],\"type\":\"row\",\"id\":\"LnlKT3Y6_QgIyuDwEKHQe\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"효과\"}],\"type\":\"p\",\"id\":\"Uqnb8PYExa9OT6b64KwS-\"}],\"type\":\"p\",\"id\":\"jYBxNB1WnuV9KpcRMsg7J\"}],\"type\":\"cell\",\"id\":\"kalbXRhQ5UhVJIe9M1lWa\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"허용\"}],\"type\":\"p\",\"id\":\"y32tU3juQYEj5XUXKQwUu\"}],\"type\":\"p\",\"id\":\"a7wtmr_f6anM6_QrHQw7N\"}],\"type\":\"cell\",\"id\":\"GriSFX1cIaSCG6fOjXN3T\"}],\"type\":\"row\",\"id\":\"Ru2PEnUa7BSmTQzkWS1v1\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"사용자\"}],\"type\":\"p\",\"id\":\"cFDzgQ3iNDYbvm0xT_lmR\"}],\"type\":\"p\",\"id\":\"tr55U5FGTKCdNH8za3Hzv\"}],\"type\":\"cell\",\"id\":\"kpmXEIO8Rhr37Oo_HQCFb\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"서브 계정을 선택한 후 서브 계정의 UIN을 입력하고, 해당 서브 계정은 반드시 현재 루트 계정의 서브 계정이어야 합니다(예: 100000000011)\"}],\"type\":\"p\",\"id\":\"ViJGnB48IfyzB5-CJT_JH\"}],\"type\":\"p\",\"id\":\"iRX3odRFkja0Isi5kO7GP\"}],\"type\":\"cell\",\"id\":\"6uEi2rXAaWLDM0iBEPpDk\"}],\"type\":\"row\",\"id\":\"TBik_NgDo_rK_WCjKlfpN\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"리소스\"}],\"type\":\"p\",\"id\":\"W8DVhCIAcK_l-aUi1thIa\"}],\"type\":\"p\",\"id\":\"io2E4RLTADeqyPs1bh5Qn\"}],\"type\":\"cell\",\"id\":\"N2Wj8zRt3t2Q_mjMlRGsP\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지정된 리소스 경로 선택(예: \"},{\"code\":1,\"text\":\"folder/sub-folder/*\"}],\"type\":\"p\",\"id\":\"yXMlmm8zylddtgydJ2pts\"}],\"type\":\"p\",\"id\":\"VWxEXFu0midvimmndgDS0\"}],\"type\":\"cell\",\"id\":\"-p3YTDGtjusJFYQCk0Ii-\"}],\"type\":\"row\",\"id\":\"J9lpSLhUQoLJLpJLOLkkQ\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"작업\"}],\"type\":\"p\",\"id\":\"ywfkgNLCmN3S8rlmSLO0A\"}],\"type\":\"p\",\"id\":\"RC-oJW0VGzslRiaZT1-Ed\"}],\"type\":\"cell\",\"id\":\"01PbCrlhvFvXJrCEIyjE1\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"읽기 작업(객체 리스트 나열 포함)\"}],\"type\":\"p\",\"id\":\"NAWwtjzB_gwthulHuWex6\"}],\"type\":\"p\",\"id\":\"aHZVrTmdsG70FsRcYo9oi\"}],\"type\":\"cell\",\"id\":\"7xgV3Iyyf1MZcLyptmATh\"}],\"type\":\"row\",\"id\":\"seQiAHhooADujqv2GsRtl\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\",\"id\":\"9DV4csFZkW8iDICmLyrhT\",\"widths\":[17,83],\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"사례3: 서브 계정에 특정 파일의 읽기 및 쓰기 권한 부여\"}],\"nodeId\":\".EC.82.AC.EB.A1.803.3A-.EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95.EC.97.90-.ED.8A.B9.EC.A0.95-.ED.8C.8C.EC.9D.BC.EC.9D.98-.EC.9D.BD.EA.B8.B0-.EB.B0.8F-.EC.93.B0.EA.B8.B0-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h4\",\"id\":\"mkyokldiXZG30Kas3zi6X\"},{\"children\":[{\"text\":\"설정 정보는 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"pD_oNkZWiaZpYRReK2x11\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설정 항목\"}],\"type\":\"p\",\"id\":\"E72wkqKa3Nqz70nJn80pU\"}],\"type\":\"cell\",\"id\":\"Ayeu0mM6lbEklzaFhStDz\"},{\"children\":[{\"children\":[{\"text\":\"설정값\"}],\"type\":\"p\",\"id\":\"5X6fEpk1MKJUUDLhW9emq\"}],\"type\":\"cell\",\"id\":\"GzMnjfbtxc_0F7Iy3wcJi\"}],\"type\":\"row\",\"id\":\"sy_nULBo4VHMbyzno6BLS\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"효과\"}],\"type\":\"p\",\"id\":\"jYQX6iZnzH3kx1QvaXPjc\"}],\"type\":\"p\",\"id\":\"Th9s_6ZmH46uswCjFzZLN\"}],\"type\":\"cell\",\"id\":\"KigBj2e6mj8QDz3tUHZhP\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"허용\"}],\"type\":\"p\",\"id\":\"SgnBoI9uMHXmZUFK12Ds-\"}],\"type\":\"p\",\"id\":\"rfgzIVNh613wXkrMNoT6V\"}],\"type\":\"cell\",\"id\":\"bLz9NeZmPxjkwtumXbRBj\"}],\"type\":\"row\",\"id\":\"UjRcULWIQk7IStsO5FJcA\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"사용자\"}],\"type\":\"p\",\"id\":\"GkiIXLSmF_Ynt0ML4oX5e\"}],\"type\":\"p\",\"id\":\"Yns0HWtFhHcYGg4w3SbTb\"}],\"type\":\"cell\",\"id\":\"dBDo3gmLzHah2QIIHtq54\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"서브 계정을 선택한 후 서브 계정의 UIN을 입력하고, 해당 서브 계정은 반드시 현재 루트 계정의 서브 계정이어야 합니다(예: 100000000011)\"}],\"type\":\"p\",\"id\":\"I7g2_X-KcMwtB8vaFRfQ0\"}],\"type\":\"p\",\"id\":\"wfLJo9uN3k5NvUQxjRidM\"}],\"type\":\"cell\",\"id\":\"NuYoXaHcpnx710GibO-7k\"}],\"type\":\"row\",\"id\":\"h7aAxFKR5vBR9HBxcrF4o\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"리소스\"}],\"type\":\"p\",\"id\":\"9rq9hHTenNMsxkfP1FtJV\"}],\"type\":\"p\",\"id\":\"ow2R0tEGfMtdKJikiue2e\"}],\"type\":\"cell\",\"id\":\"FDY9guYTvwJWSeqD6bfYJ\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지정 객체 키 선택(예: \"},{\"code\":1,\"text\":\"folder/sub-folder/example.jpg\"},{\"text\":\")\"}],\"type\":\"p\",\"id\":\"Mp4aoPpH2wlbW9Dyp4CEr\"}],\"type\":\"p\",\"id\":\"EYmczhO9JuMN3JG4zWxWI\"}],\"type\":\"cell\",\"id\":\"Se_de0sAhXlEhw3mjoRI4\"}],\"type\":\"row\",\"id\":\"DnPXO_03ryYZcCQqPUyUJ\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"작업\"}],\"type\":\"p\",\"id\":\"pis8MPsBnnAUXHTxpRn9r\"}],\"type\":\"p\",\"id\":\"YjWFjDjzged6KNHE-VIJ-\"}],\"type\":\"cell\",\"id\":\"uBtcNO5bxiSTNxo4nL57F\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"모든 작업\"}],\"type\":\"p\",\"id\":\"V_YXzZRHDMwJ06LU2eCHc\"}],\"type\":\"p\",\"id\":\"q__41FnY1IWWH-0cyRurY\"}],\"type\":\"cell\",\"id\":\"CjpMPcQrzj9VFwkWMvmFH\"}],\"type\":\"row\",\"id\":\"oz7x17DDEEV58YQ7o1FMy\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\",\"id\":\"59Fi0yFXMYWqWW1lzIB-7\",\"widths\":[15,85],\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"사례4: 서브 계정에 특정 디렉터리의 모든 파일에 대한 읽기/쓰기 권한 부여 및 해당 디렉터리의 지정 파일에 대한 읽기/쓰기 금지\"}],\"nodeId\":\".EC.82.AC.EB.A1.804.3A-.EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95.EC.97.90-.ED.8A.B9.EC.A0.95-.EB.94.94.EB.A0.89.ED.84.B0.EB.A6.AC.EC.9D.98-.EB.AA.A8.EB.93.A0-.ED.8C.8C.EC.9D.BC.EC.97.90-.EB.8C.80.ED.95.9C-.EC.9D.BD.EA.B8.B0.2F.EC.93.B0.EA.B8.B0-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC-.EB.B0.8F-.ED.95.B4.EB.8B.B9-.EB.94.94.EB.A0.89.ED.84.B0.EB.A6.AC.EC.9D.98-.EC.A7.80.EC.A0.95-.ED.8C.8C.EC.9D.BC.EC.97.90-.EB.8C.80.ED.95.9C-.EC.9D.BD.EA.B8.B0.2F.EC.93.B0.EA.B8.B0-.EA.B8.88.EC.A7.80\",\"type\":\"h4\",\"id\":\"s083MsNUxIMMx0Q5GHMEB\"},{\"children\":[{\"text\":\"해당 사례의 경우 \"},{\"b\":1,\"text\":\"허용\"},{\"text\":\" 정책과 \"},{\"b\":1,\"text\":\"금지\"},{\"text\":\" 정책, 두 가지 정책을 추가해야 합니다.\"}],\"type\":\"p\",\"id\":\"UKQRGyRAiKFDNdEAVh_dv\"},{\"children\":[{\"b\":1,\"text\":\"허용\"},{\"text\":\" 정책을 추가합니다. 설정 정보는 다음과 같습니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"_RCsdY_53pwgvctdNjF9F\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설정 항목\"}],\"type\":\"p\",\"id\":\"ZDoK0yM2fJHP_VgNKBNWO\"}],\"type\":\"cell\",\"id\":\"4vxiaBQW3gmFS_BDWz5dn\"},{\"children\":[{\"children\":[{\"text\":\"설정값\"}],\"type\":\"p\",\"id\":\"XTsxVBWbdlRL7xVV_ABl_\"}],\"type\":\"cell\",\"id\":\"1dOUnKNxKICaYOjjVqtmQ\"}],\"type\":\"row\",\"id\":\"FYj4IGweIxPSdtTFqZO9y\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"효과\"}],\"type\":\"p\",\"id\":\"1P_GXLdyfQorXpNkzYshT\"}],\"type\":\"p\",\"id\":\"FnaQ8K59fuOBHxsGWECZd\"}],\"type\":\"cell\",\"id\":\"jLESEwC7P1Cywt9XcyEOH\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"허용\"}],\"type\":\"p\",\"id\":\"rLAdcK_b6e8k5tgtgbMbi\"}],\"type\":\"p\",\"id\":\"XjKD30NZN5-m93XslestL\"}],\"type\":\"cell\",\"id\":\"1F1rZk2W31Pm3UTdqGpNb\"}],\"type\":\"row\",\"id\":\"EB-Ov0aWP-dd2HD9wrpY0\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"사용자\"}],\"type\":\"p\",\"id\":\"WuyL2PaJAQWeciqtz4P83\"}],\"type\":\"p\",\"id\":\"HqUATM7eFmhZcClb2rlnY\"}],\"type\":\"cell\",\"id\":\"jTk4zGa2nKrSqOLriwzQk\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"서브 계정을 선택한 후 서브 계정의 UIN을 입력하고, 해당 서브 계정은 반드시 현재 루트 계정의 서브 계정이어야 합니다(예: 100000000011)\"}],\"type\":\"p\",\"id\":\"3c8nAumbLhHrzrvuV2t2H\"}],\"type\":\"p\",\"id\":\"Ofc3k9Up4X2aa4aouO9k_\"}],\"type\":\"cell\",\"id\":\"qeH1WKHKA0WEQ6b-d4gfn\"}],\"type\":\"row\",\"id\":\"-9nLagU2NIC9pu7Y2LS7v\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"리소스\"}],\"type\":\"p\",\"id\":\"urVANCDKnjhqIhjvNix5w\"}],\"type\":\"p\",\"id\":\"l37LwId1QEEwF9wmOUZ9W\"}],\"type\":\"cell\",\"id\":\"XrOvEt6lOhD6BdbjtKiua\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지정된 디렉터리의 접두사(예: \"},{\"code\":1,\"text\":\"folder/sub-folder/*\"},{\"text\":\")\"}],\"type\":\"p\",\"id\":\"P4QwNO0dzw7cyMToMPVd3\"}],\"type\":\"p\",\"id\":\"L7DYp2mOWnFfHjB7edFOD\"}],\"type\":\"cell\",\"id\":\"_ieYHPBYlQ_3QTpWcNoVw\"}],\"type\":\"row\",\"id\":\"9U9c63ODyN8uP_5wBuyLE\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"작업\"}],\"type\":\"p\",\"id\":\"MODckWW3RJn10YQrzgTz-\"}],\"type\":\"p\",\"id\":\"nP8InTxz5Mp4ABXZXv02E\"}],\"type\":\"cell\",\"id\":\"y3ud9-9J9QTl6nRDRQW0W\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"모든 작업\"}],\"type\":\"p\",\"id\":\"3bY3vPYNbMupVCFs6rgbf\"}],\"type\":\"p\",\"id\":\"mWILLRrJ62ZHaPXFNN8tu\"}],\"type\":\"cell\",\"id\":\"5dLSR35W3aDdWxnv5cqkY\"}],\"type\":\"row\",\"id\":\"ODaAs0-ydrYOTPQcusG0j\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\",\"id\":\"kjPrMB4SL81622v5hxmQX\",\"widths\":[17,83],\"widthMode\":\"percentage\"},{\"children\":[{\"b\":1,\"text\":\"금지\"},{\"text\":\" 정책을 추가합니다. 설정 정보는 다음과 같습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"KkUvs96TJESkmncqa3AUw\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설정 항목\"}],\"type\":\"p\",\"id\":\"u0QBM-fRjxPQojoAslDOa\"}],\"type\":\"cell\",\"id\":\"7DgVxxO82cTfBSCzLCU8_\"},{\"children\":[{\"children\":[{\"text\":\"설정값\"}],\"type\":\"p\",\"id\":\"nyzpqt4nYh9Ds_shdRzMr\"}],\"type\":\"cell\",\"id\":\"9h3UbzqXIdc0iiBcP-B7b\"}],\"type\":\"row\",\"id\":\"WLKwWOorYCY2BqnEVNe1Z\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"효력\"}],\"type\":\"p\",\"id\":\"qpLzKYFrqsTeKbouSmTbG\"}],\"type\":\"p\",\"id\":\"6PIBjD5w6zASKHPgFRNYp\"}],\"type\":\"cell\",\"id\":\"0CSpZTUnVBJCncMTY9poC\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"거절\"}],\"type\":\"p\",\"id\":\"fO-Joe5Mj7CQ7bPEF_Xvd\"}],\"type\":\"p\",\"id\":\"EfzN51DqSJDS_ysvAcd8S\"}],\"type\":\"cell\",\"id\":\"mtbUWuP2G3mi1Hahek2Wo\"}],\"type\":\"row\",\"id\":\"gYozcNFw33J9Xc_gYxryS\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"사용자\"}],\"type\":\"p\",\"id\":\"ITdI18HBYsfhlCitWImuA\"}],\"type\":\"p\",\"id\":\"_CdLK7lA_ln3D12-oqHeF\"}],\"type\":\"cell\",\"id\":\"b1PhMxaYAbpsGKaH-vcOX\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"서브 계정을 선택한 후 서브 계정의 UIN을 입력하고, 해당 서브 계정은 반드시 현재 루트 계정의 서브 계정이어야 합니다(예: 100000000011)\"}],\"type\":\"p\",\"id\":\"7m_klMfVBGpN-OKwOpOX7\"}],\"type\":\"p\",\"id\":\"tntR_IVr88-IXkx3LuKYY\"}],\"type\":\"cell\",\"id\":\"aw8haiiiqVlvkMGEBiDOc\"}],\"type\":\"row\",\"id\":\"GLySSy--Ki9HEpaC133H-\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"리소스\"}],\"type\":\"p\",\"id\":\"X62ZOJPutPzmDzb39QVHu\"}],\"type\":\"p\",\"id\":\"03nXq3A4wXcQJP93q91sk\"}],\"type\":\"cell\",\"id\":\"KuGiipk0OWL5ODnQs4jaV\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"액세스를 금지할 객체 키(예: \"},{\"code\":1,\"text\":\"folder/sub-folder/privateobject\"},{\"text\":\")\"}],\"type\":\"p\",\"id\":\"KVG8IQvMow-lvEWvMha2t\"}],\"type\":\"p\",\"id\":\"kVWr3Blln8PqpuPeBHaLN\"}],\"type\":\"cell\",\"id\":\"pL78zic87E23QxH0COW-X\"}],\"type\":\"row\",\"id\":\"HTFifwUnTm58P_7czqKH1\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"작업\"}],\"type\":\"p\",\"id\":\"XzCA43nOU-0CHPAYxsIOL\"}],\"type\":\"p\",\"id\":\"Tkl4vUPEiWwrvx4RMV_up\"}],\"type\":\"cell\",\"id\":\"dBb7L_qozxiksn32F_RWs\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"모든 작업\"}],\"type\":\"p\",\"id\":\"wKizR2PZYll_cRfRYcFsB\"}],\"type\":\"p\",\"id\":\"0IDo_ljtRlbJdkPLDoSpw\"}],\"type\":\"cell\",\"id\":\"PUqAQjePWvQqo2fADnUCY\"}],\"type\":\"row\",\"id\":\"vVuc6HeWQz1VVTvaOR9nS\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\",\"id\":\"xFifaBOJm6qI2u6gumgL5\",\"widths\":[17,83],\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"사례5: 서브 계정에 지정 접두사 파일에 대한 읽기/쓰기 권한 부여\"}],\"nodeId\":\".EC.82.AC.EB.A1.805.3A-.EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95.EC.97.90-.EC.A7.80.EC.A0.95-.EC.A0.91.EB.91.90.EC.82.AC-.ED.8C.8C.EC.9D.BC.EC.97.90-.EB.8C.80.ED.95.9C-.EC.9D.BD.EA.B8.B0.2F.EC.93.B0.EA.B8.B0-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h4\",\"id\":\"JhinIe_xHdAEin_h3RAGv\"},{\"children\":[{\"text\":\"설정 정보는 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"w8mGbV9rt-BqUTGuUMIby\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설정 항목\"}],\"type\":\"p\",\"id\":\"IQJWFLnJgN_Y2Or_QxxvB\"}],\"type\":\"cell\",\"id\":\"vrQ24DnHrC8q6ZShiNh_l\"},{\"children\":[{\"children\":[{\"text\":\"설정값\"}],\"type\":\"p\",\"id\":\"zR7nhvbMBYzgy8Zkk847C\"}],\"type\":\"cell\",\"id\":\"hKtQKDKV-8wpnFar3DyLP\"}],\"type\":\"row\",\"id\":\"a2Mf3qKq2PGcr6Sae8Zk3\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"효과\"}],\"type\":\"p\",\"id\":\"ljuVYQbQhhUPR5x0IUTEe\"}],\"type\":\"p\",\"id\":\"dF9jdSnFSyojRwFsK_Qi6\"}],\"type\":\"cell\",\"id\":\"n-kL8kd7O3mNz_tbkYDX-\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"허용\"}],\"type\":\"p\",\"id\":\"t5zC-0KU-GVHa7yGGYTvf\"}],\"type\":\"p\",\"id\":\"yYu4ocwtH3vjig3oWgx79\"}],\"type\":\"cell\",\"id\":\"PuqjTnlAccfck5ApVmOoi\"}],\"type\":\"row\",\"id\":\"kzpPa49X-WefqRZTltMLC\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"사용자\"}],\"type\":\"p\",\"id\":\"WGzeB1nbgljjeV4umzPYJ\"}],\"type\":\"p\",\"id\":\"AfZ61n6y_bSQoM7b-UQm_\"}],\"type\":\"cell\",\"id\":\"J-RazgWvZlWaC-N_rki2l\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"서브 계정을 선택한 후 서브 계정의 UIN을 입력하고, 해당 서브 계정은 반드시 현재 루트 계정의 서브 계정이어야 합니다(예: 100000000011)\"}],\"type\":\"p\",\"id\":\"XEKvM_DkYqzfzKStkwD7w\"}],\"type\":\"p\",\"id\":\"c5DEZkt307aO5b9eQXYPF\"}],\"type\":\"cell\",\"id\":\"bRcgEAp64T6f8I5nRh6Tn\"}],\"type\":\"row\",\"id\":\"4lYxR2jSM4_8REX6e4ag0\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"리소스\"}],\"type\":\"p\",\"id\":\"X6j8gI7OIxOFQgTlhXY9k\"}],\"type\":\"p\",\"id\":\"OLGd6PbzCtW7rPOdpifGF\"}],\"type\":\"cell\",\"id\":\"DQUUNH_79qR-VqSvq6ZtM\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지정 접두사(예: \"},{\"code\":1,\"text\":\"folder/sub-folder/prefix\"},{\"text\":\")\"}],\"type\":\"p\",\"id\":\"VUvn8L460Fwrfb6niHiGS\"}],\"type\":\"p\",\"id\":\"UEHtbbB19DMqYbR-XmqFM\"}],\"type\":\"cell\",\"id\":\"zE_gXPOirJ-brU-V3PrJy\"}],\"type\":\"row\",\"id\":\"MHDiPrdWhYh5j_uMe4v6j\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"작업\"}],\"type\":\"p\",\"id\":\"Abb_nwTiG2uzkDxGeAlEV\"}],\"type\":\"p\",\"id\":\"0O89dB0aZjSFp2XWhHxZx\"}],\"type\":\"cell\",\"id\":\"_nHg5V_ExRZwQorq6xVAx\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"모든 작업\"}],\"type\":\"p\",\"id\":\"HisxtHYWMa1zoIdhS16u6\"}],\"type\":\"p\",\"id\":\"f-hEeAnIwT1D7xuOYPb5S\"}],\"type\":\"cell\",\"id\":\"901i2Oo0r8Y5KFmp83404\"}],\"type\":\"row\",\"id\":\"SNypreluR1CPwPigbd3XZ\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\",\"id\":\"Tsyut5Mo5rLYNw_akrwrd\",\"widths\":[16,84],\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"CAM을 이용한 권한 부여 사례\"}],\"nodeId\":\"cam\",\"type\":\"h2\",\"id\":\"DHxOs9uQl_NYTIJHRZ4UV\"},{\"children\":[{\"text\":\"계정 차원에서 권한을 부여하는 경우 다음 문서를 참조하여 설정하십시오.\"}],\"type\":\"p\",\"id\":\"UW-cxmgIISrlN9gOFjG_O\"},{\"children\":[{\"children\":[{\"text\":\"Authorizing Sub-account Full Access to Specific Directory\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/598/11084\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/598/11084\"},\"type\":\"ref\",\"id\":\"LjMjzjmI5fu_mrjfRrjqJ\"}],\"start\":false,\"type\":\"uli\",\"id\":\"ZqnbRvtSUQe0gXoA0vE2u\"},{\"children\":[{\"children\":[{\"text\":\"Authorizing Sub-account Read-only Access to Files in Specific Directory\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/598/11085\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/598/11085\"},\"type\":\"ref\",\"id\":\"cZlrzzVkZnHnvJeI2wuUJ\"}],\"start\":false,\"type\":\"uli\",\"id\":\"IW04WGvHwSztoGq1plC-3\"},{\"children\":[{\"children\":[{\"text\":\"Authorizing Sub-account Read/Write Access to Specific File\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/598/11086\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/598/11086\"},\"type\":\"ref\",\"id\":\"rBg8rpaLnpcD6RWxORKkn\"}],\"start\":false,\"type\":\"uli\",\"id\":\"HqAyC_on2UEKTqeMvUYsO\"},{\"children\":[{\"children\":[{\"text\":\"Authorizing Sub-account Read-only Access to COS Resources\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/598/11087\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/598/11087\"},\"type\":\"ref\",\"id\":\"f4jOnK_GNEDU31D2beJ8X\"}],\"start\":false,\"type\":\"uli\",\"id\":\"rVGS68tfwPYNH-59o7XA_\"},{\"children\":[{\"children\":[{\"text\":\"Authorizing Sub-account Read/Write Access to Specific File\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/598/11086\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/598/11086\"},\"type\":\"ref\",\"id\":\"73-ttzGzZGwdatU7hUHRZ\"}],\"start\":false,\"type\":\"uli\",\"id\":\"18GtUq4r-AMhqAf4zdRTQ\"},{\"children\":[{\"children\":[{\"text\":\"Authorizing Sub-account Read/Write Access to Files with Specified Prefix\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/598/11090\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/598/11090\"},\"type\":\"ref\",\"id\":\"MeZPGCvxJZT7lnFyMizO6\"}],\"start\":false,\"type\":\"uli\",\"id\":\"uRDsPe1FSbqr9cWjC0ZlF\"},{\"children\":[{\"children\":[{\"text\":\"Authorizing Another Account Read/Write Access to Specific Files\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/598/11091\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/598/11091\"},\"type\":\"ref\",\"id\":\"sQEyHdv5SGxkGd1lyyo8t\"}],\"start\":false,\"type\":\"uli\",\"id\":\"j-tze-WTSghZwc1WyHAkw\"}]"}},"13653":{"categoryId":436,"weight":100,"type":"page","extension":"","pid":32735,"id":13653,"lang":"ko","title":"요청률 및 성능 최적화","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:11","recentReleaseTime":"2019-12-06 19:34:11","content":{"title":"요청률 및 성능 최적화","body":"
주의:\n현재 COS는 하위 인덱스 분산 메커니즘을 통해 높은 QPS를 구현했으며 더 높은 성능의 QPS가 필요한 경우 고객센터로 문의할 수 있습니다. 파일을 정리하는 일상적인 프로세스에서 여전히 이 문서의 요구 사항을 따르고 지나치게 중앙 집중화된 인덱스 저장소를 피하는 것이 좋습니다.

소개

본문은 Tencent Cloud Cloud Object Storage(COS)에서 요청 속도 성능 최적화를 위한 모범 사례를 설명합니다.
Tencent Cloud COS는 초당 30000 PUT 요청 또는 초당 30000 GET 요청의 일반적인 워크로드 용량을 지원합니다. 워크로드가 위의 임계값을 초과하는 경우 이 가이드에 따라 요청 속도 성능을 확장하고 최적화할 수 있습니다.
설명:
요청 로드는 동시 연결 수가 아닌 초당 시작된 요청 수를 나타냅니다. 즉, 문제 없이 수천 개의 기존 연결을 유지하면서 초당 수백 개의 새로운 연결 요청을 보낼 수 있습니다.
Tencent Cloud COS는 더 높은 요청률을 제공하기 위해 성능 확장을 지원합니다. GET 요청 로드가 높은 경우 Tencent Cloud CDN 제품과 함께 COS를 사용하는 것이 좋습니다. 자세한 내용은 도메인 관리를 참고하십시오. 버킷의 전체 요청 속도가 초당 30000 PUT/GET 요청을 초과할 것으로 예상되는 경우 고객센터로 문의하여 워크로드에 대비하고 요청 제한을 피할 수 있습니다.
설명:
가끔 초당 30000에 도달하고 버스트 중에 초당 30000을 초과하지 않는 혼합 요청 로드가 있는 경우 이 가이드를 무시할 수 있습니다.

실행 순서

혼합 요청 로드

대량의 객체를 업로드하는 경우, 선택한 객체 키의 성능에 문제가 생길 수 있습니다. 다음은 Tencent Cloud COS가 Object 키 값을 저장하는 방법을 간략히 소개합니다.
Tencent Cloud는 COS의 모든 서비스 리전에 버킷(Bucket)과 객체(Object)의 키 값을 인덱스로 유지하고 있습니다. 객체 키는 UTF-8 이진법의 순서로 저장됩니다. 이처럼 많은 키 값으로 인해 타임스탬프나 알파벳 순서 등을 사용하면 키 값이 위치한 파티션의 읽기/쓰기 성능 용량이 소모될 수 있습니다. 버킷 경로 examplebucket-1250000000.cos.ap-beijing.myqcloud.com을 예시로 인덱스 성능 용량을 소모할 수 있는 몇 가지 경우는 다음과 같습니다.
20170701/log120000.tar.gz
20170701/log120500.tar.gz
20170701/log121000.tar.gz
20170701/log121500.tar.gz
...
image001/indexpage1.jpg
image002/indexpage2.jpg
image003/indexpage3.jpg
...
일반적인 워크로드가 초당 30000개 요청을 초과하는 경우 위의 경우와 같이 순차 키 값을 사용하지 않아야 합니다. 일련 번호, 날짜 또는 시간 값과 같은 문자를 객체 키로 사용해야 하는 경우 키 이름에 임의의 접두사를 추가하여 여러 인덱스 파티션의 키 값을 관리하고 중앙 집중식 로드 성능을 개선할 수 있습니다. 다음은 키 값에 임의의 요소를 추가하는 몇 가지 방법입니다.
주의:
단일 버킷의 액세스 성능을 향상시키기 위해 다음 방법을 모두 사용할 수 있습니다. 업무의 일반적인 부하가 초당 30000 요청을 초과하는 경우에도 다음 방법을 수행하는 동안에도 미리 업무 부하에 대비하기 위해 고객센터로 문의하십시오.

16진법 해시 접두사 추가

객체 키에 랜덤성을 높이는 가장 직접적인 방법은 키 이름의 맨 앞에 해시 문자열 접두사를 추가하는 것입니다. 예를 들어 객체를 업로드할 때 경로 키 값의 SHA1 또는 MD5 해시를 계산하고 키 이름에 접두사로 몇 개의 문자를 추가합니다. 일반적으로 길이가 2 - 4자인 해시 접두사로 충분합니다.
faf1-20170701/log120000.tar.gz
e073-20170701/log120500.tar.gz
333c-20170701/log121000.tar.gz
2c32-20170701/log121500.tar.gz
주의:
Tencent Cloud COS의 키 값은 UTF-8 바이너리 순서로 인덱싱되므로 원래의 완전한 20170701 접두사 구조를 얻으려면 65536 GET Bucket 작업을 시작해야 할 수 있습니다.

열거된 값 접두사 추가

여전히 객체 키를 쉽게 검색할 수 있는지 확인하려면 파일 유형에 따라 접두사를 열거하여 객체를 그룹화할 수 있습니다. 동일한 열거 값을 가진 접두사는 접두사가 위치한 인덱스 파티션의 기능을 공유합니다.
logs/20170701/log120000.tar.gz
logs/20170701/log120500.tar.gz
logs/20170701/log121000.tar.gz
...
images/image001/indexpage1.jpg
images/image002/indexpage2.jpg
images/image003/indexpage3.jpg
...
열거된 접두사에 대한 액세스 로드가 초당 30000개 이상의 요청으로 유지되는 경우 이전 방법을 참고하여 열거된 값 뒤에 해시 접두사를 추가하여 다중 인덱스 파티션을 구현하여 읽기/쓰기 성능을 향상시킬 수 있습니다.

logs/faf1-20170701/log120000.tar.gz
logs/e073-20170701/log120500.tar.gz
logs/333c-20170701/log121000.tar.gz
...
images/0165-image001/indexpage1.jpg
images/a349-image002/indexpage2.jpg
images/ac00-image003/indexpage3.jpg
...


키 이름 문자열 반전

증분 ID 또는 날짜를 사용해야 하거나 단일 업로드에서 접두사가 연속적인 많은 객체를 업로드하려면 다음 방법을 참고하십시오.
20170701/log0701A.tar.gz
20170701/log0701B.tar.gz
20170702/log0702A.tar.gz
20170702/log0702B.tar.gz
...
id16777216/album/hongkong/img20170701121314.jpg
id16777216/music/artist/tony/anythinggoes.mp3
id16777217/video/record20170701121314.mov
id16777218/live/show/date/20170701121314.mp4
...
상기 키 값에 대한 네이밍 방식은 2017과 ID가 붙은 키 값이 위치한 인덱스 파티션의 성능을 쉽게 소모합니다. 이 경우 임의의 특정 요소를 허용하기 위해 키 접두사의 일부를 반전시킵니다.
10707102/log0701A.tar.gz
10707102/log0701B.tar.gz
20707102/log0702A.tar.gz
20707102/log0702B.tar.gz
...
61277761di/album/hongkong/img20170701121314.jpg
61277761di/music/artist/tony/anythinggoes.mp3
71277761di/video/record20170701121314.mov
81277761di/live/show/date/20170701121314.mp4
...

높은 GET 요청 로드

워크로드가 주로 GET 요청(예: 다운로드 요청)과 관련된 경우 위 지침을 준수하는 것 외에도 Tencent Cloud CDN 서비스와 함께 COS를 사용하는 것이 좋습니다.
Tencent Cloud CDN은 콘텐츠를 사용자에게 배포할 때 대기 시간을 최소화하고 속도를 향상시키는 데 사용할 수 있는 중국과 전 세계에 엣지 가속 노드를 보유하고 있습니다. 핫 파일은 프리패치 기능을 사용하여 캐시할 수 있으므로 COS 원본 서버로 반환되는 GET 요청 수를 줄일 수 있습니다. 자세한 내용은 도메인 관리를 참고하십시오.
","recentReleaseTime":"2025-04-23 14:11:36","slate":"[{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"},{\"text\":\"\\n현재 COS는 하위 인덱스 분산 메커니즘을 통해 높은 QPS를 구현했으며 더 높은 성능의 QPS가 필요한 경우 \"},{\"children\":[{\"text\":\"고객센터\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/contact-sales\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/contact-sales\"},\"type\":\"ref\",\"id\":\"bfi48_do58bkgVeNDQU4U\"},{\"text\":\"로 문의할 수 있습니다. 파일을 정리하는 일상적인 프로세스에서 여전히 이 문서의 요구 사항을 따르고 지나치게 중앙 집중화된 인덱스 저장소를 피하는 것이 좋습니다.\"}],\"type\":\"p\",\"id\":\"SLKS82Jf-7HIZ4Y9_iDIk\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"fmJ3O3q-DkuhVhPyvjAd3\"},{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"Sizkp-wwmXiL6WCEtCS3g\"},{\"children\":[{\"text\":\"본문은 Tencent Cloud Cloud Object Storage(COS)에서 요청 속도 성능 최적화를 위한 모범 사례를 설명합니다.\"}],\"type\":\"p\",\"id\":\"fREKuodBWqDStTS00YqMh\"},{\"children\":[{\"text\":\"Tencent Cloud COS는 초당 30000 PUT 요청 또는 초당 30000 GET 요청의 일반적인 워크로드 용량을 지원합니다. 워크로드가 위의 임계값을 초과하는 경우 이 가이드에 따라 요청 속도 성능을 확장하고 최적화할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"EDYgWYLRCq8TjHF--Tlmt\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"KQUDEI9tNEwUW1Bl2l8ca\"},{\"children\":[{\"text\":\" 요청 로드는 동시 연결 수가 아닌 초당 시작된 요청 수를 나타냅니다. 즉, 문제 없이 수천 개의 기존 연결을 유지하면서 초당 수백 개의 새로운 연결 요청을 보낼 수 있습니다.\"}],\"type\":\"p\",\"id\":\"JZ-XjB7JR7FJbe-FHw0UL\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"_64o5kyOdor1okYcEKFHe\"},{\"children\":[{\"text\":\"Tencent Cloud COS는 더 높은 요청률을 제공하기 위해 성능 확장을 지원합니다. GET 요청 로드가 높은 경우 Tencent Cloud CDN 제품과 함께 COS를 사용하는 것이 좋습니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"도메인 관리\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/18424\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/18424\"},\"type\":\"ref\",\"id\":\"oTHHVr5Qd2ti0ncGhWe74\"},{\"text\":\"를 참고하십시오. 버킷의 전체 요청 속도가 초당 30000 PUT/GET 요청을 초과할 것으로 예상되는 경우 \"},{\"children\":[{\"text\":\"고객센터\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/contact-sales\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/contact-sales\"},\"type\":\"ref\",\"id\":\"uE1psA7UjDOLIPBYGZBSc\"},{\"text\":\"로 문의하여 워크로드에 대비하고 요청 제한을 피할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"jM5-BwysGKM9aYwPRWf5b\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"lJAd8AMT2Ce3Nj6hhaXQ7\"},{\"children\":[{\"text\":\" 가끔 초당 30000에 도달하고 버스트 중에 초당 30000을 초과하지 않는 혼합 요청 로드가 있는 경우 이 가이드를 무시할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"5vkBVwJgegdDA-egrcfyn\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"NRHXCJvBxt0IG7Wk4gLMG\"},{\"children\":[{\"text\":\"실행 순서\"}],\"nodeId\":\".EC.8B.A4.ED.96.89-.EC.88.9C.EC.84.9C\",\"type\":\"h2\",\"id\":\"zg7iZiRayEQonT__3AXOo\"},{\"children\":[{\"text\":\"혼합 요청 로드\"}],\"nodeId\":\".ED.98.BC.ED.95.A9-.EC.9A.94.EC.B2.AD-.EB.A1.9C.EB.93.9C\",\"type\":\"h3\",\"id\":\"haePrPxillHTM0x40DC4I\"},{\"children\":[{\"text\":\"대량의 객체를 업로드하는 경우, 선택한 객체 키의 성능에 문제가 생길 수 있습니다. 다음은 Tencent Cloud COS가 Object 키 값을 저장하는 방법을 간략히 소개합니다.\"}],\"type\":\"p\",\"id\":\"GJ6Ugttm0eNnLQ0VAAepm\"},{\"children\":[{\"text\":\"Tencent Cloud는 COS의 모든 서비스 리전에 버킷(Bucket)과 객체(Object)의 키 값을 인덱스로 유지하고 있습니다. 객체 키는 UTF-8 이진법의 순서로 저장됩니다. 이처럼 많은 키 값으로 인해 타임스탬프나 알파벳 순서 등을 사용하면 키 값이 위치한 파티션의 읽기/쓰기 성능 용량이 소모될 수 있습니다. 버킷 경로 \"},{\"code\":1,\"text\":\"examplebucket-1250000000.cos.ap-beijing.myqcloud.com\"},{\"text\":\"을 예시로 인덱스 성능 용량을 소모할 수 있는 몇 가지 경우는 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"l5rU6unTaTT-Zjzw6j3fC\"},{\"children\":[{\"children\":[{\"text\":\"20170701/log120000.tar.gz\"}],\"type\":\"code-line\",\"id\":\"dwcT97BH9baQ8y1_upFNT\"},{\"children\":[{\"text\":\"20170701/log120500.tar.gz\"}],\"type\":\"code-line\",\"id\":\"ll2xRfA70mRWoPXCsfEQa\"},{\"children\":[{\"text\":\"20170701/log121000.tar.gz\"}],\"type\":\"code-line\",\"id\":\"CkRFDbovnK_3eOMMTh7l7\"},{\"children\":[{\"text\":\"20170701/log121500.tar.gz\"}],\"type\":\"code-line\",\"id\":\"I3JAJ4Qhc1fp-F2Qnumli\"},{\"children\":[{\"text\":\"...\"}],\"type\":\"code-line\",\"id\":\"BV7fV_2iCXod6C0lyizSb\"},{\"children\":[{\"text\":\"image001/indexpage1.jpg\"}],\"type\":\"code-line\",\"id\":\"OQVddn4awL5RjGfx8dQ_3\"},{\"children\":[{\"text\":\"image002/indexpage2.jpg\"}],\"type\":\"code-line\",\"id\":\"WdUczYOQWt9QbXpeH2p2H\"},{\"children\":[{\"text\":\"image003/indexpage3.jpg\"}],\"type\":\"code-line\",\"id\":\"_kkIA_F4Bnw_iSWYGOGdo\"},{\"children\":[{\"text\":\"...\"}],\"type\":\"code-line\",\"id\":\"qqcOqpLTUw5KNx8oAPH68\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"aeBGEW7iNDmf--A8_gARU\",\"autoWrap\":false},{\"children\":[{\"text\":\"일반적인 워크로드가 초당 30000개 요청을 초과하는 경우 위의 경우와 같이 순차 키 값을 사용하지 않아야 합니다. 일련 번호, 날짜 또는 시간 값과 같은 문자를 객체 키로 사용해야 하는 경우 키 이름에 임의의 접두사를 추가하여 여러 인덱스 파티션의 키 값을 관리하고 중앙 집중식 로드 성능을 개선할 수 있습니다. 다음은 키 값에 임의의 요소를 추가하는 몇 가지 방법입니다.\"}],\"type\":\"p\",\"id\":\"CRgzBUSYms190PYZFmSGU\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"Zb7hl4ipRJ--eGPO54Syn\"},{\"children\":[{\"text\":\"단일 버킷의 액세스 성능을 향상시키기 위해 다음 방법을 모두 사용할 수 있습니다. 업무의 일반적인 부하가 초당 30000 요청을 초과하는 경우에도 다음 방법을 수행하는 동안에도 미리 업무 부하에 대비하기 위해 \"},{\"children\":[{\"text\":\"고객센터\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/contact-sales\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/contact-sales\"},\"type\":\"ref\",\"id\":\"BEZpSiPB9l9Zo4wsS9E4c\"},{\"text\":\"로 문의하십시오.\"}],\"type\":\"p\",\"id\":\"mo1RMG4EReqLzd1rj1NcG\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"OHRVHAJqn3dkWvniDTZaL\"},{\"children\":[{\"text\":\"16진법 해시 접두사 추가\"}],\"nodeId\":\"16.EC.A7.84.EB.B2.95-.ED.95.B4.EC.8B.9C-.EC.A0.91.EB.91.90.EC.82.AC-.EC.B6.94.EA.B0.80\",\"type\":\"h4\",\"id\":\"PfzFjPIMkuQSPqWNpOtdC\"},{\"children\":[{\"text\":\"객체 키에 랜덤성을 높이는 가장 직접적인 방법은 키 이름의 맨 앞에 해시 문자열 접두사를 추가하는 것입니다. 예를 들어 객체를 업로드할 때 경로 키 값의 SHA1 또는 MD5 해시를 계산하고 키 이름에 접두사로 몇 개의 문자를 추가합니다. 일반적으로 길이가 2 - 4자인 해시 접두사로 충분합니다.\"}],\"type\":\"p\",\"id\":\"nZYHWJTLep1nLphHPtSLa\"},{\"type\":\"code-block\",\"language\":\"plaintext\",\"children\":[{\"type\":\"code-line\",\"id\":\"te2dp6aNKLG3Vq8Jx_5_Y\",\"children\":[{\"text\":\"faf1-20170701/log120000.tar.gz\"}]},{\"type\":\"code-line\",\"id\":\"2lboZ9ecWHSXTbmOGgiPX\",\"children\":[{\"text\":\"e073-20170701/log120500.tar.gz\"}]},{\"type\":\"code-line\",\"id\":\"-l_9k6dGWy7QrHkRqzbTD\",\"children\":[{\"text\":\"333c-20170701/log121000.tar.gz\"}]},{\"type\":\"code-line\",\"id\":\"QJpUnlNkYsHDFnzXku1BK\",\"children\":[{\"text\":\"2c32-20170701/log121500.tar.gz\"}]}],\"id\":\"qoUnAxqzGZVrGosFxGXft\",\"autoWrap\":false},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"jxJ-19J9mrBG0tDCbrTpv\"},{\"children\":[{\"text\":\"Tencent Cloud COS의 키 값은 UTF-8 바이너리 순서로 인덱싱되므로 원래의 완전한 20170701 접두사 구조를 얻으려면 65536 GET Bucket 작업을 시작해야 할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"H2_4amSGIXy0Jf6iXQbdg\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"NES2TGcBi-AS2iLhCYyW2\"},{\"children\":[{\"text\":\"열거된 값 접두사 추가\"}],\"nodeId\":\".EC.97.B4.EA.B1.B0.EB.90.9C-.EA.B0.92-.EC.A0.91.EB.91.90.EC.82.AC-.EC.B6.94.EA.B0.80\",\"type\":\"h4\",\"id\":\"2J3mOGdz3B_zhFrsiJuhG\"},{\"children\":[{\"text\":\"여전히 객체 키를 쉽게 검색할 수 있는지 확인하려면 파일 유형에 따라 접두사를 열거하여 객체를 그룹화할 수 있습니다. 동일한 열거 값을 가진 접두사는 접두사가 위치한 인덱스 파티션의 기능을 공유합니다.\"}],\"type\":\"p\",\"id\":\"GlrE8isYlTBzOmo3iiu-j\"},{\"children\":[{\"children\":[{\"text\":\"logs/20170701/log120000.tar.gz\"}],\"type\":\"code-line\",\"id\":\"LpKvAe3zM9OmUMyqYh5Vn\"},{\"children\":[{\"text\":\"logs/20170701/log120500.tar.gz\"}],\"type\":\"code-line\",\"id\":\"lYbh7IMmudWvfQtmzUrCv\"},{\"children\":[{\"text\":\"logs/20170701/log121000.tar.gz\"}],\"type\":\"code-line\",\"id\":\"iLvwDoyb4Wf3fzWJcYiza\"},{\"children\":[{\"text\":\"...\"}],\"type\":\"code-line\",\"id\":\"Nl6s9Eyx-3P1rcO5cSBKZ\"},{\"children\":[{\"text\":\"images/image001/indexpage1.jpg\"}],\"type\":\"code-line\",\"id\":\"My2oiej3EY8RrEYtZaTLa\"},{\"children\":[{\"text\":\"images/image002/indexpage2.jpg\"}],\"type\":\"code-line\",\"id\":\"pHpm-SktShDgx9Y_x3Qcc\"},{\"children\":[{\"text\":\"images/image003/indexpage3.jpg\"}],\"type\":\"code-line\",\"id\":\"ESaXdJoxtqO8liYbId9TN\"},{\"children\":[{\"text\":\"...\"}],\"type\":\"code-line\",\"id\":\"uYutdO0eOB23aO56MhKYl\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"tZcWflR2z5Gcfts_br5uY\",\"autoWrap\":false},{\"children\":[{\"text\":\"열거된 접두사에 대한 액세스 로드가 초당 30000개 이상의 요청으로 유지되는 경우 이전 방법을 참고하여 열거된 값 뒤에 해시 접두사를 추가하여 다중 인덱스 파티션을 구현하여 읽기/쓰기 성능을 향상시킬 수 있습니다.\"}],\"type\":\"p\",\"id\":\"cZK6xf7AZdtwkToTHHOsK\"},{\"type\":\"code-block\",\"language\":\"plaintext\",\"children\":[{\"type\":\"code-line\",\"id\":\"HdG5ZnfzJV1XmP1KK9wHf\",\"children\":[{\"text\":\"\"}]},{\"type\":\"code-line\",\"id\":\"vvDbkL35PK1Y5LuYIRoRI\",\"children\":[{\"text\":\"logs/faf1-20170701/log120000.tar.gz\"}]},{\"type\":\"code-line\",\"id\":\"ysmxKgRzwHQ8Yohp7wT6u\",\"children\":[{\"text\":\"logs/e073-20170701/log120500.tar.gz\"}]},{\"type\":\"code-line\",\"id\":\"8Hly0NTE_JFCF-8FP_Nzb\",\"children\":[{\"text\":\"logs/333c-20170701/log121000.tar.gz\"}]},{\"type\":\"code-line\",\"id\":\"JxqME6Awfr9A-BVX1mFf6\",\"children\":[{\"text\":\"...\"}]},{\"type\":\"code-line\",\"id\":\"vZwZ0osq5bnVn_yh5aQLw\",\"children\":[{\"text\":\"images/0165-image001/indexpage1.jpg\"}]},{\"type\":\"code-line\",\"id\":\"z29SXuf9IS54HFbIjgRUh\",\"children\":[{\"text\":\"images/a349-image002/indexpage2.jpg\"}]},{\"type\":\"code-line\",\"id\":\"F-IGu_le8mmGSZW9_UT_q\",\"children\":[{\"text\":\"images/ac00-image003/indexpage3.jpg\"}]},{\"type\":\"code-line\",\"id\":\"i_CWCKX-GNN1pbcn8ivMC\",\"children\":[{\"text\":\"...\"}]},{\"type\":\"code-line\",\"id\":\"Bs0q4CuIr8pfvXKXTfZk_\",\"children\":[{\"text\":\"\"}]}],\"id\":\"yRHI7lh6NbPrl3YQb_W7P\",\"autoWrap\":false},{\"children\":[{\"text\":\"키 이름 문자열 반전\"}],\"nodeId\":\".ED.82.A4-.EC.9D.B4.EB.A6.84-.EB.AC.B8.EC.9E.90.EC.97.B4-.EB.B0.98.EC.A0.84\",\"type\":\"h4\",\"id\":\"ghD5PLpH9OMsA5mzoj43b\"},{\"children\":[{\"text\":\"증분 ID 또는 날짜를 사용해야 하거나 단일 업로드에서 접두사가 연속적인 많은 객체를 업로드하려면 다음 방법을 참고하십시오.\"}],\"type\":\"p\",\"id\":\"4p_2ZpY1W7bwPRktD_3RP\"},{\"children\":[{\"children\":[{\"text\":\"20170701/log0701A.tar.gz\"}],\"type\":\"code-line\",\"id\":\"iYyFvgJCCIMEA5GR16bni\"},{\"children\":[{\"text\":\"20170701/log0701B.tar.gz\"}],\"type\":\"code-line\",\"id\":\"eglHwf53wn30vbTvhG9j5\"},{\"children\":[{\"text\":\"20170702/log0702A.tar.gz\"}],\"type\":\"code-line\",\"id\":\"hiDVy-8lUjGM6HVPaN3rO\"},{\"children\":[{\"text\":\"20170702/log0702B.tar.gz\"}],\"type\":\"code-line\",\"id\":\"1QcvZEE8Jio4fmXVeqZa7\"},{\"children\":[{\"text\":\"...\"}],\"type\":\"code-line\",\"id\":\"9-jeGkdS7j77gGwjc9U87\"},{\"children\":[{\"text\":\"id16777216/album/hongkong/img20170701121314.jpg\"}],\"type\":\"code-line\",\"id\":\"wiHsoYXGa0qCdQUUAUR4p\"},{\"children\":[{\"text\":\"id16777216/music/artist/tony/anythinggoes.mp3\"}],\"type\":\"code-line\",\"id\":\"qDpPXTFDmCMEu4LEy6z4S\"},{\"children\":[{\"text\":\"id16777217/video/record20170701121314.mov\"}],\"type\":\"code-line\",\"id\":\"zI-8BxYAJk-iUUKrSVMPW\"},{\"children\":[{\"text\":\"id16777218/live/show/date/20170701121314.mp4\"}],\"type\":\"code-line\",\"id\":\"a2Lxr59v8hq63Q3JRQKsa\"},{\"children\":[{\"text\":\"...\"}],\"type\":\"code-line\",\"id\":\"80lkD5VxCxQFYyiD0DKxL\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"goppZAHCcg6Orzwh11vkn\",\"autoWrap\":false},{\"children\":[{\"text\":\"상기 키 값에 대한 네이밍 방식은 2017과 ID가 붙은 키 값이 위치한 인덱스 파티션의 성능을 쉽게 소모합니다. 이 경우 임의의 특정 요소를 허용하기 위해 키 접두사의 일부를 반전시킵니다.\"}],\"type\":\"p\",\"id\":\"qHxTI0btWMj7kf6hPP49h\"},{\"children\":[{\"children\":[{\"text\":\"10707102/log0701A.tar.gz\"}],\"type\":\"code-line\",\"id\":\"p136pvsWWhZRWEz_EQU2H\"},{\"children\":[{\"text\":\"10707102/log0701B.tar.gz\"}],\"type\":\"code-line\",\"id\":\"lbeYweKJdygnhlJm2YpoA\"},{\"children\":[{\"text\":\"20707102/log0702A.tar.gz\"}],\"type\":\"code-line\",\"id\":\"G0-xrv378JdMDMjeMiWGh\"},{\"children\":[{\"text\":\"20707102/log0702B.tar.gz\"}],\"type\":\"code-line\",\"id\":\"vYel1sRL-qAELaYpENEcd\"},{\"children\":[{\"text\":\"...\"}],\"type\":\"code-line\",\"id\":\"M5Sxp_hxiSssB1dWTlsaW\"},{\"children\":[{\"text\":\"61277761di/album/hongkong/img20170701121314.jpg\"}],\"type\":\"code-line\",\"id\":\"P97pfaJgcm0WY5tk00aFz\"},{\"children\":[{\"text\":\"61277761di/music/artist/tony/anythinggoes.mp3\"}],\"type\":\"code-line\",\"id\":\"WUGXIipKpBuGYy7_IWts4\"},{\"children\":[{\"text\":\"71277761di/video/record20170701121314.mov\"}],\"type\":\"code-line\",\"id\":\"vvZpbKYuiCzHknX8mrVYU\"},{\"children\":[{\"text\":\"81277761di/live/show/date/20170701121314.mp4\"}],\"type\":\"code-line\",\"id\":\"aV1lF3yhyPtr9HFZUv2H4\"},{\"children\":[{\"text\":\"...\"}],\"type\":\"code-line\",\"id\":\"9k1syR3sXLzVgCSiMrKyI\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"4jaj0SguXTmF6Aq9F75IV\",\"autoWrap\":false},{\"children\":[{\"text\":\"높은 GET 요청 로드\"}],\"nodeId\":\".EB.86.92.EC.9D.80-get-.EC.9A.94.EC.B2.AD-.EB.A1.9C.EB.93.9C\",\"type\":\"h3\",\"id\":\"8YMN0iprkUHF33Sx85H05\"},{\"children\":[{\"text\":\"워크로드가 주로 GET 요청(예: 다운로드 요청)과 관련된 경우 위 지침을 준수하는 것 외에도 Tencent Cloud CDN 서비스와 함께 COS를 사용하는 것이 좋습니다.\"}],\"type\":\"p\",\"id\":\"QqZlOasEmsqvatKKOTE-H\"},{\"children\":[{\"text\":\"Tencent Cloud CDN은 콘텐츠를 사용자에게 배포할 때 대기 시간을 최소화하고 속도를 향상시키는 데 사용할 수 있는 중국과 전 세계에 엣지 가속 노드를 보유하고 있습니다. 핫 파일은 프리패치 기능을 사용하여 캐시할 수 있으므로 COS 원본 서버로 반환되는 GET 요청 수를 줄일 수 있습니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"도메인 관리\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/18424\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/18424\"},\"type\":\"ref\",\"id\":\"IL4OjSahkxMcvGD7qHl8_\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"uunfSKuPQYOTD8cSsEgQz\"}]"}},"14048":{"categoryId":436,"weight":55,"type":"page","extension":"","pid":12473,"id":14048,"lang":"ko","title":"임시 키 생성 및 사용 가이드","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:11","recentReleaseTime":"2019-12-06 19:34:11","content":{"title":"임시 키 생성 및 사용 가이드","body":"
주의:
임시 키를 사용해 액세스 권한을 부여하는 경우, 반드시 업무 수요에 따라 최소 권한 부여를 원칙으로 권한을 부여해야 합니다. 직접 모든 리소스(resource:*) 또는 모든 작업(action:*)에 대한 권한을 부여하는 경우 권한 범위가 너무 커 데이터 보안에 대한 리스크가 발생할 수 있습니다.
임시 키 신청 시 권한 범위를 지정하면 신청한 임시 키가 권한 범위 내에서만 동작할 수 있습니다. 예를 들어 임시 키를 신청할 때 examplebucket-1-1250000000 버킷에 파일을 업로드할 수 있는 권한 범위를 지정한 다음 적용된 키는 examplebucket-2-1250000000에 파일을 업로드할 수 없습니다. 또한 examplebucket-1-1250000000에서 파일을 다운로드할 수 없습니다.

임시 키

임시 키(임시 액세스 자격 증명)는 CAM 클라우드 API에서 제공하는 인터페이스를 통해 획득하는 권한이 부여된 키입니다.\nCOS API는 임시 키를 사용해 서명을 컴퓨팅해 COS API 요청을 전송하는 데 사용합니다.\nCOS API 요청은 임시 키를 사용해 서명 컴퓨팅 시, 다음 3개의 임시 키 인터페이스 반환 정보 획득에 사용하는 필드가 필요합니다.
TmpSecretId
TmpSecretKey
Token

임시 키 사용의 장점

Web, iOS, Android에서 COS를 사용할 때, 고정 키를 사용해 서명을 컴퓨팅하는 경우 권한을 효과적으로 제어할 수 없을 뿐 아니라, 영구 키를 클라이언트 코드에 삽입하는 경우 커다란 유출 위험이 존재하게 됩니다. 임시 키 방식을 사용하면 권한 제어 문제를 편리하고 효과적으로 해결할 수 있습니다.\n예를 들어, 임시 키 신청 과정에서 권한 정책 policy 필드 설정을 통해 작업 및 리소스를 제한하고, 권한을 지정된 범위로 제한할 수 있습니다.
COS API 권한 부여 정책과 관련해서는 다음을 참고하십시오.

임시 키 획득

임시 키는 제공되는 COS STS SDK 방식을 통해 획득할 수 있으며, 직접 STS 클라우드 API 요청 방식으로도 획득할 수 있습니다.
주의:
예시에서는 Java SDK를 사용하였으며, GitHub에서 SDK 코드(버전)을 획득해야 합니다. 해당 SDK 버전을 찾을 수 없다는 안내가 표시되는 경우, GitHub에서 상응하는 버전의 SDK를 획득하였는지 확인하십시오.

COS STS SDK

COS는 STS에 대한 SDK와 샘플을 제공합니다. 현재 Java, Nodejs, PHP, Python, Go 등 여러 가지 언어 샘플을 제공하고 있으며, 자세한 내용은 COS STS SDK를 참고하십시오. 각 SDK별 사용 설명은 Github의 README와 예시를 참고하십시오. 각 언어의 GitHub 주소는 하기 표와 같습니다.
주의:
STS SDK는 STS 인터페이스 자체의 버전별 차이점을 차단하기 위해 반환 매개변수 구조가 STS 인터페이스와 완벽하게 일치하지 않습니다. 세부 사항은 Java SDK 문서를 참고하십시오.
Java SDK를 사용한다고 가정하고, 먼저 Java SDK를 다운로드한 후 실행하여 다음 예시와 같이 임시 키를 획득합니다.

코드 예시

// github에서 제공하는 maven 통합 방법에 따라 java sts sdk 가져오기. 3.1.0 이상 버전 사용
public class Demo {
public static void main(String[] args) {
TreeMap<String, Object> config = new TreeMap<String, Object>();

try {
//여기에서 SecretId와 SecretKey는 임시 키를 신청하기 위한 영구 ID(루트 계정, 서브 계정 등)를 나타내며, 서브 계정은 버킷 작업 권한이 있어야 합니다.
String secretId = System.getenv("secretId");//사용자 SecretId. 리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한 원칙을 따르는 것이 좋습니다. 서브 계정 키를 가져오는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/598/37140
String secretKey = System.getenv("secretKey");//사용자 SecretKey. 리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한 원칙을 따르는 것이 좋습니다. 서브 계정 키를 가져오는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/598/37140
// Tencent Cloud api 키 SecretId로 교체
config.put("secretId", secretId);
// Tencent Cloud api 키 SecretKey로 교체
config.put("secretKey", secretKey);

// 도메인 설정:
// Tencent Cloud cvm을 사용하는 경우 내부 도메인 이름 설정 가능
//config.put("host", "sts.internal.tencentcloudapi.com");

// 임시 키의 유효 시간은 초 단위입니다. 기본값은 1800 초이며, 현재 루트 계정에서 최대 2 시간(7200 초), 서브 계정에서 최대 36시간(129600초)까지 설정 가능
config.put("durationSeconds", 1800);

// 사용자의 bucket으로 변경
config.put("bucket", "examplebucket-1250000000");
// bucket 소재 리전으로 변경
config.put("region", "ap-guangzhou");

// 여기서 허용된 경로의 접두사로 바꾸면 자신의 웹 사이트의 사용자 로그인 상태에 따라 업로드가 허용된 구체적 경로를 판단할 수 있습니다.
// 몇 가지 일반적인 접두사 인증 시나리오:
// 1. 모든 객체에 대한 액세스 허용: "*"
// 2. 지정된 객체에 대한 액세스 허용: "a/a1.txt", "b/b1.txt"
// 3. 지정된 접두사의 객체에 대한 액세스 허용: "a*", "a/*", "b/*"
// '*'를 입력하면 사용자가 모든 리소스에 액세스하는 것을 허용하게 됩니다. 업무에 필요한 경우가 아니면 최소 권한 원칙에 따라 사용자에게 적합한 액세스 권한 범위를 부여하십시오.
config.put("allowPrefixes", new String[] {
"exampleobject",
"exampleobject2"
});

// 키에 대한 권한 목록입니다. 이 임시 키에 필요한 권한을 여기에서 지정해야 합니다.
// 간편 업로드, 폼 업로드 및 멀티파트 업로드 시에는 다음과 같은 권한이 필요합니다. 기타 권한 리스트는 다음을 참고하십시오. https://www.tencentcloud.com/document/product/436/30580
String[] allowActions = new String[] {
// 간편 업로드
"name/cos:PutObject",
// 폼 업로드, 미니프로그램 업로드
"name/cos:PostObject",
// 멀티파트 업로드
"name/cos:InitiateMultipartUpload",
"name/cos:ListMultipartUploads",
"name/cos:ListParts",
"name/cos:UploadPart",
"name/cos:CompleteMultipartUpload"
};
config.put("allowActions", allowActions);
/**
* condition 설정(필요한 경우)
//# 임시 키가 적용되는 조건. COS에서 지원하는 condition 및 condition 유형의 자세한 구성 규칙은 다음을 참고하십시오. https://cloud.tencent.com/document/product/436/71307
final String raw_policy = "{\\n" +
" \\"version\\":\\"2.0\\",\\n" +
" \\"statement\\":[\\n" +
" {\\n" +
" \\"effect\\":\\"allow\\",\\n" +
" \\"action\\":[\\n" +
" \\"name/cos:PutObject\\",\\n" +
" \\"name/cos:PostObject\\",\\n" +
" \\"name/cos:InitiateMultipartUpload\\",\\n" +
" \\"name/cos:ListMultipartUploads\\",\\n" +
" \\"name/cos:ListParts\\",\\n" +
" \\"name/cos:UploadPart\\",\\n" +
" \\"name/cos:CompleteMultipartUpload\\"\\n" +
" ],\\n" +
" \\"resource\\":[\\n" +
" \\"qcs::cos:ap-shanghai:uid/1250000000:examplebucket-1250000000/*\\"\\n" +
" ],\\n" +
" \\"condition\\": {\\n" +
" \\"ip_equal\\": {\\n" +
" \\"qcs:ip\\": [\\n" +
" \\"192.168.1.0/24\\",\\n" +
" \\"101.226.100.185\\",\\n" +
" \\"101.226.100.186\\"\\n" +
" ]\\n" +
" }\\n" +
" }\\n" +
" }\\n" +
" ]\\n" +
"}";

config.put("policy", raw_policy);
*/\t\t\t\t


Response response = CosStsClient.getCredential(config);
System.out.println(response.credentials.tmpSecretId);
System.out.println(response.credentials.tmpSecretKey);
System.out.println(response.credentials.sessionToken);
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("no valid secret !");
}
}
}

FAQ 및 답변

JSONObject 패키지 충돌로 인한 NoSuchMethodError

3.1.0 이상 버전을 사용합니다.

임시 키를 사용한 COS 액세스

COS API에서 임시 키를 사용해 COS 서비스에 액세스하는 경우, x-cos-security-token 필드를 통해 임시 sessionToken를 전달하고 임시 SecretId와 SecretKey로 서명을 컴퓨팅합니다.
임시 키를 사용하여 COS에 액세스하는 COS Java SDK 예시는 다음과 같습니다.
설명:
다음 예시 실행 전 Github 프로젝트에서 Java SDK 설치 패키지를 다운로드하십시오.
// github에서 제공하는 maven 통합 방법에 따라 cos xml java sdk 가져오기
import com.qcloud.cos.*;
import com.qcloud.cos.auth.*;
import com.qcloud.cos.exception.*;
import com.qcloud.cos.model.*;
import com.qcloud.cos.region.*;
public class Demo {
public static void main(String[] args) throws Exception {

// 사용자 기본 정보
String tmpSecretId = "COS_SECRETID"; // STS 인터페이스에서 반환하는 임시 SecretId로 변경
String tmpSecretKey = "COS_SECRETKEY"; // STS 인터페이스에서 반환하는 임시 SecretKey로 변경
String sessionToken = "Token"; // STS 인터페이스에서 반환하는 임시 Token으로 변경

// 1 사용자 자격 정보 초기화(secretId, secretKey)
COSCredentials cred = new BasicCOSCredentials(tmpSecretId, tmpSecretKey);
// 2. bucket 리전 설정. COS 리전에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/436/6224
ClientConfig clientConfig = new ClientConfig(new Region("ap-guangzhou"));
// 3 cos 클라이언트 생성
COSClient cosclient = new COSClient(cred, clientConfig);
// bucket 이름에는 반드시 appid를 포함
String bucketName = "examplebucket-1250000000";

String key = "exampleobject";
// object 업로드, 20M 이상의 파일은 해당 인터페이스를 사용해 업로드하는 것을 권장
File localFile = new File("src/test/resources/text.txt");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);

// x-cos-security-token header 필드 설정
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setSecurityToken(sessionToken);
putObjectRequest.setMetadata(objectMetadata);

try {
PutObjectResult putObjectResult = cosclient.putObject(putObjectRequest);
// 성공: putobjectResult에서 파일의 etag 반환
String etag = putObjectResult.getETag();
} catch (CosServiceException e) {
//실패 시 CosServiceException 팝업
e.printStackTrace();
} catch (CosClientException e) {
//실패 시 CosClientException 팝업
e.printStackTrace();
}

// 클라이언트 종료
cosclient.shutdown();

}
}
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"임시 키를 사용해 액세스 권한을 부여하는 경우, 반드시 업무 수요에 따라 최소 권한 부여를 원칙으로 권한을 부여해야 합니다. 직접 모든 리소스\"},{\"code\":1,\"text\":\"(resource:*)\"},{\"text\":\" 또는 모든 작업\"},{\"code\":1,\"text\":\"(action:*)\"},{\"text\":\"에 대한 권한을 부여하는 경우 권한 범위가 너무 커 데이터 보안에 대한 리스크가 발생할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"임시 키 신청 시 권한 범위를 지정하면 신청한 임시 키가 권한 범위 내에서만 동작할 수 있습니다. 예를 들어 임시 키를 신청할 때 examplebucket-1-1250000000 버킷에 파일을 업로드할 수 있는 권한 범위를 지정한 다음 적용된 키는 examplebucket-2-1250000000에 파일을 업로드\"},{\"b\":1,\"text\":\"할 수 없습니다\"},{\"text\":\". 또한 examplebucket-1-1250000000에서 파일을 다운로드\"},{\"b\":1,\"text\":\"할 수 없습니다\"},{\"text\":\".\"}],\"start\":false,\"type\":\"uli\"}],\"hintType\":\"alert\",\"type\":\"hint\"},{\"children\":[{\"text\":\"임시 키\"}],\"nodeId\":\".EC.9E.84.EC.8B.9C-.ED.82.A4\",\"type\":\"h2\"},{\"children\":[{\"children\":[{\"text\":\"임시 키(임시 액세스 자격 증명)\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1150/49452\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1150/49452\"},\"type\":\"ref\"},{\"text\":\"는 CAM 클라우드 API에서 제공하는 인터페이스를 통해 획득하는 권한이 부여된 키입니다.\\nCOS API는 임시 키를 사용해 서명을 컴퓨팅해 COS API 요청을 전송하는 데 사용합니다.\\nCOS API 요청은 임시 키를 사용해 서명 컴퓨팅 시, 다음 3개의 임시 키 인터페이스 반환 정보 획득에 사용하는 필드가 필요합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"TmpSecretId\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"TmpSecretKey\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"Token\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"임시 키 사용의 장점\"}],\"nodeId\":\".EC.9E.84.EC.8B.9C-.ED.82.A4-.EC.82.AC.EC.9A.A9.EC.9D.98-.EC.9E.A5.EC.A0.90\",\"type\":\"h2\"},{\"children\":[{\"text\":\"Web, iOS, Android에서 COS를 사용할 때, 고정 키를 사용해 서명을 컴퓨팅하는 경우 권한을 효과적으로 제어할 수 없을 뿐 아니라, 영구 키를 클라이언트 코드에 삽입하는 경우 커다란 유출 위험이 존재하게 됩니다. 임시 키 방식을 사용하면 권한 제어 문제를 편리하고 효과적으로 해결할 수 있습니다.\\n예를 들어, 임시 키 신청 과정에서 권한 정책 \"},{\"children\":[{\"text\":\"policy\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/30580\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/30580\"},\"type\":\"ref\"},{\"text\":\" 필드 설정을 통해 작업 및 리소스를 제한하고, 권한을 지정된 범위로 제한할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"COS API 권한 부여 정책과 관련해서는 다음을 참고하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"COS API 임시 키를 사용한 권한 부여 정책 가이드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/30580\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/30580\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"자주 볼 수 있는 시나리오에서의 임시 키를 사용한 권한 부여 정책 예시\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/30580#.E5.B8.B8.E8.A7.81.E5.9C.BA.E6.99.AF.E6.8E.88.E6.9D.83.E7.AD.96.E7.95.A5\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/30580#.E5.B8.B8.E8.A7.81.E5.9C.BA.E6.99.AF.E6.8E.88.E6.9D.83.E7.AD.96.E7.95.A5\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"임시 키 획득\"}],\"nodeId\":\".EC.9E.84.EC.8B.9C-.ED.82.A4-.ED.9A.8D.EB.93.9D\",\"type\":\"h2\"},{\"children\":[{\"text\":\"임시 키는 제공되는 \"},{\"children\":[{\"text\":\"COS STS SDK\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk\"},\"type\":\"ref\"},{\"text\":\" 방식을 통해 획득할 수 있으며, 직접 \"},{\"children\":[{\"text\":\"STS 클라우드 API\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1150/49452\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1150/49452\"},\"type\":\"ref\"},{\"text\":\" 요청 방식으로도 획득할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 예시에서는 Java SDK를 사용하였으며, GitHub에서 SDK 코드(버전)을 획득해야 합니다. 해당 SDK 버전을 찾을 수 없다는 안내가 표시되는 경우, GitHub에서 상응하는 버전의 SDK를 획득하였는지 확인하십시오.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"type\":\"hint\"},{\"children\":[{\"text\":\"COS STS SDK\"}],\"nodeId\":\"cos-sts-sdk\",\"type\":\"h3\"},{\"children\":[{\"text\":\"COS는 STS에 대한 SDK와 샘플을 제공합니다. 현재 Java, Nodejs, PHP, Python, Go 등 여러 가지 언어 샘플을 제공하고 있으며, 자세한 내용은 \"},{\"children\":[{\"text\":\"COS STS SDK\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오. 각 SDK별 사용 설명은 Github의 README와 예시를 참고하십시오. 각 언어의 GitHub 주소는 하기 표와 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"언어 유형\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"코드 설치 주소\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"코드 예시 주소\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Java\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설치 주소\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/java\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/java\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"예시 주소\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/java/src/test/java/com/tencent/cloud/CosStsClientTest.java\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/java/src/test/java/com/tencent/cloud/CosStsClientTest.java\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\".NET\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설치 주소\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/dotnet\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/dotnet\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"예시 주소\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/dotnet/demo/Program.cs\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/dotnet/demo/Program.cs\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Go\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설치 주소\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/go\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/go\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"예시 주소\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/go/example/sts_demo.go\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/go/example/sts_demo.go\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"NodeJS\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설치 주소\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/nodejs\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/nodejs\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"예시 주소\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/nodejs/demo/sts-server.js\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/nodejs/demo/sts-server.js\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"PHP\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설치 주소\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/php\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/php\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"예시 주소\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/php/demo/sts_test.php\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/php/demo/sts_test.php\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Python\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설치 주소\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/python\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/python\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"예시 주소\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/python/demo/sts_demo.py\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/python/demo/sts_demo.py\"},\"type\":\"ref\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" STS SDK는 STS 인터페이스 자체의 버전별 차이점을 차단하기 위해 반환 매개변수 구조가 STS 인터페이스와 완벽하게 일치하지 않습니다. 세부 사항은 \"},{\"children\":[{\"text\":\"Java SDK 문서\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/java\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/java\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"type\":\"hint\"},{\"children\":[{\"text\":\"Java SDK를 사용한다고 가정하고, 먼저 \"},{\"children\":[{\"text\":\"Java SDK\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/java\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk/tree/master/java\"},\"type\":\"ref\"},{\"text\":\"를 다운로드한 후 실행하여 다음 예시와 같이 임시 키를 획득합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"코드 예시\"}],\"nodeId\":\".EC.BD.94.EB.93.9C-.EC.98.88.EC.8B.9C\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"// github에서 제공하는 maven 통합 방법에 따라 java sts sdk 가져오기. 3.1.0 이상 버전 사용\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"public class Demo {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" public static void main(String[] args) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" TreeMap\\u003cString, Object\\u003e config = new TreeMap\\u003cString, Object\\u003e();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" try {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" //여기에서 SecretId와 SecretKey는 임시 키를 신청하기 위한 영구 ID(루트 계정, 서브 계정 등)를 나타내며, 서브 계정은 버킷 작업 권한이 있어야 합니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" String secretId = System.getenv(\\\"secretId\\\");//사용자 SecretId. 리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한 원칙을 따르는 것이 좋습니다. 서브 계정 키를 가져오는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/598/37140\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" String secretKey = System.getenv(\\\"secretKey\\\");//사용자 SecretKey. 리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한 원칙을 따르는 것이 좋습니다. 서브 계정 키를 가져오는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/598/37140\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // Tencent Cloud api 키 SecretId로 교체\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"secretId\\\", secretId);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // Tencent Cloud api 키 SecretKey로 교체\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"secretKey\\\", secretKey);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 도메인 설정: \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // Tencent Cloud cvm을 사용하는 경우 내부 도메인 이름 설정 가능\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" //config.put(\\\"host\\\", \\\"sts.internal.tencentcloudapi.com\\\");\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 임시 키의 유효 시간은 초 단위입니다. 기본값은 1800 초이며, 현재 루트 계정에서 최대 2 시간(7200 초), 서브 계정에서 최대 36시간(129600초)까지 설정 가능\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"durationSeconds\\\", 1800);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 사용자의 bucket으로 변경\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"bucket\\\", \\\"examplebucket-1250000000\\\");\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // bucket 소재 리전으로 변경\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"region\\\", \\\"ap-guangzhou\\\");\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 여기서 허용된 경로의 접두사로 바꾸면 자신의 웹 사이트의 사용자 로그인 상태에 따라 업로드가 허용된 구체적 경로를 판단할 수 있습니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 몇 가지 일반적인 접두사 인증 시나리오:\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 1. 모든 객체에 대한 액세스 허용: \\\"*\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 2. 지정된 객체에 대한 액세스 허용: \\\"a/a1.txt\\\", \\\"b/b1.txt\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 3. 지정된 접두사의 객체에 대한 액세스 허용: \\\"a*\\\", \\\"a/*\\\", \\\"b/*\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // '*'를 입력하면 사용자가 모든 리소스에 액세스하는 것을 허용하게 됩니다. 업무에 필요한 경우가 아니면 최소 권한 원칙에 따라 사용자에게 적합한 액세스 권한 범위를 부여하십시오.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"allowPrefixes\\\", new String[] {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"exampleobject\\\",\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"exampleobject2\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 키에 대한 권한 목록입니다. 이 임시 키에 필요한 권한을 여기에서 지정해야 합니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 간편 업로드, 폼 업로드 및 멀티파트 업로드 시에는 다음과 같은 권한이 필요합니다. 기타 권한 리스트는 다음을 참고하십시오. https://intl.cloud.tencent.com/document/product/436/30580\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" String[] allowActions = new String[] {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 간편 업로드\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 폼 업로드, 미니프로그램 업로드\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PostObject\\\",\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 멀티파트 업로드\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:InitiateMultipartUpload\\\",\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:ListMultipartUploads\\\",\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:ListParts\\\",\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:UploadPart\\\",\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:CompleteMultipartUpload\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"allowActions\\\", allowActions);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" /**\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" * condition 설정(필요한 경우)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" //# 임시 키가 적용되는 조건. COS에서 지원하는 condition 및 condition 유형의 자세한 구성 규칙은 다음을 참고하십시오. https://cloud.tencent.com/document/product/436/71307\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" final String raw_policy = \\\"{\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"version\\\\\\\":\\\\\\\"2.0\\\\\\\",\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"statement\\\\\\\":[\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" {\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"effect\\\\\\\":\\\\\\\"allow\\\\\\\",\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"action\\\\\\\":[\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"name/cos:PutObject\\\\\\\",\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"name/cos:PostObject\\\\\\\",\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"name/cos:InitiateMultipartUpload\\\\\\\",\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"name/cos:ListMultipartUploads\\\\\\\",\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"name/cos:ListParts\\\\\\\",\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"name/cos:UploadPart\\\\\\\",\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"name/cos:CompleteMultipartUpload\\\\\\\"\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" ],\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"resource\\\\\\\":[\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"qcs::cos:ap-shanghai:uid/1250000000:examplebucket-1250000000/*\\\\\\\"\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" ],\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"condition\\\\\\\": {\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"ip_equal\\\\\\\": {\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"qcs:ip\\\\\\\": [\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"192.168.1.0/24\\\\\\\",\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"101.226.100.185\\\\\\\",\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" \\\\\\\"101.226.100.186\\\\\\\"\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" ]\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" }\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" }\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" }\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\" ]\\\\n\\\" +\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"}\\\";\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"policy\\\", raw_policy);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" */\\t\\t\\t\\t\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Response response = CosStsClient.getCredential(config);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" System.out.println(response.credentials.tmpSecretId);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" System.out.println(response.credentials.tmpSecretKey);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" System.out.println(response.credentials.sessionToken);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" } catch (Exception e) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" e.printStackTrace();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw new IllegalArgumentException(\\\"no valid secret !\\\");\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\"}],\"language\":\"java\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"FAQ 및 답변\"}],\"nodeId\":\"faq-.EB.B0.8F-.EB.8B.B5.EB.B3.80\",\"type\":\"h4\"},{\"children\":[{\"text\":\"JSONObject 패키지 충돌로 인한 NoSuchMethodError\"}],\"nodeId\":\"jsonobject-.ED.8C.A8.ED.82.A4.EC.A7.80-.EC.B6.A9.EB.8F.8C.EB.A1.9C-.EC.9D.B8.ED.95.9C-nosuchmethoderror\",\"type\":\"h4\"},{\"children\":[{\"text\":\"3.1.0 이상 버전을 사용합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"임시 키를 사용한 COS 액세스\"}],\"nodeId\":\".EC.9E.84.EC.8B.9C-.ED.82.A4.EB.A5.BC-.EC.82.AC.EC.9A.A9.ED.95.9C-cos-.EC.95.A1.EC.84.B8.EC.8A.A4\",\"type\":\"h3\"},{\"children\":[{\"text\":\" COS API에서 임시 키를 사용해 COS 서비스에 액세스하는 경우, x-cos-security-token 필드를 통해 임시 sessionToken를 전달하고 임시 SecretId와 SecretKey로 서명을 컴퓨팅합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"임시 키를 사용하여 COS에 액세스하는 COS Java SDK 예시는 다음과 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 다음 예시 실행 전 \"},{\"children\":[{\"text\":\"Github 프로젝트\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-java-sdk-v5\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-java-sdk-v5\"},\"type\":\"ref\"},{\"text\":\"에서 Java SDK 설치 패키지를 다운로드하십시오.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"children\":[{\"text\":\"// github에서 제공하는 maven 통합 방법에 따라 cos xml java sdk 가져오기\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.qcloud.cos.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.qcloud.cos.auth.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.qcloud.cos.exception.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.qcloud.cos.model.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.qcloud.cos.region.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"public class Demo {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" public static void main(String[] args) throws Exception {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 사용자 기본 정보\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" String tmpSecretId = \\\"COS_SECRETID\\\"; // STS 인터페이스에서 반환하는 임시 SecretId로 변경 \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" String tmpSecretKey = \\\"COS_SECRETKEY\\\"; // STS 인터페이스에서 반환하는 임시 SecretKey로 변경\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" String sessionToken = \\\"Token\\\"; // STS 인터페이스에서 반환하는 임시 Token으로 변경\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 1 사용자 자격 정보 초기화(secretId, secretKey)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" COSCredentials cred = new BasicCOSCredentials(tmpSecretId, tmpSecretKey);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 2. bucket 리전 설정. COS 리전에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/436/6224\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" ClientConfig clientConfig = new ClientConfig(new Region(\\\"ap-guangzhou\\\"));\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 3 cos 클라이언트 생성\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" COSClient cosclient = new COSClient(cred, clientConfig);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // bucket 이름에는 반드시 appid를 포함\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" String bucketName = \\\"examplebucket-1250000000\\\";\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" String key = \\\"exampleobject\\\";\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // object 업로드, 20M 이상의 파일은 해당 인터페이스를 사용해 업로드하는 것을 권장\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" File localFile = new File(\\\"src/test/resources/text.txt\\\");\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // x-cos-security-token header 필드 설정\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" ObjectMetadata objectMetadata = new ObjectMetadata();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" objectMetadata.setSecurityToken(sessionToken);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" putObjectRequest.setMetadata(objectMetadata);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" try {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" PutObjectResult putObjectResult = cosclient.putObject(putObjectRequest);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 성공: putobjectResult에서 파일의 etag 반환\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" String etag = putObjectResult.getETag();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" } catch (CosServiceException e) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" //실패 시 CosServiceException 팝업\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" e.printStackTrace();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" } catch (CosClientException e) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" //실패 시 CosClientException 팝업\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" e.printStackTrace();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 클라이언트 종료\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" cosclient.shutdown();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\"}],\"language\":\"java\",\"type\":\"code-block\"}]"}},"18740":{"categoryId":436,"weight":50,"type":"page","extension":"","pid":32969,"id":18740,"lang":"ko","title":"COS를 Druid의 Deep storage로 사용","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:12","recentReleaseTime":"2019-12-06 19:34:12","content":{"title":"COS를 Druid의 Deep storage로 사용","body":"

환경 종속

HADOOP-COS와 Hadoop-COS-Java-SDK(HADOOP-COS의 dep 디렉터리 안에 포함)
Druid 버전: Druid-0.12.1.

다운로드 및 설치

HADOOP-COS 다운로드

운영사 Github에서 HADOOP-COS를 다운로드하십시오.

HADOOP-COS 설치

Druid가 COS를 Deep Storage로 사용하려면 Druid-hdfs-extension이 필요합니다.\nHADOOP-COS를 다운로드한 후 dep 디렉터리의 hadoop-cos-2.x.x.jar 버전을 Druid의 설치 경로인 extensions/druid-hdfs-storagehadoop-dependencies/hadoop-client/2.x.x에 복사합니다. Druid가 HDFS plugin을 사용하여 COS에 액세스하기 때문에 선택한 버전이 Druid의 HDFS plugin 버전과 일치해야 합니다.

사용 방법

수정 설정

1. Druid 설치 경로인 conf/druid/_common/common.runtime.properties 파일을 수정합니다. hdfs의 extension을 druid.extensions.loadList에 추가합니다. hdfs를 Druid의 deep storage로 지정하고 경로는 cosn 경로로 작성합니다.
properties
druid.extensions.loadList=["druid-hdfs-storage"]
druid.storage.type=hdfs
druid.storage.storageDirectory=cosn://bucket-appid/<druid-path>
2. conf/druid/_common/ 디렉터리에 hdfs의 구성 파일 hdfs-site.xml을 새로 만들고 COS의 키 정보 등을 작성합니다.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.cosn.userinfo.secretId</name>
<value>xxxxxxxxxxxxxxxxxxxxxxx</value>
</property>
<property>
<name>fs.cosn.userinfo.secretKey</name>
<value>xxxxxxxxxxxxxxx</value>
</property>
<property>
<name>fs.cosn.impl</name>
<value>org.apache.hadoop.fs.CosFileSystem</value>
</property>
<property>
<name>fs.cosn.userinfo.region</name>
<value>ap-xxxx</value>
</property>
<property>
<name>fs.cosn.tmp.dir</name>
<value>/tmp/hadoop_cos</value>
</property>
</configuration>
위에서 설정한 지원 항목은 HADOOP-COS 공식 홈페이지의 문서 설명과 동일하며 자세한 내용은 Hadoop 툴 문서를 참조하십시오.

사용하기

Druid 프로세스에 따라 실행하면 Druid 데이터가 COS에 로딩됩니다.
","recentReleaseTime":"2024-06-24 16:53:18","slate":"[{\"children\":[{\"text\":\"환경 종속\"}],\"nodeId\":\".ED.99.98.EA.B2.BD-.EC.A2.85.EC.86.8D\",\"type\":\"h2\"},{\"children\":[{\"children\":[{\"text\":\"HADOOP-COS\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/hadoop-cos\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/hadoop-cos\"},\"type\":\"ref\"},{\"text\":\"와 Hadoop-COS-Java-SDK(HADOOP-COS의 dep 디렉터리 안에 포함)\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"Druid 버전: Druid-0.12.1.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"다운로드 및 설치\"}],\"nodeId\":\".EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C-.EB.B0.8F-.EC.84.A4.EC.B9.98\",\"type\":\"h2\"},{\"children\":[{\"text\":\"HADOOP-COS 다운로드\"}],\"nodeId\":\"hadoop-cos-.EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"운영사 Github에서 \"},{\"children\":[{\"text\":\"HADOOP-COS\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/hadoop-cos\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/hadoop-cos\"},\"type\":\"ref\"},{\"text\":\"를 다운로드하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"HADOOP-COS 설치\"}],\"nodeId\":\"hadoop-cos-.EC.84.A4.EC.B9.98\",\"type\":\"h4\"},{\"children\":[{\"text\":\"Druid가 COS를 Deep Storage로 사용하려면 Druid-hdfs-extension이 필요합니다.\\nHADOOP-COS를 다운로드한 후 dep 디렉터리의 \"},{\"code\":1,\"text\":\"hadoop-cos-2.x.x.jar\"},{\"text\":\" 버전을 Druid의 설치 경로인 \"},{\"code\":1,\"text\":\"extensions/druid-hdfs-storage\"},{\"text\":\"와 \"},{\"code\":1,\"text\":\"hadoop-dependencies/hadoop-client/2.x.x\"},{\"text\":\"에 복사합니다. Druid가 HDFS plugin을 사용하여 COS에 액세스하기 때문에 선택한 버전이 Druid의 HDFS plugin 버전과 일치해야 합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"사용 방법\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9-.EB.B0.A9.EB.B2.95\",\"type\":\"h2\"},{\"children\":[{\"text\":\"수정 설정\"}],\"nodeId\":\".EC.88.98.EC.A0.95-.EC.84.A4.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"text\":\"Druid 설치 경로인 \"},{\"code\":1,\"text\":\"conf/druid/_common/common.runtime.properties\"},{\"text\":\" 파일을 수정합니다. hdfs의 extension을 \"},{\"code\":1,\"text\":\"druid.extensions.loadList\"},{\"text\":\"에 추가합니다. hdfs를 Druid의 deep storage로 지정하고 경로는 cosn 경로로 작성합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"properties\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"druid.extensions.loadList=[\\\"druid-hdfs-storage\\\"]\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"druid.storage.type=hdfs\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"druid.storage.storageDirectory=cosn://bucket-appid/\\u003cdruid-path\\u003e\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"shell\",\"type\":\"code-block\"},{\"children\":[{\"code\":1,\"text\":\"conf/druid/_common/\"},{\"text\":\" 디렉터리에 hdfs의 구성 파일 hdfs-site.xml을 새로 만들고 COS의 키 정보 등을 작성합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"\\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c?xml-stylesheet type=\\\"text/xsl\\\" href=\\\"configuration.xsl\\\"?\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c!--\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" you may not use this file except in compliance with the License.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" You may obtain a copy of the License at\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" http://www.apache.org/licenses/LICENSE-2.0\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Unless required by applicable law or agreed to in writing, software\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" See the License for the specific language governing permissions and\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" limitations under the License. See accompanying LICENSE file.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" --\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003c!-- Put site-specific property overrides in this file. --\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cconfiguration\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cproperty\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cname\\u003efs.cosn.userinfo.secretId\\u003c/name\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cvalue\\u003exxxxxxxxxxxxxxxxxxxxxxx\\u003c/value\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003c/property\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cproperty\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cname\\u003efs.cosn.userinfo.secretKey\\u003c/name\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cvalue\\u003exxxxxxxxxxxxxxx\\u003c/value\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003c/property\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cproperty\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cname\\u003efs.cosn.impl\\u003c/name\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cvalue\\u003eorg.apache.hadoop.fs.CosFileSystem\\u003c/value\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003c/property\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cproperty\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cname\\u003efs.cosn.userinfo.region\\u003c/name\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cvalue\\u003eap-xxxx\\u003c/value\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003c/property\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cproperty\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cname\\u003efs.cosn.tmp.dir\\u003c/name\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cvalue\\u003e/tmp/hadoop_cos\\u003c/value\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003c/property\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/configuration\\u003e\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"xml\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"위에서 설정한 지원 항목은 HADOOP-COS 공식 홈페이지의 문서 설명과 동일하며 자세한 내용은 \"},{\"children\":[{\"text\":\"Hadoop 툴\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/6884\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/6884\"},\"type\":\"ref\"},{\"text\":\" 문서를 참조하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"사용하기\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9.ED.95.98.EA.B8.B0\",\"type\":\"h4\"},{\"children\":[{\"text\":\"Druid 프로세스에 따라 실행하면 Druid 데이터가 COS에 로딩됩니다.\"}],\"type\":\"p\"}]"}},"30580":{"categoryId":436,"weight":59,"type":"page","extension":"","pid":12473,"id":30580,"lang":"ko","title":"COS API 권한 부여 정책 사용 가이드","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:11","recentReleaseTime":"2019-12-06 19:34:11","content":{"title":"COS API 권한 부여 정책 사용 가이드","body":"
주의:
서브 계정 또는 협업 파트너에게 API 작업 권한 부여 시, 반드시 작업 필요에 따라 최소 권한의 원칙으로 권한을 부여해야 합니다. 서브 계정 또는 협업 파트너에게 직접 모든 리소스(resource:*) 또는 모든 작업(action:*) 권한을 부여하는 경우 권한 범위가 너무 커 데이터 보안 리스크가 발생할 수 있습니다.

개요

Cloud Object Storage(COS)에서 임시 키 서비스를 사용할 때 각 COS API 작업 별로 서로 다른 작업 권한이 필요하며, 동시에 1개 작업 또는 일련의 작업을 지정할 수 있습니다.
COS API 권한 부여 정책(policy)은 일종의 JSON 문자열입니다. 예를 들어, APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사가 doc인 업로드 작업(간편 업로드, 폼 업로드, 멀티파트 업로드 등의 작업 포함) 권한을 부여한 경우, 경로 접두사가 doc2인 다운로드 작업 권한의 정책 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [{
"action": [
//간편 업로드 작업
"name/cos:PutObject",
//폼을 사용한 객체 업로드
"name/cos:PostObject",
//멀티파트 업로드: 파트 초기화 작업
"name/cos:InitiateMultipartUpload",
//멀티파트 업로드: List에서 진행 중인 멀티파트 업로드
"name/cos:ListMultipartUploads",
//멀티파트 업로드: List에서 업로드 완료한 파트 작업
"name/cos:ListParts",
//멀티파트 업로드: 멀티파트 업로드 작업
"name/cos:UploadPart",
//멀티파트 업로드: 모든 멀티파트 업로드 작업 완료
"name/cos:CompleteMultipartUpload",
//멀티파트 업로드 작업 취소
"name/cos:AbortMultipartUpload"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
},
{
"action": [
//다운로드 작업
"name/cos:GetObject"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc2/*"
]
}
]
}

권한 부여 정책(policy) 요소 설명

이름
설명
version
정책 구문 버전으로, 기본값은 2.0입니다.
effect
allow(허용), deny(명시적 거부) 두 가지 상태가 있습니다.
resource
모든 리소스, 지정된 경로 접두사가 있는 리소스, 지정된 절대 경로의 리소스 또는 이들의 조합이 될 수 있는 권한 부여된 작업의 특정 데이터입니다.
참고: 경로가 중국어인 경우 중국어 입력을 그대로 유지하십시오. 예: examplebucket-1250000000/폴더/파일명.txt.
action
여기에서는 COS API를 지칭하며, 필요에 따라 1개 또는 일련의 작업 조합이나 모든 작업(*)을 지정합니다. 예: name/cos:GetService, 영어 대소문자 구분에 유의하십시오.
condition
규제 조건으로, 입력하지 않아도 됩니다. 자세한 설명은 condition을 참고하십시오.
각 COS API 별 권한 정책 설정 예시는 다음과 같습니다.

Service API

버킷 리스트 조회

API는 GET Service이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetService로 설정하고 resource는 *로 설정합니다.

예시

버킷 리스트 조회 권한을 부여하는 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:GetService"
],
"effect": "allow",
"resource": [
"*"
]
}
]
}

Bucket API

Bucket API 정책의 resource는 다음과 같을 수 있습니다.
모든 리전의 버킷에 대한 작업\n정책의 resource를 *로 설정하며, 해당 정책에서 한정하는 리소스 범위의 권한 범위가 너무 커 데이터 보안 리스크가 발생할 수 있으므로 설정에 유의하십시오.
특정 리전 버킷의 작업만 허용\nAPPID가 1250000000이고, 리전이 베이징(ap-beijing)인 버킷 examplebucket-1250000000의 작업만 허용하는 경우, 정책의 resource는 qcs::cos:ap-beijing:uid/1250000000:*가 됩니다.
특정 리전의 특정 이름 버킷 작업만 허용\nAPPID가 1250000000이고, 리전이 ap-beijing이며, 이름이 examplebucket-1250000000인 버킷의 작업만 허용하는 경우, 정책의 resource는 qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/*가 됩니다.
Bucket API 정책의 action은 작업에 따라 값이 달라집니다. 다음은 Bucket API 권한 부여 정책에 관한 예시로, 기타 Bucket API 권한 부여 정책에 참고할 수 있습니다.

버킷 생성

API는 PUT Bucket이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PutBucket으로 설정합니다.

예시

사용자 APPID 1250000000에 버킷 생성 권한을 부여하고, 리전이 베이징 리전이며 버킷 이름이 examplebucket-1250000000인 버킷을 생성할 경우 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:PutBucket"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}
설명:
버킷 이름은 이름 생성 규칙에 부합해야 하며, 자세한 내용은 버킷 이름 생성 규칙을 참고하십시오.

버킷 및 해당 권한 인덱스

API는 HEAD Bucket이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:HeadBucket으로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷에 대한 인덱스 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:HeadBucket"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}

객체 리스트 쿼리

API는 GET Bucket이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetBucket으로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 객체 리스트 조회 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:GetBucket"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}

버킷 삭제

API는 Delete Bucket이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:DeleteBucket으로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷에 대한 삭제 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:DeleteBucket"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}

버킷 ACL 설정

API는 Put Bucket ACL이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PutBucketACL로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 ACL 설정 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:PutBucketACL"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}

버킷 ACL 조회

API는 GET Bucket acl이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetBucketACL로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 ACL 획득 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:GetBucketACL"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}

크로스 도메인 구성 설정

API는 PUT Bucket cors이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PutBucketCORS로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 크로스 도메인 구성 설정 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:PutBucketCORS"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}

크로스 도메인 설정 조회

API는 GET Bucket cors이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetBucketCORS로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 크로스 도메인 설정 조회 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:GetBucketCORS"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}

크로스 도메인 설정 삭제

API는 DELETE Bucket cors이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:DeleteBucketCORS로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 크로스 도메인 설정 삭제 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:DeleteBucketCORS"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}

라이프사이클 설정

API는 PUT Bucket lifecycle이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PutBucketLifecycle로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 라이프사이클 설정 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:PutBucketLifecycle"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}

라이프사이클 조회

API는 GET Bucket lifecycle이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetBucketLifecycle로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 라이프사이클 설정 조회 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:GetBucketLifecycle"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}

라이프사이클 삭제

API는 DELETE Bucket lifecycle이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:DeleteBucketLifecycle로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 라이프사이클 설정 삭제 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:DeleteBucketLifecycle"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}

Object API

Object API 정책의 resource는 다음과 같을 수 있습니다.
모든 객체에 대한 작업을 허용할 경우 정책의 resource를 *로 설정합니다.
특정 버킷의 모든 객체만 작업할 수 있도록 설정하는 경우, 즉 APPID가 1250000000이고, 리전이 ap-beijing이며, 이름이 examplebucket-1250000000인 버킷의 모든 객체의 작업만 허용하는 경우, 정책의 resource는 qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/*가 됩니다.
특정 버킷의 특정 경로 접두사의 모든 객체 객체만 작업할 수 있도록 설정하는 경우, 즉 APPID가 1250000000이고, 리전이 ap-beijing이며, 이름이 examplebucket-1250000000인 버킷의 경로 접두사가 doc인 모든 객체의 작업만 허용하는 경우, 정책의 resource는 qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*가 됩니다.
특정 절대 경로의 객체만 작업할 수 있도록 설정하는 경우, 즉 APPID가 1250000000이고, 리전이 ap-beijing이며, 이름이 examplebucket-1250000000인 버킷의 절대 경로가 doc/audio.mp3인 객체의 작업만 허용하는 경우, 정책의 resource는 qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/audio.mp3가 됩니다.
Object API 정책의 action은 작업에 따라 값이 달라지며, 모든 Object API 권한 부여 정책은 다음과 같습니다.

객체 간편 업로드

API는 PUT Object이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PutObject로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc에서의 간편 업로드 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:PutObject"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
}
]
}

멀티파트 업로드

멀티파트 업로드에는 Initiate Multipart Upload, List Multipart Uploads, List Parts, Upload Part, Complete Multipart Upload, Abort Multipart Upload가 포함되며, 해당 작업 권한을 부여할 경우 정책의 action을 "name/cos:InitiateMultipartUpload","name/cos:ListMultipartUploads","name/cos:ListParts","name/cos:UploadPart","name/cos:CompleteMultipartUpload","name/cos:AbortMultipartUpload"의 집합으로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc에서 멀티파트 업로드 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:InitiateMultipartUpload",
"name/cos:ListMultipartUploads",
"name/cos:ListParts",
"name/cos:UploadPart",
"name/cos:CompleteMultipartUpload",
"name/cos:AbortMultipartUpload"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
}
]
}

멀티파트 업로드 조회

버킷의 현재 멀티파트 업로드 중인 정보를 조회하며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:ListMultipartUploads로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 현재 멀티파트 업로드 중인 정보에 대한 조회 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:ListMultipartUploads"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/"
]
}
]
}

HTML 양식을 사용한 객체 업로드

API는 POST Object이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PostObject로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc에서 POST 업로드 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:PostObject"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
}
]
}

객체 추가 업로드

API는 Append Object이며, 해당 작업 권한을 부여할 경우 정책의 action은 name/cos:AppendObject입니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc에서 추가 업로드 작업 권한을 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:AppendObject"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
}
]
}

객체 메타데이터 쿼리

API는 HEAD Object이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:HeadObject로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc의 객체 조회 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:HeadObject"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
}
]
}

객체 다운로드

API는 GET Object이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetObject로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc의 객체 다운로드 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:GetObject"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
}
]
}

객체 복사

API는 Put Object Copy이며, 해당 작업 권한을 부여할 경우 정책의 타깃 객체의 action을 name/cos:PutObject로 설정하고, 원본 객체의 action을 name/cos:GetObject로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc와 경로 접두사 doc2 간의 멀티파트 복사 작업 권한을 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:PutObject"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
},
{
"action": [
"name/cos:GetObject"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc2/*"
]
}
]
}
이 중에서, "qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc2/*"는 원본 객체입니다.

멀티파트 복사

API는 Upload Part - Copy이며, 해당 작업 권한을 부여할 경우 정책의 타깃 객체의 action은 "name/cos:InitiateMultipartUpload","name/cos:ListMultipartUploads","name/cos:ListParts","name/cos:PutObject","name/cos:CompleteMultipartUpload","name/cos:AbortMultipartUpload"의 집합으로 설정하고, 원본 객체의 action은 name/cos:GetObject로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc와 경로 접두사 doc2 간의 멀티파트 복사 작업 권한을 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:InitiateMultipartUpload",
"name/cos:ListMultipartUploads",
"name/cos:ListParts",
"name/cos:PutObject",
"name/cos:CompleteMultipartUpload",
"name/cos:AbortMultipartUpload"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
},
{
"action": [
"name/cos:GetObject"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc2/*"
]
}
]
}
이 중에서, "qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc2/*"는 원본 객체입니다.

객체 ACL 설정

API는 Put Object ACL이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PutObjectACL로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc의 객체 ACL 설정 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:PutObjectACL"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
}
]
}

객체 ACL 조회

API는 Get Object ACL이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetObjectACL로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc의 객체 ACL 조회 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:GetObjectACL"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
}
]
}

CORS 구성 확인

API는 OPTIONS Object이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:OptionsObject로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc에서 Options 요청 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:OptionsObject"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
}
]
}

아카이브된 객체 복구

API는 Post Object Restore이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PostObjectRestore로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc에서 보관 객체 복구 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:PostObjectRestore"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"
]
}
]
}

단일 객체 삭제

API는 DELETE Object이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:DeleteObject로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 audio.mp3 객체에 대한 삭제 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:DeleteObject"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/audio.mp3"
]
}
]
}

다수의 객체 삭제

API는 DELETE Multiple Objects이며, 해당 작업 권한을 부여할 경우 정책의 actionname/cos:DeleteObject로 설정합니다.

예시

APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 audio.mp3와 video.mp4 두 가지 객체에 대한 일괄 삭제 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:DeleteObject"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/audio.mp3",
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/video.mp4"
]
}
]
}

일반적인 시나리오 권한 부여 정책

모든 리소스에 대한 완전한 읽기 권한 부여

모든 리소스에 대한 완전한 읽기 권한을 부여하는 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"*"
],
"effect": "allow",
"resource": [
"*"
]
}
]
}

모든 리소스에 대한 읽기 전용 권한 부여

모든 리소스에 대한 읽기 전용 권한을 부여하는 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"name/cos:HeadObject",
"name/cos:GetObject",
"name/cos:GetBucket",
"name/cos:OptionsObject"
],
"effect": "allow",
"resource": [
"*"
]
}
]
}

특정 경로 접두사에 대한 읽기 권한 부여

사용자에게 examplebucket-1250000000 버킷의 경로 접두사 doc 아래의 파일만 액세스할 수 있고 다른 경로의 파일은 작업할 수 없도록 권한을 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"action": [
"*"
],
"effect": "allow",
"resource": [
"qcs::cos:ap-shanghai:uid/1250000000:examplebucket-1250000000/doc/*"
]
}
]
}

","recentReleaseTime":"2025-11-19 11:50:28","slate":"[{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"ED3fuR85I7N8HOS1YfKYz\"},{\"children\":[{\"text\":\" 서브 계정 또는 협업 파트너에게 API 작업 권한 부여 시, 반드시 작업 필요에 따라 최소 권한의 원칙으로 권한을 부여해야 합니다. 서브 계정 또는 협업 파트너에게 직접 모든 리소스\"},{\"code\":1,\"text\":\"(resource:*)\"},{\"text\":\" 또는 모든 작업\"},{\"code\":1,\"text\":\"(action:*)\"},{\"text\":\" 권한을 부여하는 경우 권한 범위가 너무 커 데이터 보안 리스크가 발생할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"KZdxpnbN7VZjK4Y3E0BYL\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"e-v0efME5XTKW2S-ttsIC\"},{\"children\":[{\"text\":\"개요\"}],\"nodeId\":\".EA.B0.9C.EC.9A.94\",\"type\":\"h2\",\"id\":\"KPd99b36z-3-EzmLSfUwD\"},{\"children\":[{\"text\":\"Cloud Object Storage(COS)에서 임시 키 서비스를 사용할 때 각 COS API 작업 별로 서로 다른 작업 권한이 필요하며, 동시에 1개 작업 또는 일련의 작업을 지정할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"StIAEqoBFxD1Gli-4Hybo\"},{\"children\":[{\"text\":\"COS API 권한 부여 정책(policy)은 일종의 JSON 문자열입니다. 예를 들어, APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사가 doc인 업로드 작업(간편 업로드, 폼 업로드, 멀티파트 업로드 등의 작업 포함) 권한을 부여한 경우, 경로 접두사가 doc2인 다운로드 작업 권한의 정책 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"zSauULTiVcbbVo9GZdpms\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"DpUqQNtac6mGLEqjH7Nlu\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"SZT2HRamm411UjEmUH5I-\"},{\"children\":[{\"text\":\" \\\"statement\\\": [{\"}],\"type\":\"code-line\",\"id\":\"Bf7lXfXnPP6YnMa-Q-KHr\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"4UVwzFqdBQbJIC5hbKSDv\"},{\"children\":[{\"text\":\" //간편 업로드 작업 \"}],\"type\":\"code-line\",\"id\":\"OMRGSR2Jk6ooB9oM388va\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"type\":\"code-line\",\"id\":\"s_JYrbat9JjtDjx0Cdpr6\"},{\"children\":[{\"text\":\" //폼을 사용한 객체 업로드 \"}],\"type\":\"code-line\",\"id\":\"YvmHx4PEzC0fvv4kNEEDV\"},{\"children\":[{\"text\":\" \\\"name/cos:PostObject\\\",\"}],\"type\":\"code-line\",\"id\":\"a3ApZHGJOIsWwqxBjbCB5\"},{\"children\":[{\"text\":\" //멀티파트 업로드: 파트 초기화 작업 \"}],\"type\":\"code-line\",\"id\":\"PsKERRGnWccUPTGmn_N23\"},{\"children\":[{\"text\":\" \\\"name/cos:InitiateMultipartUpload\\\",\"}],\"type\":\"code-line\",\"id\":\"PVzzsSM4Mk-xjey6rCVsx\"},{\"children\":[{\"text\":\" //멀티파트 업로드: List에서 진행 중인 멀티파트 업로드\"}],\"type\":\"code-line\",\"id\":\"-bYd2rDBRSa-Upp5fUx-A\"},{\"children\":[{\"text\":\" \\\"name/cos:ListMultipartUploads\\\",\"}],\"type\":\"code-line\",\"id\":\"oBJe3tGihvSihZh6KngJU\"},{\"children\":[{\"text\":\" //멀티파트 업로드: List에서 업로드 완료한 파트 작업 \"}],\"type\":\"code-line\",\"id\":\"POuo5AIVnTB728I9qQ7S8\"},{\"children\":[{\"text\":\" \\\"name/cos:ListParts\\\",\"}],\"type\":\"code-line\",\"id\":\"GrQw1Q-HxQ9zLPQHLI9nu\"},{\"children\":[{\"text\":\" //멀티파트 업로드: 멀티파트 업로드 작업 \"}],\"type\":\"code-line\",\"id\":\"tKNHuAfFcpLokhZ9azXxa\"},{\"children\":[{\"text\":\" \\\"name/cos:UploadPart\\\",\"}],\"type\":\"code-line\",\"id\":\"2vYbQhADPQBKf6YDRrokw\"},{\"children\":[{\"text\":\" //멀티파트 업로드: 모든 멀티파트 업로드 작업 완료 \"}],\"type\":\"code-line\",\"id\":\"ivKqqJPYNaDWH06LBmxTt\"},{\"children\":[{\"text\":\" \\\"name/cos:CompleteMultipartUpload\\\",\"}],\"type\":\"code-line\",\"id\":\"9QWN7dkl8EBz5CxglexEP\"},{\"children\":[{\"text\":\" //멀티파트 업로드 작업 취소 \"}],\"type\":\"code-line\",\"id\":\"S0y30gpWbMvS6LRfAIHBE\"},{\"children\":[{\"text\":\" \\\"name/cos:AbortMultipartUpload\\\"\"}],\"type\":\"code-line\",\"id\":\"4IBQFo442ofhbMNt0J-4W\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"0TWJGtayvwPU5tP1WilCp\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"faruPpmn1j3E3sYIhdmJV\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"IXFMgl6mevWB2wIJAB1_0\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"XfDRjzisS9HdeCQb3LGif\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"lk9jNSigIwYeTAH7DGR6L\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\",\"id\":\"LTu9N-nETCQoc3LgvGCBL\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"zNm1LipeIPWOZ5eg5NhQ1\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"H39A3ATsiwEO3l6Ogo6Cb\"},{\"children\":[{\"text\":\" //다운로드 작업 \"}],\"type\":\"code-line\",\"id\":\"SCl8l1CcwAvYAXyZNj-eu\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"type\":\"code-line\",\"id\":\"rwzbByumxa-JzmJ0V9-1e\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"bjCIozmHudl7Y6SM3gQYC\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"_-QgTVXNHPtt926T_vu2V\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"5V4Iw7hVwEY4sSAy3Q2LD\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc2/*\\\"\"}],\"type\":\"code-line\",\"id\":\"RtE9I2MvQWOzUaYEZR6nD\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"PixGlVtVcxi0uDhk_mnQI\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"SuQpK0SXEKG0KCZwh5uIB\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"_QDmWq8rbOth5--MlUO_X\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"Ezt82HIj3gFfeO-ZJzP7F\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"wW2fMQRUff3_e-Ni1T8UC\",\"autoWrap\":false},{\"children\":[{\"text\":\"권한 부여 정책(policy) 요소 설명\"}],\"nodeId\":\".EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC-.EC.A0.95.EC.B1.85(policy)-.EC.9A.94.EC.86.8C-.EC.84.A4.EB.AA.85\",\"type\":\"h2\",\"id\":\"jq2vDUSKiQ9fnxqCcu16N\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"이름\"}],\"type\":\"p\",\"id\":\"vDbwsAKMgrs4EV0Cuj2K-\"}],\"type\":\"cell\",\"id\":\"7_TJCNofGue3En9IBJG9Q\"},{\"children\":[{\"children\":[{\"text\":\"설명\"}],\"type\":\"p\",\"id\":\"2CLRkM73FdcjjlwHMyMd1\"}],\"type\":\"cell\",\"id\":\"GgdMUr1mcJxhPANvLnLrL\"}],\"type\":\"row\",\"id\":\"a6rLnsZwU6eM2ZuyB4man\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"version\"}],\"type\":\"p\",\"id\":\"V-x-lHj2hWQXpMojF68Ac\"}],\"type\":\"p\",\"id\":\"82QEY-Fbwxx_BrOPAQANi\"}],\"type\":\"cell\",\"id\":\"UcSQKZ_-GavbdrTdheivr\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"정책 구문 버전으로, 기본값은 2.0입니다.\"}],\"type\":\"p\",\"id\":\"QRJ8hLvVtCYjVYcNNt6TI\"}],\"type\":\"p\",\"id\":\"hOBdUL59Bz7eCcfDYn9-F\"}],\"type\":\"cell\",\"id\":\"H47kfNlTS_7wUF3dhmPuc\"}],\"type\":\"row\",\"id\":\"Sina1hGFIAw3yW6ttAy3e\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"effect\"}],\"type\":\"p\",\"id\":\"Tly8GPuffepavXQs2z9H0\"}],\"type\":\"p\",\"id\":\"kBG74vTnykqlhYukYahCN\"}],\"type\":\"cell\",\"id\":\"vdhskPsfedLdT0aHIEjYD\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"allow(허용), deny(명시적 거부) 두 가지 상태가 있습니다.\"}],\"type\":\"p\",\"id\":\"JvV8uK9Yj9tLfG_r3mZLA\"}],\"type\":\"p\",\"id\":\"fHt9l7FoGe-_d6n0XWQP-\"}],\"type\":\"cell\",\"id\":\"dUTFp1yDstIj0I1aa8JyX\"}],\"type\":\"row\",\"id\":\"E-w6ZYJecxFTvYYMJItS2\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"resource\"}],\"type\":\"p\",\"id\":\"mgYJSrevy57Z0STA1Eiqd\"}],\"type\":\"p\",\"id\":\"lDJD9YCsZhN4asA906th6\"}],\"type\":\"cell\",\"id\":\"uETHKkcIKviJ6hLjTpqD5\"},{\"children\":[{\"children\":[{\"text\":\"모든 리소스, 지정된 경로 접두사가 있는 리소스, 지정된 절대 경로의 리소스 또는 이들의 조합이 될 수 있는 권한 부여된 작업의 특정 데이터입니다.\"}],\"type\":\"p\",\"id\":\"7kjbfAP1U3NgOhRyYlR9Y\"},{\"type\":\"p\",\"id\":\"wRKgzbCBmMd1M3kSlLdIc\",\"children\":[{\"text\":\"참고: \",\"b\":1},{\"text\":\"경로가 중국어인 경우 중국어 입력을 그대로 유지하십시오. 예: \"},{\"code\":1,\"text\":\"examplebucket-1250000000/폴더/파일명.txt\"},{\"text\":\".\"}]}],\"type\":\"cell\",\"id\":\"LdXq8WkL9r5FgOpYXJ5Wu\"}],\"type\":\"row\",\"id\":\"bUurzkihHQq90BhFeliUS\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"action\"}],\"type\":\"p\",\"id\":\"9eo-UGjyVK1fjuK0yRp88\"}],\"type\":\"p\",\"id\":\"jVCLmvNjEjZuv8GMlStio\"}],\"type\":\"cell\",\"id\":\"X-OAogBy393BOhI2-u8FP\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"여기에서는 COS API를 지칭하며, 필요에 따라 1개 또는 일련의 작업 조합이나 모든 작업(\"},{\"code\":1,\"text\":\"*\"},{\"text\":\")을 지정합니다. 예: \"},{\"code\":1,\"text\":\"name/cos:GetService\"},{\"text\":\", \"},{\"b\":1,\"text\":\"영어 대소문자 구분에 유의하십시오\"},{\"text\":\".\"}],\"type\":\"p\",\"id\":\"9ZCQGDBsdBy7iOgkzdv1D\"}],\"type\":\"p\",\"id\":\"8Tb-D56QRDF0u-439Hfq2\"}],\"type\":\"cell\",\"id\":\"no4eBX0N8SvOfotZv6oME\"}],\"type\":\"row\",\"id\":\"-idSZ8uDjINrw_T6G8EaD\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"condition\"}],\"type\":\"p\",\"id\":\"Uv61eu3ugoDdU5r1KeetO\"}],\"type\":\"p\",\"id\":\"jpKVJ8Tcs4w1vdA5WcVYK\"}],\"type\":\"cell\",\"id\":\"3VkICf46TMgbhMCznurOm\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"규제 조건으로, 입력하지 않아도 됩니다. 자세한 설명은 \"},{\"children\":[{\"text\":\"condition\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/598/10603\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/598/10603\"},\"type\":\"ref\",\"id\":\"BJPa_60UH1a4c9ifmnwzH\"},{\"text\":\"을 참고하십시오.\"}],\"type\":\"p\",\"id\":\"t8aPPRhY71q58QU4rDd3-\"}],\"type\":\"p\",\"id\":\"MWr4y9TNDCA-HbUqf1TP_\"}],\"type\":\"cell\",\"id\":\"VnzZA8KkGOa2xzjND0H4n\"}],\"type\":\"row\",\"id\":\"1Zj0ghSt3VFikayiM9AfH\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\",\"id\":\"FBU1UFQdYBlqmb9w7Q5Bt\",\"widths\":[16,84],\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"각 COS API 별 권한 정책 설정 예시는 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"7BwlhySG9ocwJDBApTh93\"},{\"children\":[{\"text\":\"Service API\"}],\"nodeId\":\"service-api\",\"type\":\"h2\",\"id\":\"RCGLqcFuVQZkod2DqWcNm\"},{\"children\":[{\"text\":\"버킷 리스트 조회\"}],\"nodeId\":\".EB.B2.84.ED.82.B7-.EB.A6.AC.EC.8A.A4.ED.8A.B8-.EC.A1.B0.ED.9A.8C\",\"type\":\"h3\",\"id\":\"BCmGAHjon10yi936mepro\"},{\"children\":[{\"text\":\"API는 GET Service이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetService로 설정하고 resource는 \"},{\"code\":1,\"text\":\"*\"},{\"text\":\"로 설정합니다.\"}],\"type\":\"p\",\"id\":\"XQJxRP4eGX8DFyfljIzrq\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C\",\"type\":\"h4\",\"id\":\"sDZOtbskigE1T8CmqGiSl\"},{\"children\":[{\"text\":\"버킷 리스트 조회 권한을 부여하는 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"w1_GX2NwOWGsQEN5QSV1D\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"vC77o9VrJKXpWfsQdy19l\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"DgRZbRcitF4OlHfrJv0ZB\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"6tVLJUbtbhQg1jHYTvDsb\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"nX8Jt6gLN60tT7s3HU-FP\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"40_KBB3M4H9GdchSVPsIu\"},{\"children\":[{\"text\":\" \\\"name/cos:GetService\\\"\"}],\"type\":\"code-line\",\"id\":\"UN2cLTUDwZh6CkS04s-8v\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"w9Rv_pca1GZVB7Q9mSNsD\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"tJPSgmScAARRufv3dX2B9\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"2WrdY5jygpywHBW9TBoaS\"},{\"children\":[{\"text\":\" \\\"*\\\"\"}],\"type\":\"code-line\",\"id\":\"sLzglyBOiNoy8QH81Cex1\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"JPCnazMYHIYOZXL76uNRn\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"Q7oCFPe-do9090E1ra-ds\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"tQlHiy_5LHVyBB9CnEY89\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"PYc4A1UaA79avnQf3yLrO\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"qIqYXAAzsoAx_JCh3kNxF\",\"autoWrap\":false},{\"children\":[{\"text\":\"Bucket API\"}],\"nodeId\":\"bucket-api\",\"type\":\"h2\",\"id\":\"WC-cCVhBOB3lO6jd1bmml\"},{\"children\":[{\"text\":\"Bucket API 정책의 resource는 다음과 같을 수 있습니다.\"}],\"type\":\"p\",\"id\":\"uhyBIUv-r4pBWrVhebqfo\"},{\"children\":[{\"text\":\"모든 리전의 버킷에 대한 작업\\n정책의 resource를 \"},{\"code\":1,\"text\":\"*\"},{\"text\":\"로 설정하며, \"},{\"b\":1,\"text\":\"해당 정책에서 한정하는 리소스 범위의 권한 범위가 너무 커 데이터 보안 리스크가 발생할 수 있으므로 설정에 유의하십시오\"},{\"text\":\".\"}],\"start\":false,\"type\":\"uli\",\"id\":\"rOjuC9rxutCtmTZ5Va_1w\"},{\"children\":[{\"text\":\"특정 리전 버킷의 작업만 허용\\nAPPID가 1250000000이고, 리전이 베이징(ap-beijing)인 버킷 examplebucket-1250000000의 작업만 허용하는 경우, 정책의 resource는 \"},{\"code\":1,\"text\":\"qcs::cos:ap-beijing:uid/1250000000:*\"},{\"text\":\"가 됩니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"iHmpNiMrvLzSktK1yOoae\"},{\"children\":[{\"text\":\"특정 리전의 특정 이름 버킷 작업만 허용\\nAPPID가 1250000000이고, 리전이 ap-beijing이며, 이름이 examplebucket-1250000000인 버킷의 작업만 허용하는 경우, 정책의 resource는 \"},{\"code\":1,\"text\":\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/*\"},{\"text\":\"가 됩니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"iDKXXWStK7U74wCHjyFuA\"},{\"children\":[{\"text\":\"Bucket API 정책의 action은 작업에 따라 값이 달라집니다. 다음은 Bucket API 권한 부여 정책에 관한 예시로, 기타 Bucket API 권한 부여 정책에 참고할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"F1LNissDWQg3qoiQZTEW8\"},{\"children\":[{\"text\":\"버킷 생성\"}],\"nodeId\":\".EB.B2.84.ED.82.B7-.EC.83.9D.EC.84.B1\",\"type\":\"h3\",\"id\":\"wmDDao3QGkWCwYgnayt-P\"},{\"children\":[{\"text\":\"API는 PUT Bucket이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PutBucket으로 설정합니다.\"}],\"type\":\"p\",\"id\":\"ETcWuM-ZludhzixfOwcCa\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C2\",\"type\":\"h4\",\"id\":\"wYHZG2zKA1gvmi8vztxL4\"},{\"children\":[{\"text\":\"사용자 APPID 1250000000에 버킷 생성 권한을 부여하고, 리전이 베이징 리전이며 버킷 이름이 examplebucket-1250000000인 버킷을 생성할 경우 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"gCrDCe3b6v0T5MiTGr6wH\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"iQGO29vh0Qz3Sfv7W7oK-\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"mEaKiXnV3QpSaTVhzT5kh\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"WedKgM3dqC9rD4itk5Pob\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"Tvy2bU6wkAnoVKV0s5XSq\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"pNRTRRwEyTXHgeEk8q8L8\"},{\"children\":[{\"text\":\" \\\"name/cos:PutBucket\\\"\"}],\"type\":\"code-line\",\"id\":\"0GIgPF6fkuxoIVI9W3Oyb\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"whl5CxLDP0nllgDnCZNMZ\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"86vbLXg_66rgnPcYxbjea\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"tYmwATpON4eXadsP2loI4\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"-Zt1KlaUEmDxHLFjVJG-D\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"bOSA82R1iLSSgRwTFSY6P\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"Bpion21WyrrDjnB3YzlPV\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"z5WnMrOYN6FpP06agcc2w\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"JI_1CFhwnPyIFBL5ZpeUS\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"i0YQxc24QFmqgx6gDA4dE\",\"autoWrap\":false},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"yYeldudvrZwP-noY1hQXd\"},{\"children\":[{\"text\":\" 버킷 이름은 이름 생성 규칙에 부합해야 하며, 자세한 내용은 \"},{\"children\":[{\"text\":\"버킷 이름 생성 규칙\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13312\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13312\"},\"type\":\"ref\",\"id\":\"9l0rRrIpYx1IOoNcVf_gh\"},{\"text\":\"을 참고하십시오.\"}],\"type\":\"p\",\"id\":\"JhL_1zNBK230j1oBG10kE\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"OQoWvM1Gs7lNi-xr7tNOg\"},{\"children\":[{\"text\":\"버킷 및 해당 권한 인덱스\"}],\"nodeId\":\".EB.B2.84.ED.82.B7-.EB.B0.8F-.ED.95.B4.EB.8B.B9-.EA.B6.8C.ED.95.9C-.EC.9D.B8.EB.8D.B1.EC.8A.A4\",\"type\":\"h3\",\"id\":\"tXI4oqO2dub1r8glLim2c\"},{\"children\":[{\"text\":\"API는 HEAD Bucket이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:HeadBucket으로 설정합니다.\"}],\"type\":\"p\",\"id\":\"uWc0g0Y7snT70CeQBSTsK\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C3\",\"type\":\"h4\",\"id\":\"19bqj-YLyslh7K-D5Yhpr\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷에 대한 인덱스 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"yAUsSKe8Hb7ZaOAeM3e2F\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"gskWit2ckLGVPdR58siEh\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"kZxWa7m9-RPh_biZ36FG2\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"FVuq8Ym9Ewvb4CbNEg2Ad\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"ipm7r2asXpnfQJKrJle_v\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"-S2bbeO9kPdFYRJaxFXbb\"},{\"children\":[{\"text\":\" \\\"name/cos:HeadBucket\\\"\"}],\"type\":\"code-line\",\"id\":\"zzqGmTLNu7uqWoWNn2AYs\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"7chqrP9KGaQ_iVB5g8--3\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"wVJs7XdlcJ1kDjcQCC4wk\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"Jl_SeLxtM3at0NR6mJ9wW\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"P9lumb5F0OghvfeNr5l3g\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"4E17PIrqRgviKMErUJqiu\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"YWFjrqulDtkWjimPwwbaN\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"6yTi6QWo6FOrd0bWalfqF\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"sgdem0Ajwv6pFoPEt8r-0\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"zWQtauf_jryNnvQPAJxWT\",\"autoWrap\":false},{\"children\":[{\"text\":\"객체 리스트 쿼리\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EB.A6.AC.EC.8A.A4.ED.8A.B8-.EC.BF.BC.EB.A6.AC\",\"type\":\"h3\",\"id\":\"p7iUiCypNoWqvEzWGUPaH\"},{\"children\":[{\"text\":\"API는 GET Bucket이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetBucket으로 설정합니다.\"}],\"type\":\"p\",\"id\":\"NIjsVW9ZGdQkTHw9pCqUp\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C4\",\"type\":\"h4\",\"id\":\"PIIB71-RfyBcvq-Z4F1tC\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 객체 리스트 조회 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"aSZJ-ilKbwCT1xNPKgPGa\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"v83jl87nOwRdXmMnJRS22\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"J2U2uBPuixN7PZYYETcS3\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"_l7UtP1mjmOaSf8wECwwA\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"I8amqBjWD56z7-D4BphpQ\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"VXHP1r9MQRAOLfkls2U0x\"},{\"children\":[{\"text\":\" \\\"name/cos:GetBucket\\\"\"}],\"type\":\"code-line\",\"id\":\"Pv785ayDOU8mMmrTjTxGC\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"6IqvlPsOrmGbMCRf-BIIZ\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"F3wRHcyu5-52zU1Qq902P\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"IBbnDUwG1PfWxQj5LQ2lP\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"aWjiuvw5_ZhOiSrw5E-Y5\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"PR2DBhF3SeJ7mov2BGanP\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"1iHXK_IRKlBomMxAdZMi6\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"G1P3V1JuxZmTh0kIdnGmL\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"MVhZD27TtSatI-Ko_aonj\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"l-jyyrgNHml4byHnecFqP\",\"autoWrap\":false},{\"children\":[{\"text\":\"버킷 삭제\"}],\"nodeId\":\".EB.B2.84.ED.82.B7-.EC.82.AD.EC.A0.9C\",\"type\":\"h3\",\"id\":\"BLRszxnVQrhr5IGFzEgfZ\"},{\"children\":[{\"text\":\"API는 Delete Bucket이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:DeleteBucket으로 설정합니다.\"}],\"type\":\"p\",\"id\":\"ZYf3ZNasG5Yb0KjQDCA7z\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C5\",\"type\":\"h4\",\"id\":\"dSWCeLeqkxnqyV10Fi5g3\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷에 대한 삭제 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"vko2uoUwev4G8Av_r4yQ1\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"IiHO17zWBlZSNRbOtkG8P\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"Z_buEikoks-PPWHLCArLf\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"5Lw6LfmnTa69nSGuAZRqD\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"2-KkFBQ5yonnLgp5B24Cg\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"qGwJoeYY7A_ug9_LutO6l\"},{\"children\":[{\"text\":\" \\\"name/cos:DeleteBucket\\\"\"}],\"type\":\"code-line\",\"id\":\"lFfncwjuzK8q-xdh00XNX\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"dWiH3wFIlqs-qeGFqfJS2\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"3w2MYfYmGq4E3K_s9oOA9\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"_cPlUIR21a10ZucNo-MWC\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"WT6KHnpPdmdFYl97rtVTW\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"zIcjbMRVaF5sJPkZnu67k\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"243Xvfyi3uGRWNDmPVKfq\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"2vnIz47RoQ6_JctCp5aOh\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"ln3dxpNeGpvCkuwK_7ONo\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"vezB1JQZmj2EJGSaoGPWn\",\"autoWrap\":false},{\"children\":[{\"text\":\"버킷 ACL 설정\"}],\"nodeId\":\".EB.B2.84.ED.82.B7-acl-.EC.84.A4.EC.A0.95\",\"type\":\"h3\",\"id\":\"NaxdjeG9_1-hLV3cc3CSG\"},{\"children\":[{\"text\":\"API는 Put Bucket ACL이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PutBucketACL로 설정합니다.\"}],\"type\":\"p\",\"id\":\"mhQ49IShEl_oiR4Hs9mVo\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C6\",\"type\":\"h4\",\"id\":\"HMomywBXad7e1-kJX1ZJO\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 ACL 설정 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"lAgb3OfyBjJMySrGkA12U\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"mTEK3sSSTvB39jvo-QB_4\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"2N1KiYPIN9i4GthTAYfql\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"61OdgawBcoF7kuOwQfnaE\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"vbo-mUe8JfAf2VkELO0Bt\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"9SKmhe_bResD80vgciYMr\"},{\"children\":[{\"text\":\" \\\"name/cos:PutBucketACL\\\"\"}],\"type\":\"code-line\",\"id\":\"hnI1dBKCOHACN5P61I4vo\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"fUPd0I32n51lsa1vbDWot\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"fEM4npEDzK2tnvuIIqQyt\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"wC_k4YaFCMvFTKHAndzrT\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"kVsgCUSNvCwau_dYfxFET\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"NNtSG3CQEoEg_BSMWAu_X\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"Wfen7F-z_Cz4JmptC7cBM\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"y3fSKLUdI3bq4IS0ekljM\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"eYBHO9MAsKbzWI-Tutkx9\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"qoNH2SAUZLvM1HYqa9u7V\",\"autoWrap\":false},{\"children\":[{\"text\":\"버킷 ACL 조회\"}],\"nodeId\":\".EB.B2.84.ED.82.B7-acl-.EC.A1.B0.ED.9A.8C\",\"type\":\"h3\",\"id\":\"ySOKJqr_mwQCgWtBdQBXE\"},{\"children\":[{\"text\":\"API는 GET Bucket acl이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetBucketACL로 설정합니다.\"}],\"type\":\"p\",\"id\":\"E6IzsvfFSNxQoG43CML0G\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C7\",\"type\":\"h4\",\"id\":\"F63CXHE7diXcmo0SgIq5p\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 ACL 획득 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"QRd3T47NMOU1rVwgGz5qM\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"o9-eal88Fb0cfjdkc9ipC\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"YaiW13j3nBy9oKz_KgOKI\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"xlpGLoFzaDupYmdwzpWSw\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"a7CTxZm4mE69dr26BR0js\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"boyCFNv-z0EuSzjooN7IL\"},{\"children\":[{\"text\":\" \\\"name/cos:GetBucketACL\\\"\"}],\"type\":\"code-line\",\"id\":\"F4CYqP0nKRyjhrWNvKQZP\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"0_p9MGhazgW91tjKWu_D5\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"YwaI9afchA5ykBvmzR4oL\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"Nj_yc0G0feqO3gn_djldd\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"24aiTFQfywV9qHdkPCfbH\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"cP1fIVDPvKPjpB57pAvlX\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"WtIPFBMUx6FO9xBuTaI1O\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"OI-XWiLtkT9B9SvvDJ4RI\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"MH1aSSfJ2H-fBkW_kfB_u\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"HLzwSL4zIYWOSrprTP2FS\",\"autoWrap\":false},{\"children\":[{\"text\":\"크로스 도메인 구성 설정\"}],\"nodeId\":\".ED.81.AC.EB.A1.9C.EC.8A.A4-.EB.8F.84.EB.A9.94.EC.9D.B8-.EA.B5.AC.EC.84.B1-.EC.84.A4.EC.A0.95\",\"type\":\"h3\",\"id\":\"NsabM_93Fgph45ej39uYw\"},{\"children\":[{\"text\":\"API는 PUT Bucket cors이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PutBucketCORS로 설정합니다.\"}],\"type\":\"p\",\"id\":\"Tmi0tgHEbC0kAJEhM61Ud\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C8\",\"type\":\"h4\",\"id\":\"Kl_bX4FNa5JgLAvS-KFOH\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 크로스 도메인 구성 설정 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"65RMecUQZXMcT1wD51sIT\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"8Fc5_NT6hdwWe6ncwxxz-\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"b0s5NuHMrUMPVE0wXY8tn\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"9cjpqFfZagqeBqqpsiq_u\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"LuWm4hmcQWEOfZbVpEVlW\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"ZUlWRrdeFymtyTPXfYNkx\"},{\"children\":[{\"text\":\" \\\"name/cos:PutBucketCORS\\\"\"}],\"type\":\"code-line\",\"id\":\"MV3VnEFk5GcWiMcR_di7e\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"nftY_FRJSch4skOXq5oFz\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"38S6SE0Gom7Kt4aLjQmn9\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"oeuXIpA-MEU1jaJZZZD0e\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"XxD3ZxKVJsLlcqeGcCDl8\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"2kmaqyZ0qSpB_Ggjx1xQc\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"EDlhDE9_cR-e3RAVNP9gQ\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"9vMjaBrOvDrE_DYX-QwCg\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"JqWV4VjRoiIqaidLrl3WA\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"BxqY9iqQRGbdEP3HTaju5\",\"autoWrap\":false},{\"children\":[{\"text\":\"크로스 도메인 설정 조회\"}],\"nodeId\":\".ED.81.AC.EB.A1.9C.EC.8A.A4-.EB.8F.84.EB.A9.94.EC.9D.B8-.EC.84.A4.EC.A0.95-.EC.A1.B0.ED.9A.8C\",\"type\":\"h3\",\"id\":\"3LCDGRkS3eGm0gx2wsCVK\"},{\"children\":[{\"text\":\"API는 GET Bucket cors이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetBucketCORS로 설정합니다.\"}],\"type\":\"p\",\"id\":\"nseUxn-7mT1yfxe7jflqg\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C9\",\"type\":\"h4\",\"id\":\"bBKvlZ1-GMJDxxEufFXWD\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 크로스 도메인 설정 조회 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"Dc2uuIzJw90gyT59-jqbY\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"BJM13I18azox0sOwfbaYY\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"XeXzocukgu3W3F3LF2Ouo\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"ECQ0p2W8mCnTvt4frNIb9\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"s0zldAkH5CKsIQFQQe7__\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"UWfsbcc544sAUTnVAudE5\"},{\"children\":[{\"text\":\" \\\"name/cos:GetBucketCORS\\\"\"}],\"type\":\"code-line\",\"id\":\"2XYl02Q7YY9PRIg4tdrLX\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"hi_TRPr4TaD9_GYHGhqjE\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"zag7G8gqoW12wQbsHfnh9\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"MVk2tfULNjs6eyPDxAfC5\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"UCBiMCKvpc6UJjgUtNePN\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"MI5F_PQAjJjwuRxqOeHu1\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"q2qcYRDq0IjFl04QeFnOo\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"dE_vpLHz_PpdKpMMShPvp\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"okC565a1V6BJqW4UQNiEC\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"POh72S8UQks4k9w7nWrSr\",\"autoWrap\":false},{\"children\":[{\"text\":\"크로스 도메인 설정 삭제\"}],\"nodeId\":\".ED.81.AC.EB.A1.9C.EC.8A.A4-.EB.8F.84.EB.A9.94.EC.9D.B8-.EC.84.A4.EC.A0.95-.EC.82.AD.EC.A0.9C\",\"type\":\"h3\",\"id\":\"qIGM-lyvRVC2-xIlTThvh\"},{\"children\":[{\"text\":\"API는 DELETE Bucket cors이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:DeleteBucketCORS로 설정합니다.\"}],\"type\":\"p\",\"id\":\"Hdvwh5SGEjwJJBWU1-U5P\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C10\",\"type\":\"h4\",\"id\":\"T_3J1v44zligj5g3dtOBb\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 크로스 도메인 설정 삭제 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"YBaCx0-8LJekxW4DDiJOI\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"IKjaeQa6IP3a8r1DIglZg\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"peA1GqJDA8RpMjTRIknfO\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"sKof7svukkY5zKcsudjR9\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"xOn5MuJQxdRhNXkRB9LNI\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"aL0a3J3U9Jyjj0hlc1xct\"},{\"children\":[{\"text\":\" \\\"name/cos:DeleteBucketCORS\\\"\"}],\"type\":\"code-line\",\"id\":\"tS32aDU8V8WgEFI3xTvJL\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"D8pjCfyAv5KyRpIcjJGqL\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"RWxzBqIxutHPvCSQbnIgY\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"_P7H_fh2YIWEM5EU3O3z8\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"sDZYdCfasozUp6zAIb4tx\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"U-ix-TatQWHbUbJmh0Mej\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"7sgebNaiG6XBnum0SHdGm\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"sEDOK6IuZDREm9w2K1mdW\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"ZzRBcsfFDEqMFKX0bNZoF\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"WkmV29aOiouEl9YSgNQCi\",\"autoWrap\":false},{\"children\":[{\"text\":\"라이프사이클 설정\"}],\"nodeId\":\".EB.9D.BC.EC.9D.B4.ED.94.84.EC.82.AC.EC.9D.B4.ED.81.B4-.EC.84.A4.EC.A0.95\",\"type\":\"h3\",\"id\":\"s39Duw_wfr3TZwtZkV4Ei\"},{\"children\":[{\"text\":\"API는 PUT Bucket lifecycle이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PutBucketLifecycle로 설정합니다.\"}],\"type\":\"p\",\"id\":\"W6tedwF3JUeIkgcYKJc0e\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C11\",\"type\":\"h4\",\"id\":\"jEdrYLpybIiSazGakR3YB\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 라이프사이클 설정 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"s_yj39bpRd6YKDB4zeDQ8\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"jMdG1akzk8GKW-hooAoYK\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"JpWJh1LS_kDSiKou3kowL\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"mcj1WBKy4hUZkV402Gos2\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"_73Xoa69oq5BG8-OriqMI\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"D3KVrg6NIriTm1zom5Z2l\"},{\"children\":[{\"text\":\" \\\"name/cos:PutBucketLifecycle\\\"\"}],\"type\":\"code-line\",\"id\":\"JJcAB3EmD6lTzU1Os5qG2\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"P9l_BllJno9UUEGh4FSyI\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"IztxeQsybajbhV1EruQ1k\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"wEQjSITylg-t4eLaBEjJR\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"ge-42pHy8V3ewLMcrVuVU\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"1zfnqG_Qg-DEhwftMxPbk\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"qtYIixwAfyXyQGZ_gMZ-M\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"w5X62QK8VWXG2yQQNmAB_\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"trNaTGPDYRsecHx3JNMjW\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"wBzbXyCMBtWkjLUhRk2YQ\",\"autoWrap\":false},{\"children\":[{\"text\":\"라이프사이클 조회\"}],\"nodeId\":\".EB.9D.BC.EC.9D.B4.ED.94.84.EC.82.AC.EC.9D.B4.ED.81.B4-.EC.A1.B0.ED.9A.8C\",\"type\":\"h3\",\"id\":\"zoZ6dQVtgca1kPoMIPlev\"},{\"children\":[{\"text\":\"API는 GET Bucket lifecycle이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetBucketLifecycle로 설정합니다.\"}],\"type\":\"p\",\"id\":\"DFpMbnQvQ58Nzd2Lspz1X\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C12\",\"type\":\"h4\",\"id\":\"eEAA4Gd8SXq3wxfLMK26v\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 라이프사이클 설정 조회 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"4wBehzRrIU1E_uQVn4vAc\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"GmAPf5CbWWTEcymujbBmq\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"-CG4BhW8ohYjxcsDRTcmj\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"hLIsr-auwZVaVQ27gOj5y\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"G1pqIwSxTwgTbEjJtv9hF\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"eUfvGh18QGizyLJCTHfAt\"},{\"children\":[{\"text\":\" \\\"name/cos:GetBucketLifecycle\\\"\"}],\"type\":\"code-line\",\"id\":\"G4MhxoLOUgygxSDctl92p\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"m6wOTFKNo7qUKuUL-lW6S\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"hs0Te0n0BncM86jPlTS2c\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"a-UAeJasQDYs49wmlboRC\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"hDhMzKw9eok75UMnZlS39\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"srh0LewsgGi9iIC0eH7MU\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"UKAMeGNgWKE-X3_YDkICe\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"LUOVaEF875VKjeA545Zth\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"ocU_bxjoDx9L1Zgb8ZTrY\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"m-iEdagZUBRVIQkY1rjH8\",\"autoWrap\":false},{\"children\":[{\"text\":\"라이프사이클 삭제\"}],\"nodeId\":\".EB.9D.BC.EC.9D.B4.ED.94.84.EC.82.AC.EC.9D.B4.ED.81.B4-.EC.82.AD.EC.A0.9C\",\"type\":\"h3\",\"id\":\"oDj8kDjPmuFzdR8BB0WdI\"},{\"children\":[{\"text\":\"API는 DELETE Bucket lifecycle이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:DeleteBucketLifecycle로 설정합니다.\"}],\"type\":\"p\",\"id\":\"YVGX42nkZWkHjOHxHotwf\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C13\",\"type\":\"h4\",\"id\":\"l8WlBS7eqfKWXWeQB6EaC\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 라이프사이클 설정 삭제 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"rqhtRD_T4TYOxMLSpz97u\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"dI27fI5diVnBmbyT2Xq5n\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"ZgRaNcvpwNKIrAGLuff22\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"x_J2jOXSovcrlHflTZMVN\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"9qtF5h1G5sNE7LHNSGFBo\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"LYV1zpUv_lqSGg_3OqYKW\"},{\"children\":[{\"text\":\" \\\"name/cos:DeleteBucketLifecycle\\\"\"}],\"type\":\"code-line\",\"id\":\"TPtmF6ESdCtAYzlvW0CWC\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"00_4TNqisDIO-h6zk82Fo\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"rfonlvX-DlbFxbPj-Xr3s\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"HvcMWH5b__jCuDrToMwO_\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"ho3VHRj14gtyEGaFC44P9\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"u22zqY-GOvXfXLCksk3m2\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"15sWI-y61wBFPk4LBYGh0\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"n6eZgIdj3xDH2Xw6jsrhJ\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"QiQLe5hgJNxnCP8R3Xdx7\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"bvyoxASNpT9WVWjMaPDUQ\",\"autoWrap\":false},{\"children\":[{\"text\":\"Object API\"}],\"nodeId\":\"object-api\",\"type\":\"h2\",\"id\":\"MJuSyQSdGVADLQHkj4iHy\"},{\"children\":[{\"text\":\"Object API 정책의 resource는 다음과 같을 수 있습니다.\"}],\"type\":\"p\",\"id\":\"286YF59UY5T214VSKdkpJ\"},{\"children\":[{\"text\":\"모든 객체에 대한 작업을 허용할 경우 정책의 resource를 \"},{\"code\":1,\"text\":\"*\"},{\"text\":\"로 설정합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"1RS4SnxNSrHyhfxjJQBcG\"},{\"children\":[{\"text\":\"특정 버킷의 모든 객체만 작업할 수 있도록 설정하는 경우, 즉 APPID가 1250000000이고, 리전이 ap-beijing이며, 이름이 examplebucket-1250000000인 버킷의 모든 객체의 작업만 허용하는 경우, 정책의 resource는 \"},{\"code\":1,\"text\":\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/*\"},{\"text\":\"가 됩니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"XUht5dhiGgZWrSKVB1lVe\"},{\"children\":[{\"text\":\"특정 버킷의 특정 경로 접두사의 모든 객체 객체만 작업할 수 있도록 설정하는 경우, 즉 APPID가 1250000000이고, 리전이 ap-beijing이며, 이름이 examplebucket-1250000000인 버킷의 경로 접두사가 doc인 모든 객체의 작업만 허용하는 경우, 정책의 resource는 \"},{\"code\":1,\"text\":\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\"},{\"text\":\"가 됩니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"ZEMihsRKkO5GywKR0Agzs\"},{\"children\":[{\"text\":\"특정 절대 경로의 객체만 작업할 수 있도록 설정하는 경우, 즉 APPID가 1250000000이고, 리전이 ap-beijing이며, 이름이 examplebucket-1250000000인 버킷의 절대 경로가 \"},{\"code\":1,\"text\":\"doc/audio.mp3\"},{\"text\":\"인 객체의 작업만 허용하는 경우, 정책의 resource는 \"},{\"code\":1,\"text\":\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/audio.mp3\"},{\"text\":\"가 됩니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"W5SMBiMXeX3vrobtbxtdg\"},{\"children\":[{\"text\":\"Object API 정책의 action은 작업에 따라 값이 달라지며, 모든 Object API 권한 부여 정책은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"OVIdSZWNHpj9VVJCjTzB-\"},{\"children\":[{\"text\":\"객체 간편 업로드\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EA.B0.84.ED.8E.B8-.EC.97.85.EB.A1.9C.EB.93.9C\",\"type\":\"h3\",\"id\":\"BUrK0Ns3N4bE9ttfKmLFi\"},{\"children\":[{\"text\":\"API는 PUT Object이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PutObject로 설정합니다.\"}],\"type\":\"p\",\"id\":\"hHCrJV1ycMXQMcjqpefhj\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C14\",\"type\":\"h4\",\"id\":\"FNFbzxyQ67gb4bdTR_gGG\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc에서의 간편 업로드 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"rGJRUpWu20nY9PdK6T66s\"},{\"children\":[{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"A9FwF4CWnDKBobGVHYQKo\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"aa_FhvLSR9FUXard45IYF\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"kok0RzS44IdsrQYCJo1tV\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"tRxJvJ1Bznqr0eqjOAbzm\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"AikManw-T19G2_HlMVSWX\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\"\"}],\"type\":\"code-line\",\"id\":\"B0Mo1TS5TrcI_5i87eiZy\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"7wMLu2Nr-3mSN9wr-ozfW\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"unPElgPUlF46c3CSMWhDj\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"3-u8URCfpGlpHF-hEpymU\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"Lf1v_WqbTZi_A7CbxX94e\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"8smzUlYmGygJ9msWJc7vV\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"I7Irn0NR3Lkpc3K3wLVT9\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"cC2Ft8H43bRDaQmLJzxXr\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"na372T9oyYHb60-TuuRcc\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"x09wU8hDHuz9_lPf3BAL4\",\"autoWrap\":false},{\"children\":[{\"text\":\"멀티파트 업로드\"}],\"nodeId\":\".EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EC.97.85.EB.A1.9C.EB.93.9C\",\"type\":\"h3\",\"id\":\"gz34n67XAKOtiX7Vy3ZS8\"},{\"children\":[{\"text\":\"멀티파트 업로드에는 Initiate Multipart Upload, List Multipart Uploads, List Parts, Upload Part, Complete Multipart Upload, Abort Multipart Upload가 포함되며, 해당 작업 권한을 부여할 경우 정책의 action을 \"},{\"code\":1,\"text\":\"\\\"name/cos:InitiateMultipartUpload\\\",\\\"name/cos:ListMultipartUploads\\\",\\\"name/cos:ListParts\\\",\\\"name/cos:UploadPart\\\",\\\"name/cos:CompleteMultipartUpload\\\",\\\"name/cos:AbortMultipartUpload\\\"\"},{\"text\":\"의 집합으로 설정합니다.\"}],\"type\":\"p\",\"id\":\"FLAYoFfi88ronT7QRRtKv\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C15\",\"type\":\"h4\",\"id\":\"-Tu5yp9t5y7Y_YOumunXl\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc에서 멀티파트 업로드 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"RybIrYgXC2NmrWHQjwghd\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"hUzTkQkCyJ_1f2J9pSTdA\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"AFNT3f4yGLGoEGX_y-8GK\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"1Y8orcPDi14ZfdFpEYDdR\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"a3cyTw7uqqdbXjCPbe1TY\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"_4ndF3A0SnqOPhapYgypC\"},{\"children\":[{\"text\":\" \\\"name/cos:InitiateMultipartUpload\\\",\"}],\"type\":\"code-line\",\"id\":\"-dbnJhlgwGpgZ0Behov4O\"},{\"children\":[{\"text\":\" \\\"name/cos:ListMultipartUploads\\\",\"}],\"type\":\"code-line\",\"id\":\"zs95GnK-IoxitrMaiSyDl\"},{\"children\":[{\"text\":\" \\\"name/cos:ListParts\\\",\"}],\"type\":\"code-line\",\"id\":\"ASSPeZbBZW_m45wH0BI1x\"},{\"children\":[{\"text\":\" \\\"name/cos:UploadPart\\\",\"}],\"type\":\"code-line\",\"id\":\"-8UQJ_79eciHYnFJBdYxg\"},{\"children\":[{\"text\":\" \\\"name/cos:CompleteMultipartUpload\\\",\"}],\"type\":\"code-line\",\"id\":\"UiwZabFUjwgAhNMz4Qe3b\"},{\"children\":[{\"text\":\" \\\"name/cos:AbortMultipartUpload\\\"\"}],\"type\":\"code-line\",\"id\":\"yYitkjuhjVGOFrq4ytp6G\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"udGYK14FU-i77OcVgKVwV\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"anuXZiZTpv8dWy73XPIny\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"BeUxfMm79-ox7BiCB4wGb\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"x-U-to_rjKzr4sLDV2VFx\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"Aql1-B82DnSFBYj-ZbQv4\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"3k0TfnGs5D94wl8NmMRHY\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"JRXX5GufTHXlOCUAKF3xT\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"SCzAdJEnHjr6z3RJD-ldf\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"v5MRchZ1ztsIOaAyCj8h7\",\"autoWrap\":false},{\"children\":[{\"text\":\"멀티파트 업로드 조회\"}],\"nodeId\":\".EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EC.97.85.EB.A1.9C.EB.93.9C-.EC.A1.B0.ED.9A.8C\",\"type\":\"h3\",\"id\":\"v75q54ARXChKI9nOy2rnF\"},{\"children\":[{\"text\":\"버킷의 현재 멀티파트 업로드 중인 정보를 조회하며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:ListMultipartUploads로 설정합니다.\"}],\"type\":\"p\",\"id\":\"cDcgk_0XPJn-17CdtCLB8\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C16\",\"type\":\"h4\",\"id\":\"JnvKGAuMtjeisbU6zt6UG\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 현재 멀티파트 업로드 중인 정보에 대한 조회 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"azzcCsd5Le8220lQRF_A7\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"Iyk5-5xthNGT6q20_FXcC\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"GPqECfAdn6FGd7ST3TlCt\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"g7Jo3-jPkcu5OcoVC4toC\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"3Ak0Dvl092py6DOYnqqzH\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"WiynO67KVArr-VVxBjxoG\"},{\"children\":[{\"text\":\" \\\"name/cos:ListMultipartUploads\\\"\"}],\"type\":\"code-line\",\"id\":\"N-Zh2U15wxs7AWup-TGMI\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"9XSotPFc4rcfBi_LZ4kaD\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"zC-p9g2xHBXQg0yQCkq7C\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"i4fsn3eyuUmC8gUFRxzps\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/\\\"\"}],\"type\":\"code-line\",\"id\":\"eqHrSJdSzcrB1hl6yXyjs\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"paN569pZlwvyJMQK2-M4p\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"FMMQ_HWRAhGKorL9CWZLh\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"lzVIzk2GfO8SWPX8knAKZ\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"Zdr7cLXLMFWfoE_YtUzJY\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"NWmGcqLnS89e38YXZPpMr\",\"autoWrap\":false},{\"children\":[{\"text\":\"HTML 양식을 사용한 객체 업로드\"}],\"nodeId\":\"html-.EC.96.91.EC.8B.9D.EC.9D.84-.EC.82.AC.EC.9A.A9.ED.95.9C-.EA.B0.9D.EC.B2.B4-.EC.97.85.EB.A1.9C.EB.93.9C\",\"type\":\"h3\",\"id\":\"bxc9xybSFDurCr2o21cpr\"},{\"children\":[{\"text\":\"API는 POST Object이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PostObject로 설정합니다.\"}],\"type\":\"p\",\"id\":\"trY2mC4QvtdpSpuTuMdZj\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C17\",\"type\":\"h4\",\"id\":\"BsiI3ss02YH_L4n-0X8AE\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc에서 POST 업로드 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"0mSiN0W12kCA5Immc4arI\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"a6Q_khafyqHuPsu7-8lMW\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"fPnCc8LaOjyixTfKaVGSG\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"H88rep7atqvc9-2cgz8tz\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"0LU6a3dpme1oExzc_VGCd\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"CuOuSbNQpv89KxaIsafpO\"},{\"children\":[{\"text\":\" \\\"name/cos:PostObject\\\"\"}],\"type\":\"code-line\",\"id\":\"_Z2ITa8PahahB7B-VS245\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"53xHzWYn0EmutghwL58tl\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"kyikcDAPvI-8Ksu19CDyj\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"2eaoKfWgpGGEQTU9_ZPk7\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"kdHX0G9cj1FG2OK-zIwIQ\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"8fAluCHDp-7ST3wgSQB--\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"rw58hynGMKnAaM8OZ9TFh\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"yrLNEl1cTa1VA3HntTXn9\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"fctiOO5RHXoWOJFmzvu7H\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"8R14Ygqn_JTpmoI7AbmRP\",\"autoWrap\":false},{\"children\":[{\"text\":\"객체 추가 업로드\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EC.B6.94.EA.B0.80-.EC.97.85.EB.A1.9C.EB.93.9C\",\"type\":\"h3\",\"id\":\"NK5sF9UiZpSlZVYbvKvnB\"},{\"children\":[{\"text\":\"API는 Append Object이며, 해당 작업 권한을 부여할 경우 정책의 action은 name/cos:AppendObject입니다.\"}],\"type\":\"p\",\"id\":\"4Ok5eQIwxYvz--XO4PSq0\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C18\",\"type\":\"h4\",\"id\":\"h8bY9OWOokC8ELAagyjtc\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc에서 추가 업로드 작업 권한을 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"G1jVR_PVjG-WJwuOzZL8x\"},{\"children\":[{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"HHM6k-Q3xG4EzyAkRgcLX\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"Khbti1W86yQH2tp9rS1jA\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"5eF8VwHV7u1xcG41rQMnf\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"8lrVbkjyniI1TMsbaCIKN\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"4xLYUpGYswxphpt8mJUnN\"},{\"children\":[{\"text\":\" \\\"name/cos:AppendObject\\\"\"}],\"type\":\"code-line\",\"id\":\"unPCMbprtNUM-TgLgldko\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"X_3qE6lJhy_pCln6DT2G3\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"4xFk6CFocbAbg3NUJzNda\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"HY3n0GSEwsYXWaZTvd-Au\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"521JSt1wffC47cMA_qEDN\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"i-8w2UIlEkmJE0M2Mdzmy\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"JUR_dQQVkFePD1fYKaBD5\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"mJ7FUzYcMI-sMUP4D4O_H\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"FkDQOPPoFuXfQLO0_ipZj\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"-Vurlg8Bm-EsEXrQhpiIC\",\"autoWrap\":false},{\"children\":[{\"text\":\"객체 메타데이터 쿼리\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EB.A9.94.ED.83.80.EB.8D.B0.EC.9D.B4.ED.84.B0-.EC.BF.BC.EB.A6.AC\",\"type\":\"h3\",\"id\":\"eAhBqJ5Pr7WyXDIyTDRMZ\"},{\"children\":[{\"text\":\"API는 HEAD Object이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:HeadObject로 설정합니다.\"}],\"type\":\"p\",\"id\":\"soYHv-iubJhpwMND4cQP_\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C19\",\"type\":\"h4\",\"id\":\"U6sQ-mal3rq-DEyfLFQo_\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc의 객체 조회 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"cd2XKaRUjtiFqfyTWj9Z9\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"PiG6ZTMZrIAXYLzm-dDZx\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"bzF1w63-vmGx8WDeKLu62\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"0hEzQ5H-95bSqOPreAjII\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"ywbbmiaIKkqLP0V4VU2Nd\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"QpBlcrZCXdAArdEmoSk8c\"},{\"children\":[{\"text\":\" \\\"name/cos:HeadObject\\\"\"}],\"type\":\"code-line\",\"id\":\"FsCZF5dBDulB7wGWNAVh3\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"gWfIRmNtaZZg_SaQ8wmpw\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"tvhsYJvshfjYCtSuxyyo1\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"RCO3md-gs6imT5p2tJ1N6\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"phb6d1-qwNRnAJqv2ZknF\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"D93DKlqVd3clHDzhcEuPK\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"HZ3mQhuNDl1-jzxk5Y2UI\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"RJdojYQ1EzdaMQCtD1iI0\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"QcBOUglycwh3uMcvP7ObT\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"NgK-nKlSrc24tU_rwm7kp\",\"autoWrap\":false},{\"children\":[{\"text\":\"객체 다운로드\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C\",\"type\":\"h3\",\"id\":\"usDfPitUjLLaFMba2yE5X\"},{\"children\":[{\"text\":\"API는 GET Object이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetObject로 설정합니다.\"}],\"type\":\"p\",\"id\":\"GcKnKnNUSFcpsKtvrA6HK\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C20\",\"type\":\"h4\",\"id\":\"mo_RzaBv0UJhGDea_zTuQ\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc의 객체 다운로드 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"9w76Wl8u4qCZPTiQI1MER\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"T5hqyK25_tJsPNIWd8xQO\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"qJH564b8R-MCLrmn2WHSy\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"cqw0msS5uuqBFz5GU3-8z\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"Y-oKkeXh1ip84CDqdFdES\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"N-Xx6fj-N7FMyftOM4wds\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"type\":\"code-line\",\"id\":\"oOXGNFTZ3L6A3Ts0lca6x\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"y8xCy7AItFy2R0_5Emk_E\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"rPt58dQWZwNXRqrCRITYJ\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"TUK2hOIWKRzAmScm5oGfU\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"wlxp2gxPDccB6O1GHAn3W\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"n_hFGhUQU10ozXq9Izh2C\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"odd1azua9p1QScUD94dFW\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"Wkj5smf3Otj9CUoxL5O3t\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"9NZr2WjqmAsrxN9BZSNCi\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"M-5jAYZqL3tKR2Zwuu4ZW\",\"autoWrap\":false},{\"children\":[{\"text\":\"객체 복사\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EB.B3.B5.EC.82.AC\",\"type\":\"h3\",\"id\":\"KRNy6v4qTAt9E2s7ULXX4\"},{\"children\":[{\"text\":\"API는 Put Object Copy이며, 해당 작업 권한을 부여할 경우 정책의 타깃 객체의 action을 name/cos:PutObject로 설정하고, 원본 객체의 action을 name/cos:GetObject로 설정합니다.\"}],\"type\":\"p\",\"id\":\"AHTRKCWgTjPlCir85ORo1\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C21\",\"type\":\"h4\",\"id\":\"QTKtnyCq7Qi1V_M8z6vTc\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc와 경로 접두사 doc2 간의 멀티파트 복사 작업 권한을 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"UAV_HRM1MNT9tzxj1ZtUa\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"iC77FjamqXXMFoi0_CstO\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"hZduFytrJJR8BtsDNp7Rr\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"Z_Mz-gTsg7vZ-ucJ1IPI8\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"C-MHdnC2B8i0LlGVKBdi5\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"rOvTKrvyMmjCil5V67ALQ\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\"\"}],\"type\":\"code-line\",\"id\":\"ocMCmsWymck5PKhTTTlFW\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"46i6K122_ljep7Vxv_EzT\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"7tFm0YPE6Nfonm_mzWyby\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"iOVWUjf549t6WGNPyOeMp\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"WK8QAOMMclKyzdo_eoAPN\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"2WqPkMQQKzRb2a6bolDnV\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\",\"id\":\"3GTE6ujuwwTOGghhcLim-\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"qPcrRK1YEidVS8zESM7Ao\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"5SUIunXS-j6xhhroRcrYb\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"type\":\"code-line\",\"id\":\"92kKT2YYaZ-mS71iDSaZP\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"iZqyeb47SnkqxDnmp2Eow\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"RtR-E9kN21Sbx3aXi_vmR\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"Kzfp6IFNb5HA-zb4QoZPy\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc2/*\\\"\"}],\"type\":\"code-line\",\"id\":\"wb1mnVoDZwX3xpCVDzXX2\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"CJwdRUL88cBtn9Tcdq8sX\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"FacqzpCIExKJIUE_OTSjx\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"6b22jo3nXFVYpj0UKmtPq\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"Wbw2_yFkdIjsK0WAnnFwD\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"AXcCSr7RghlFqKn7LDNkF\",\"autoWrap\":false},{\"children\":[{\"text\":\"이 중에서, \"},{\"code\":1,\"text\":\"\\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc2/*\\\"\"},{\"text\":\"는 원본 객체입니다.\"}],\"type\":\"p\",\"id\":\"cF_wtAihVj2kQv-DbctGZ\"},{\"children\":[{\"text\":\"멀티파트 복사\"}],\"nodeId\":\".EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EB.B3.B5.EC.82.AC\",\"type\":\"h3\",\"id\":\"O0I9J5ZHw6jJC8Vi82MCV\"},{\"children\":[{\"text\":\"API는 Upload Part - Copy이며, 해당 작업 권한을 부여할 경우 정책의 타깃 객체의 action은 \"},{\"code\":1,\"text\":\"\\\"name/cos:InitiateMultipartUpload\\\",\\\"name/cos:ListMultipartUploads\\\",\\\"name/cos:ListParts\\\",\\\"name/cos:PutObject\\\",\\\"name/cos:CompleteMultipartUpload\\\",\\\"name/cos:AbortMultipartUpload\\\"\"},{\"text\":\"의 집합으로 설정하고, 원본 객체의 action은 name/cos:GetObject로 설정합니다.\"}],\"type\":\"p\",\"id\":\"YCvLwpbftj02ghnKTJ9ek\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C22\",\"type\":\"h4\",\"id\":\"jTNYGbQY9Jd0n-aSSQ-Eg\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc와 경로 접두사 doc2 간의 멀티파트 복사 작업 권한을 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"VsdbpRD7jKoS3JXPxnY5E\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"FJxsK_88EVeetBUwzxIB5\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"wpedygZIdEZrdR6Ta-lag\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"mefffDJGroVwQ-sCyoXxN\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"SCx6Pei7LgQ2m7TrniXTS\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"FO8LeTJj8G5kVPONR99Ba\"},{\"children\":[{\"text\":\" \\\"name/cos:InitiateMultipartUpload\\\",\"}],\"type\":\"code-line\",\"id\":\"9s1AU7d9JD1fBdtjBkwIB\"},{\"children\":[{\"text\":\" \\\"name/cos:ListMultipartUploads\\\",\"}],\"type\":\"code-line\",\"id\":\"TFaxWbqyp258hCYBqYbJY\"},{\"children\":[{\"text\":\" \\\"name/cos:ListParts\\\",\"}],\"type\":\"code-line\",\"id\":\"sLy_CTHcKO8a_deFvfzqX\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"type\":\"code-line\",\"id\":\"kCfpsSXDUYJJUrLwcT1iM\"},{\"children\":[{\"text\":\" \\\"name/cos:CompleteMultipartUpload\\\",\"}],\"type\":\"code-line\",\"id\":\"hkCG1XR_OjMT8bQxHgkJi\"},{\"children\":[{\"text\":\" \\\"name/cos:AbortMultipartUpload\\\"\"}],\"type\":\"code-line\",\"id\":\"g7KAp079G1C6JAwCVwDwD\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"JXEjJpt3idUrQvFJo3lQY\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"1eRpzNtQfuOxS6x6xVZfO\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"SKj70dbihuhIhq6zygQRk\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"kqzULgaj_RUHDZvYhtvsu\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"3Jlc1V0NdNKA6jD6Tk_0P\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\",\"id\":\"DZo2czAw1-3YY64O-1udO\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"vQPBFxus9c-VqxFeIPfod\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"dnojPMpb2qGHjkhRFIWBP\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"type\":\"code-line\",\"id\":\"zKo5fVQYt2zK62PISNsWc\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"cc186IIRXgmV0K7VaWJlR\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"eeDqfeakb1jyzkzB2RV2D\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"cKWYcd3mOHkAtI3DgVyKb\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc2/*\\\" \"}],\"type\":\"code-line\",\"id\":\"fmLYuWWDfM2m27bRmX65c\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"9reEsNCGmQY4ONm6YNQY3\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"bF-H428mJMH-Blw7Oo-IH\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"NGPmD4RjVRa7ryfea-mdw\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"G_2KncH_i2WiQ_m6OILZK\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"FBBGWNtYyTMFDqUHLytfp\",\"autoWrap\":false},{\"children\":[{\"text\":\"이 중에서, \"},{\"code\":1,\"text\":\"\\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc2/*\\\"\"},{\"text\":\"는 원본 객체입니다.\"}],\"type\":\"p\",\"id\":\"0CXIbsXOFVOfrCEIwlwcv\"},{\"children\":[{\"text\":\"객체 ACL 설정\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-acl-.EC.84.A4.EC.A0.95\",\"type\":\"h3\",\"id\":\"YXt6AnK6GVFZAe1l8UBXQ\"},{\"children\":[{\"text\":\"API는 Put Object ACL이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PutObjectACL로 설정합니다.\"}],\"type\":\"p\",\"id\":\"-C03NLo9QiR9rPChqhH8j\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C23\",\"type\":\"h4\",\"id\":\"UpymatUusfA2fhdVjb65B\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc의 객체 ACL 설정 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"BEO-tHVb5A8TWPv0TWk4R\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"-OH721uBFHkX98pEY0BlZ\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"xjZowolzzDdR1wxjGNMvH\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"taj3uVxBzt-AFFsokJyav\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"m4oC-DO3cKoIagTiJ1ygZ\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"hIn5UAQaGwNRUqstX-y44\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObjectACL\\\"\"}],\"type\":\"code-line\",\"id\":\"Ntx3vtZUQdPWE8S5DQOsF\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"lxVkJoRRc3LHVmQVDGT2w\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"pNf90oMb-zLdVrKD9MP5f\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"KxD2yhfhkxbxLZx8sb_ZY\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"EbMuDA_JsEm60uAf9QCzM\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"hVop1feJSTMoo39apGPN5\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"GV2yEptG_4CUG5WrX0K9r\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"2D_0W7iNjgZGeNCgZUUbB\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"Q2NRzXUDcIy3iFGGqbATl\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"YFNoYeKKVUvXShTzvg5rp\",\"autoWrap\":false},{\"children\":[{\"text\":\"객체 ACL 조회\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-acl-.EC.A1.B0.ED.9A.8C\",\"type\":\"h3\",\"id\":\"KJ-MAYv_ElfiteEjyurbp\"},{\"children\":[{\"text\":\"API는 Get Object ACL이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:GetObjectACL로 설정합니다.\"}],\"type\":\"p\",\"id\":\"JX8V5fF6RLCzZV8__XGxE\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C24\",\"type\":\"h4\",\"id\":\"z6QzR46ZcjK_ouf-HHxNi\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc의 객체 ACL 조회 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"aRm6gq-sjdG6xmrUANuYC\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"qnbxBMb4L7QUJ0aqgmBAe\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"urRZnQnMx7b2w7ZONf5Yk\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"NkT_gTaskpIUaIvXv6Kws\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"dExzBUQWRvIWqf1Ar8NqQ\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"aDOtKFi13Iwb2EXyquUQO\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObjectACL\\\"\"}],\"type\":\"code-line\",\"id\":\"3JczHqxZr_JsBBqfrBx25\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"oyU7YMmCy16uNuBc2TeY7\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"pOJ2MfKtgHIQ1-UURS2MT\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"t4JJ89CubIybIB8gqICR2\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"ZQTOaVcE9MdpPQhhcbChF\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"RgsLSSiRDqsYui3eOq2tr\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"ZNYu0XNDhdR6cx9yiU2CF\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"J0ZNwBqjfAM3LrfZdoxRy\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"AOAHPb0nPEA-DsUdvXcjH\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"bSC3sRatp6e60NQ5cbhGY\",\"autoWrap\":false},{\"children\":[{\"text\":\"CORS 구성 확인\"}],\"nodeId\":\"cors-.EA.B5.AC.EC.84.B1-.ED.99.95.EC.9D.B8\",\"type\":\"h3\",\"id\":\"jgAJHrzVl1VcU7PS4SeSV\"},{\"children\":[{\"text\":\"API는 OPTIONS Object이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:OptionsObject로 설정합니다.\"}],\"type\":\"p\",\"id\":\"GNyLvIysqGNFRZt8589Qh\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C25\",\"type\":\"h4\",\"id\":\"FT56Bw5cT_CiZqdBKLr2h\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc에서 Options 요청 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"TV_Hc4RBMU-4h3dwsh_OK\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"4qpK8Q5VwyzxZQc7o2BSQ\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"YtEprmiwcN1wuLEh3HM6K\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"vJvGpDKLxpOPrNQdb2bke\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"xfGw-yjIuIQW87_GicnR0\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"KIMnr6VnBQtAbP1tYWE9P\"},{\"children\":[{\"text\":\" \\\"name/cos:OptionsObject\\\"\"}],\"type\":\"code-line\",\"id\":\"0aX2HKOvQxm11uUPbQYOF\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"JYZrNFMLbBuNRUus0aDOU\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"s0CR02oGdyLFpRwIulQG2\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"tl30hjNOD6PsoUp1o3-3Y\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"voNAqZEYnRcCWffdamisy\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"le0462r7HDCRtGK6S6SeZ\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"gVxXiWhFSPs9wV66Ly82_\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"s0iYbwAbYLJ48j3BfGUq0\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"8cxfKTdUesZwZRaOd5aLW\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"SYrKUNc3kvCpgHb-HQ0h0\",\"autoWrap\":false},{\"children\":[{\"text\":\"아카이브된 객체 복구\"}],\"nodeId\":\".EC.95.84.EC.B9.B4.EC.9D.B4.EB.B8.8C.EB.90.9C-.EA.B0.9D.EC.B2.B4-.EB.B3.B5.EA.B5.AC\",\"type\":\"h3\",\"id\":\"V8KgOSVev_Ja9hsHcb35-\"},{\"children\":[{\"text\":\"API는 Post Object Restore이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:PostObjectRestore로 설정합니다.\"}],\"type\":\"p\",\"id\":\"E7WNxhRzVKuH644_HuRCJ\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C26\",\"type\":\"h4\",\"id\":\"5Fy2Xc-BaI_4ziVV3Xad-\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 경로 접두사 doc에서 보관 객체 복구 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"KJXuPa7DsMDALY-p4HnXU\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"1pxdz51HDTcPQfjt5a0hH\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"C7Pl4YYB2wOGHfbZeroq8\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"-NqmGvDvZYzqeaeMw-uLi\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"fJGLvEJPeqaF395xwbwPb\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"i-1-6NLIS5dKuQ9LWf1yi\"},{\"children\":[{\"text\":\" \\\"name/cos:PostObjectRestore\\\"\"}],\"type\":\"code-line\",\"id\":\"nkQBX1rwnjEjgJ-OXmyDt\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"3TigVBGYlqvbgZBBhS9NT\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"IF3Y45eOuHdbBUAzjgFno\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"Jx6Q1S6PpUdQPl5tNdEmz\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"y_DgPTGg8-ihDD52ne7c3\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"cydywfpnhUTQVGBKA_T-B\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"blV1M6V54cA185fTJi0Jw\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"2AFHdu833tgiRVgdNZ3ai\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"tZJwnEcXgceS_z8-aBxQY\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"ahXQZRBhBozUpoXiokT0u\",\"autoWrap\":false},{\"children\":[{\"text\":\"단일 객체 삭제\"}],\"nodeId\":\".EB.8B.A8.EC.9D.BC-.EA.B0.9D.EC.B2.B4-.EC.82.AD.EC.A0.9C\",\"type\":\"h3\",\"id\":\"wRFwk6Wp-gDpuKA9skBx9\"},{\"children\":[{\"text\":\"API는 DELETE Object이며, 해당 작업 권한을 부여할 경우 정책의 action을 name/cos:DeleteObject로 설정합니다.\"}],\"type\":\"p\",\"id\":\"MDlqOSmamupvIl4ddwF2V\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C27\",\"type\":\"h4\",\"id\":\"NC5q0vhanJhBKUZIs_ttq\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 audio.mp3 객체에 대한 삭제 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"tAgnRcq3uhXm3ibjHnmYS\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"xstRpNkpGaoJKl8aFdhQT\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"2Uhyt4k6k01QRdoo96irc\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"wJezJadLwAandUUPO6NyT\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"EoWpznp4CJNGR7xSPSdIp\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"UMHqinWnjBQEjUVOl0OWB\"},{\"children\":[{\"text\":\" \\\"name/cos:DeleteObject\\\"\"}],\"type\":\"code-line\",\"id\":\"HbrI8P_r4W7Rb6QGSGjzR\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"ilWiUhhtYcJzgNgJCQ6pS\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"d3EydFtHjXVbq3wkUBmQJ\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"M6FOf-5rmylEYEDEVCSNR\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/audio.mp3\\\"\"}],\"type\":\"code-line\",\"id\":\"Sove8aLoAe-a3Qv3HJ-ep\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"Gnp9DlPytR_i2TRSdDus5\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"8F5EdSZSZflhCh5JK32Sc\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"COuXowQJC4I7X_5r0ip-J\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"JnN0I-gkj6Nr9KjljxtbP\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"eWYtOJT_YEpjMUISwAwmn\",\"autoWrap\":false},{\"children\":[{\"text\":\"다수의 객체 삭제\"}],\"nodeId\":\".EB.8B.A4.EC.88.98.EC.9D.98-.EA.B0.9D.EC.B2.B4-.EC.82.AD.EC.A0.9C\",\"type\":\"h3\",\"id\":\"PuGapMq6m3VE801WVZFi7\"},{\"children\":[{\"text\":\"API는 DELETE Multiple Objects이며, 해당 작업 권한을 부여할 경우 정책의 \"},{\"code\":1,\"text\":\"action\"},{\"text\":\"을 \"},{\"code\":1,\"text\":\"name/cos:DeleteObject\"},{\"text\":\"로 설정합니다.\"}],\"type\":\"p\",\"id\":\"yWDFsKBYCwixotkLokIyN\"},{\"children\":[{\"text\":\"예시\"}],\"nodeId\":\".EC.98.88.EC.8B.9C28\",\"type\":\"h4\",\"id\":\"4EWa1yilg5-MwPhO78pF0\"},{\"children\":[{\"text\":\"APPID가 1250000000이고 리전이 ap-beijing이며 버킷 이름이 examplebucket-1250000000인 버킷의 audio.mp3와 video.mp4 두 가지 객체에 대한 일괄 삭제 작업 권한만 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"mSQ7tr9qyyS0J_RKPsZYd\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"nsGvOT0_dO4XEhv2B0yD0\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"dByvMcfsuUS5XGuJ5-U6f\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"Ch_g7ao7i3ndEdHSbyIcj\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"xo8yZG0jn8kE2SbAXK7xt\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"clJO7RzoE2VXBGNppixsv\"},{\"children\":[{\"text\":\" \\\"name/cos:DeleteObject\\\"\"}],\"type\":\"code-line\",\"id\":\"kmS6o2jN1BBCFYPtqU7mG\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"_vEIApwtGlkXc5VvZsbys\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"rVJnjzaShK5riDLau5uAB\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"CKsNgT3-rmJ_oqh82ECsI\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/audio.mp3\\\",\"}],\"type\":\"code-line\",\"id\":\"Bjk1mN8MCdGuOLPRZbfGM\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/video.mp4\\\"\"}],\"type\":\"code-line\",\"id\":\"-g_qD989UanovJbK88Dvi\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"kMQUKvSQWXZ6zBlhK8LqU\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"chuwwwvAeINo1r6sN6rxh\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"Yqz2RrlPIVRSer-w_-OqI\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"6mIUcudVoW-Q5uw8OLSB8\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"lTebiRjg8peia38Nybf3f\",\"autoWrap\":false},{\"children\":[{\"text\":\"일반적인 시나리오 권한 부여 정책\"}],\"nodeId\":\".E5.B8.B8.E8.A7.81.E5.9C.BA.E6.99.AF.E6.8E.88.E6.9D.83.E7.AD.96.E7.95.A5\",\"type\":\"h2\",\"id\":\"KMLwSLaMRbZoeBtmXQPSq\"},{\"children\":[{\"text\":\"모든 리소스에 대한 완전한 읽기 권한 부여\"}],\"nodeId\":\".EB.AA.A8.EB.93.A0-.EB.A6.AC.EC.86.8C.EC.8A.A4.EC.97.90-.EB.8C.80.ED.95.9C-.EC.99.84.EC.A0.84.ED.95.9C-.EC.9D.BD.EA.B8.B0-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h3\",\"id\":\"XCcMxSNrpxTfPkkXBMTPL\"},{\"children\":[{\"text\":\"모든 리소스에 대한 완전한 읽기 권한을 부여하는 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"mAd95-s2W-4DUgApycq0M\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"vMKv-GXtUPnRA8A_cqAON\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"Esp3CpN3KYVmZUVC2y5lw\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"f7_tP5Qi3c3NuCyQEQ4gy\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"1DCKzurwTDv6_CglMfC1C\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"w1nCFugqV7FnxPDKhxLfA\"},{\"children\":[{\"text\":\" \\\"*\\\"\"}],\"type\":\"code-line\",\"id\":\"NZuMORnJXPPn-8sFPBzSw\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"YPotDtoYjDdjoSqUDmcAF\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"K_j1yKKAD18ug-KYp8RO_\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"baVaDHLXoKfor3MdVCK1h\"},{\"children\":[{\"text\":\" \\\"*\\\"\"}],\"type\":\"code-line\",\"id\":\"kGVoqto7pOrBFdiCqNp33\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"jlrztL1yRG4Lbpg4PCCmN\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"L-i2RwZkGTUw1_YAWrq32\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"KQBb1LBR5eqLDPOM3nBGH\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"Lzoni0mhEtcU0YVvmnkn-\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"ILJLoILQAf0NsuxfhMR-q\",\"autoWrap\":false},{\"children\":[{\"text\":\"모든 리소스에 대한 읽기 전용 권한 부여\"}],\"nodeId\":\".EB.AA.A8.EB.93.A0-.EB.A6.AC.EC.86.8C.EC.8A.A4.EC.97.90-.EB.8C.80.ED.95.9C-.EC.9D.BD.EA.B8.B0-.EC.A0.84.EC.9A.A9-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h3\",\"id\":\"y2C8qpo7yf7S5sRwmxbhf\"},{\"children\":[{\"text\":\"모든 리소스에 대한 읽기 전용 권한을 부여하는 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"LYTfomJXh2py6cxrxprtb\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"KISPQ1EQ9G8G25LwG1LvV\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"H3wvLBlAPn-zLqK3CnDMB\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"dsrd_RyTILRokT2k8nL76\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"HFLGXntpXXn_nhEE0wiLO\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"JmeG7R4jIbns7pJWrd-pO\"},{\"children\":[{\"text\":\" \\\"name/cos:HeadObject\\\",\"}],\"type\":\"code-line\",\"id\":\"S-VJa6p7RICUiNmG6MlvC\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\",\"}],\"type\":\"code-line\",\"id\":\"9WP88H_3H3j_89rAeto5H\"},{\"children\":[{\"text\":\" \\\"name/cos:GetBucket\\\",\"}],\"type\":\"code-line\",\"id\":\"tD2sh1EEw3U3catVKj764\"},{\"children\":[{\"text\":\" \\\"name/cos:OptionsObject\\\"\"}],\"type\":\"code-line\",\"id\":\"41QRhPjBekgBk1GuCOE4C\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"2SbSmR4KRT1wZhzdY3d8W\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"Uk8BFjSqrDug9oJGmjRpI\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"qwfuQby9IL7NW4Oz5D6A3\"},{\"children\":[{\"text\":\" \\\"*\\\"\"}],\"type\":\"code-line\",\"id\":\"3RIU6qKRGai_lsjqJ0a_7\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"fQeClhMCZw7aOA_RhmcQ-\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"r7RiquvpYdQSzImWqMc_m\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"du0qHw6EZ5kJNBjKuf7YU\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"0Sgp9pgTHj0ruLOEUGSF-\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"PBzvOxGZqBiM6A_mMFe2w\",\"autoWrap\":false},{\"children\":[{\"text\":\"특정 경로 접두사에 대한 읽기 권한 부여\"}],\"nodeId\":\".ED.8A.B9.EC.A0.95-.EA.B2.BD.EB.A1.9C-.EC.A0.91.EB.91.90.EC.82.AC.EC.97.90-.EB.8C.80.ED.95.9C-.EC.9D.BD.EA.B8.B0-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h3\",\"id\":\"LwaWgELGnwF0vJWapU_H5\"},{\"children\":[{\"text\":\"사용자에게 examplebucket-1250000000 버킷의 경로 접두사 doc 아래의 파일만 액세스할 수 있고 다른 경로의 파일은 작업할 수 없도록 권한을 부여할 경우 해당 정책의 자세한 내용은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"PXKbuT6caKzcQstN_bH0v\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"kEg3fRT09fUEC4tWG2IE7\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"ar-oJ4yx6TWJoUJmicIXX\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"euDDA8VUq9jiSulIqOSMv\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"fgSdYwlu8VaQS9beGxhep\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\",\"id\":\"xoecgGtmbnYhp3TkvPLDS\"},{\"children\":[{\"text\":\" \\\"*\\\"\"}],\"type\":\"code-line\",\"id\":\"9Y_2AounqlIlefQU0Hi4J\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"Flg1VnCro0Gql3Oypfdby\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"041BEirYBXjwWYEEPIBav\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"type\":\"code-line\",\"id\":\"YWDLbWBZJzRxK0FgjKstc\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-shanghai:uid/1250000000:examplebucket-1250000000/doc/*\\\"\"}],\"type\":\"code-line\",\"id\":\"uoPdAbN5M8YyCvMIlh8tK\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"2jAYiya40WSTHlwqpDrhy\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"Mr5wk_c3GHNDty02awG3Y\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"4COGkKyHf5DjvfhirsfoD\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"q2Z72uSATixM-di7mSvDe\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"lcm-c6JGwtAOJlfTSOcje\",\"autoWrap\":false},{\"type\":\"p\",\"children\":[{\"text\":\"\"}],\"id\":\"7Dg5SyqKvl_orraNF3c0S\"}]"}},"30618":{"categoryId":436,"weight":60,"type":"page","extension":"","pid":33419,"id":30618,"lang":"ko","title":"모바일 애플리케이션 다이렉트 업로드 사례","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:12","recentReleaseTime":"2019-12-06 19:34:12","content":{"title":"모바일 애플리케이션 다이렉트 업로드 사례","body":"

소개

본 문서에서는 Tencent Cloud COS를 기반으로 모바일 애플리케이션에서의 파일 다이렉트 업로드 기능을 신속히 구현하는 방법을 소개합니다. 서버에서 복잡한 조작을 할 필요 없이 액세스 키를 생성 및 관리하는 것만으로도 파일 데이터를 Tencent Cloud COS에 저장할 수 있습니다.

아키텍처 설명

클라이언트 애플리케이션의 경우, 영구 키를 클라이언트 코드에 입력하면 키 정보가 쉽게 노출될 수 있으며, 사용자 액세스 권한 제어에도 불편이 따릅니다. 영구 키의 유출 방지를 위해 요청 시 임시 키를 사용하고, App에 스토리지 리소스에 대한 임시 액세스 권한을 부여할 것을 권장합니다. 키의 유효기간은 직접 지정할 수 있으며, 기간이 만료되면 키는 자동 무효화됩니다.\nCOS의 모바일 SDK(Android/IOS)는 임시 키로 권한 부여 요청을 할 수 있습니다. 백그라운드에서 임시 키 서비스를 구축하면 단말 COS로 권한 부여를 위한 요청이 매끄럽게 전달됩니다.

아키텍처

아키텍처 예시는 다음 이미지를 참조하십시오.\n
\"cos로

\n다음을 참고하십시오.
사용자 클라이언트: 사용자 휴대폰의 App입니다.
COS: Tencent Cloud COS, App에서 업로드한 데이터를 보관합니다.
CAM: Tencent Cloud CAM, COS 임시 키 생성에 쓰입니다.
사용자 서버: 사용자의 백그라운드 서버로, 임시 키를 발급하여 애플리케이션 App으로 반환합니다.

전제 조건

1. 버킷을 생성합니다.\nCOS 콘솔에서 버킷을 생성합니다. 요구사항에 따라 버킷 권한을 개인 읽기/쓰기 또는 공개 읽기/개인 쓰기로 설정할 수 있습니다. 자세한 단계에 관한 내용은 버킷 생성액세스 권한 설정을 참조하십시오.
2. 영구 키를 받습니다.\n임시 키는 영구 키를 통해 생성해야 합니다. API Keys로 이동하여 SecretId, SecretKey를 획득한 뒤 계정 정보로 이동하여 APPID를 부여받습니다.

실행 순서

임시 키 서비스 구축

보안 강화를 위해 임시 키로 서명하려면 서버에 임시 키 서비스를 구축하고, API 인터페이스를 클라이언트로 전달해야 합니다. 서비스 구축 단계에 관한 자세한 내용은 임시 키 생성 및 사용 가이드를 참조하십시오.
주의:
정식 배포에 앞서 서버에 본인 웹 사이트의 권한 인증 기능을 추가하십시오.

적합한 권한 선택

최소 권한의 원칙과 본인의 요구사항에 따라 Policy를 적용하여 임시 키의 권한 범위를 제어할 것을 권장합니다. 서버에서 전달한 완전한 읽기/쓰기 권한을 가진 키가 해킹에 노출되면 다른 사용자의 데이터가 유출될 위험이 있습니다. 설정에 관한 자세한 내용은 임시 키 생성 및 사용 가이드를 참조하십시오.

SDK로 라이선스 서비스 액세스

Android

임시 키 서비스를 구축한 뒤 SDK로 라이선스 서비스에 액세스해야 합니다. SDK는 요청한 동시 접속 수를 제어하고, 유효한 키를 로컬에 캐싱합니다. 키가 무효화되면 재요청을 하기 때문에 키를 따로 관리하지 않아도 됩니다.

표준 응답 본문에 의한 권한 부여

STS SDK에서 획득한 JSON 데이터를 임시 키 서비스의 응답 본문으로 할 경우(cossign은 해당 방법 적용), 다음 코드로 COS SDK의 권한 부여 클래스를 생성할 수 있습니다.
import android.content.Context;
import com.tencent.cos.xml.*;
import com.tencent.qcloud.core.auth.*;
import com.tencent.qcloud.core.common.*;
import com.tencent.qcloud.core.http.*;
import java.net.*;


Context context = ...;
CosXmlServiceConfig cosXmlServiceConfig = ...;

/**
* 라이선스 서비스의 url 주소 획득
*/
URL url = null; // 백그라운드의 라이선스 서비스 url 주소
try {
url = new URL("your_auth_server_url");
} catch (MalformedURLException e) {
e.printStackTrace();
}

/**
* {@link QCloudCredentialProvider} 객체 초기화로 SDK에 임시 키 부여
*/
QCloudCredentialProvider credentialProvider = new SessionCredentialProvider(new HttpRequest.Builder<String>()
.url(url)
.method("GET")
.build());

CosXmlService cosXmlService = new CosXmlService(context, cosXmlServiceConfig, credentialProvider);
설명:
이 방법을 적용할 경우, 서명 시작 시간은 휴대폰 로컬 시간이 기준입니다. 휴대폰 로컬 시간이 10분 이상 차이가 난다면 서명 오류가 발생할 수 있습니다. 이런 경우 다음의 사용자 정의 응답 본문으로 권한을 부여하는 것을 권장합니다.

사용자 정의 응답 본문에 의한 권한 부여

사용자 정의한 임시 키 서비스의 HTTP 응답 본문이 단말에서 서버로 반환되는 시간을 서명 시작 시간으로 설정함으로써 사용자 휴대폰의 로컬 시간 오차로 서명 오류가 발생하는 것을 방지하거나 다른 프로토콜로 단말과 서버 간 통신하는 등 보다 효율적인 작업을 원한다면, BasicLifecycleCredentialProvider 클래스를 상속하여 fetchNewCredentials()를 출력합니다.
먼저 MyCredentialProvider 클래스를 정의하십시오.
import android.content.Context;
import com.tencent.cos.xml.*;
import com.tencent.qcloud.core.auth.*;
import com.tencent.qcloud.core.common.*;
import com.tencent.qcloud.core.http.*;
import java.net.*;


public class MyCredentialProvider extends BasicLifecycleCredentialProvider {

@Override
protected QCloudLifecycleCredentials fetchNewCredentials() throws QCloudClientException {

// 먼저 임시 키 서버로부터 서명 정보가 담긴 응답 획득
....

// 응답을 분석하여 키 정보 획득
String tmpSecretId = ...;
String tmpSecretKey = ...;
String sessionToken = ...;
long expiredTime = ...;

// 서버 반환 시간을 서명 시작 시간으로 설정
long beginTime = ...;

// todo something you want

// 최종적으로 임시 키 정보 객체 반환
return new SessionQCloudCredentials(tmpSecretId, tmpSecretKey, sessionToken, beginTime, expiredTime);
}
}
본인이 정의한 MyCredentialProvider 인스턴스로 권한 부여를 요청합니다.
import android.content.Context;
import com.tencent.cos.xml.*;
import com.tencent.qcloud.core.auth.*;
import com.tencent.qcloud.core.common.*;
import com.tencent.qcloud.core.http.*;
import java.net.*;

Context context = ...;
CosXmlServiceConfig cosXmlServiceConfig = ...;

/**
* {@link QCloudCredentialProvider} 객체 초기화로 SDK에 임시 키 부여
*/
QCloudCredentialProvider credentialProvider = new MyCredentialProvider();

CosXmlService cosXmlService = new CosXmlService(context, cosXmlServiceConfig, credentialProvider);
Android에서 COS로 파일을 업로드 및 다운로드하는 방법은 Android SDK의 시작하기를 참조하십시오.

iOS

임시 서명을 간편하게 획득하고 관리할 수 있는 QCloudCredentailFenceQueue를 제공합니다. QCloudCredentailFenceQueue로 서명을 획득할 경우, 모든 서명이 완료된 뒤 서명 요청이 실행되는 동기화 클래스 CyclicBarrier를 지원하여 스스로 비동기화를 관리하는 과정이 생략됩니다.
QCloudCredentailFenceQueue를 적용할 경우, 먼저 인스턴스 하나를 생성해야 합니다.
//AppDelegate.m
//AppDelegate는 QCloudCredentailFenceQueueDelegate 프로토콜 따름
//
- (BOOL)application:(UIApplication * )application didFinishLaunchingWithOptions:(NSDictionary * )launchOptions {
// init step
self.credentialFenceQueue = [QCloudCredentailFenceQueue new];
self.credentialFenceQueue.delegate = self;
return YES;
}

QCloudCredentailFenceQueue의 클래스를 호출하려면 QCloudCredentailFenceQueueDelegate를 따르고, 프로토콜에 정의된 방법을 실행합니다.
- (void) fenceQueue:(QCloudCredentailFenceQueue * )queue requestCreatorWithContinue:(QCloudCredentailFenceQueueContinue)continueBlock
QCloudCredentailFenceQueue로 서명을 획득할 경우, 프로토콜에서 정의한 방법으로 서명 매개변수를 확보하여 유효한 서명을 생성한 뒤에야 SDK 내의 모든 서명 요청이 실행됩니다. 다음 예시를 참조하십시오.
- (void)fenceQueue:(QCloudCredentailFenceQueue *)queue requestCreatorWithContinue:(QCloudCredentailFenceQueueContinue)continueBlock {
QCloudHTTPRequest* request = [QCloudHTTPRequest new];
request.requestData.serverURL = @“your sign service url”;//요청한 URL

[request setConfigureBlock:^(QCloudRequestSerializer *requestSerializer, QCloudResponseSerializer *responseSerializer) {
requestSerializer.serializerBlocks = @[QCloudURLFuseWithURLEncodeParamters];
responseSerializer.serializerBlocks = @[QCloudAcceptRespnseCodeBlock([NSSet setWithObjects:@(200), nil],nil),//반환 코드가 200이 아닌 경우, 오류 반환
QCloudResponseJSONSerilizerBlock];//JSON 형식에 따라 반환 데이터 분석
}];

[request setFinishBlock:^(id response, NSError *error) {
if (error) {
error = [NSError errorWithDomain:@"com.tac.test" code:-1111 userInfo:@{NSLocalizedDescriptionKey:@"임시 키 미획득"}];
continueBlock(nil, error);
} else {
QCloudCredential* crendential = [[QCloudCredential alloc] init];
crendential.secretID = response[@"data"][@"credentials"][@"tmpSecretId"];
crendential.secretKey = response[@"data"][@"credentials"][@"tmpSecretKey"];
credential.startDate =[NSDate dateWithTimeIntervalSince1970:@"반환된 서버 시간"]
crendential.experationDate = [NSDate dateWithTimeIntervalSinceNow:[response[@"data"][@"expiredTime"] intValue]];
crendential.token = response[@"data"][@"credentials"][@"sessionToken"];;
QCloudAuthentationV5Creator* creator = [[QCloudAuthentationV5Creator alloc] initWithCredential:crendential];
continueBlock(creator, nil);

}
}];
[[QCloudHTTPSessionManager shareClient] performRequest:request];
}
iOS에서 COS로 파일을 업로드 및 다운로드하는 방법은 iOS SDK의 시작하기를 참조하십시오.

체험

Android

여기를 클릭하거나 Android 휴대폰 브라우저 App으로 아래의 QR코드를 스캔하면 체험용 demo를 다운로드할 수 있습니다.\n
\"\"


iOS

iOS의 전체 코드에 관한 내용은 COS iOS Demo를 참조하십시오.
QCloudCOSXMLDemo/QCloudCOSXMLDemo/key.json 파일에 APPID, secretID, secretKey 매개변수 값을 입력한 뒤 다음 명령어를 실행합니다.
pod install
설명:
APPID, secretID, secretKey는 API Keys 페이지에서 받을 수 있습니다.
명령어를 실행한 뒤 QCloudCOSXMLDemo.xcworkspace를 열면 Demo 체험으로 이동할 수 있습니다.
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"본 문서에서는 Tencent Cloud COS를 기반으로 모바일 애플리케이션에서의 파일 다이렉트 업로드 기능을 신속히 구현하는 방법을 소개합니다. 서버에서 복잡한 조작을 할 필요 없이 액세스 키를 생성 및 관리하는 것만으로도 파일 데이터를 Tencent Cloud COS에 저장할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"아키텍처 설명\"}],\"nodeId\":\".EC.95.84.ED.82.A4.ED.85.8D.EC.B2.98-.EC.84.A4.EB.AA.85\",\"type\":\"h2\"},{\"children\":[{\"text\":\"클라이언트 애플리케이션의 경우, 영구 키를 클라이언트 코드에 입력하면 키 정보가 쉽게 노출될 수 있으며, 사용자 액세스 권한 제어에도 불편이 따릅니다. 영구 키의 유출 방지를 위해 요청 시 임시 키를 사용하고, App에 스토리지 리소스에 대한 임시 액세스 권한을 부여할 것을 권장합니다. 키의 유효기간은 직접 지정할 수 있으며, 기간이 만료되면 키는 자동 무효화됩니다.\\nCOS의 모바일 SDK(Android/IOS)는 임시 키로 권한 부여 요청을 할 수 있습니다. 백그라운드에서 임시 키 서비스를 구축하면 단말 COS로 권한 부여를 위한 요청이 매끄럽게 전달됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"아키텍처\"}],\"nodeId\":\".EC.95.84.ED.82.A4.ED.85.8D.EC.B2.98\",\"type\":\"h4\"},{\"children\":[{\"text\":\"아키텍처 예시는 다음 이미지를 참조하십시오.\\n\"},{\"alt\":\"cos로 cam 프레임워크 액세스\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/cf0a69ff91770578f70b05873bb1b348.png\"},{\"text\":\"\\n다음을 참고하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"사용자 클라이언트: 사용자 휴대폰의 App입니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"COS: \"},{\"children\":[{\"text\":\"Tencent Cloud COS\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/product/cos\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/product/cos\"},\"type\":\"ref\"},{\"text\":\", App에서 업로드한 데이터를 보관합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"CAM: \"},{\"children\":[{\"text\":\"Tencent Cloud CAM\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/product/cam\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/product/cam\"},\"type\":\"ref\"},{\"text\":\", COS 임시 키 생성에 쓰입니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"사용자 서버: 사용자의 백그라운드 서버로, 임시 키를 발급하여 애플리케이션 App으로 반환합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"전제 조건\"}],\"nodeId\":\".EC.A0.84.EC.A0.9C-.EC.A1.B0.EA.B1.B4\",\"type\":\"h2\"},{\"children\":[{\"text\":\"버킷을 생성합니다.\\n\"},{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos/bucket\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos/bucket\"},\"type\":\"ref\"},{\"text\":\"에서 버킷을 생성합니다. 요구사항에 따라 버킷 권한을 개인 읽기/쓰기 또는 공개 읽기/개인 쓰기로 설정할 수 있습니다. 자세한 단계에 관한 내용은 \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13309\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13309\"},\"type\":\"ref\"},{\"text\":\"과 \"},{\"children\":[{\"text\":\"액세스 권한 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13315\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13315\"},\"type\":\"ref\"},{\"text\":\"을 참조하십시오.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"영구 키를 받습니다.\\n임시 키는 영구 키를 통해 생성해야 합니다. \"},{\"children\":[{\"text\":\"API Keys\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cam/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/capi\"},\"type\":\"ref\"},{\"text\":\"로 이동하여 SecretId, SecretKey를 획득한 뒤 \"},{\"children\":[{\"text\":\"계정 정보\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/developer\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/developer\"},\"type\":\"ref\"},{\"text\":\"로 이동하여 APPID를 부여받습니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"실행 순서\"}],\"nodeId\":\".EC.8B.A4.ED.96.89-.EC.88.9C.EC.84.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"임시 키 서비스 구축\"}],\"nodeId\":\".EC.9E.84.EC.8B.9C-.ED.82.A4-.EC.84.9C.EB.B9.84.EC.8A.A4-.EA.B5.AC.EC.B6.95\",\"type\":\"h3\"},{\"children\":[{\"text\":\"보안 강화를 위해 임시 키로 서명하려면 서버에 임시 키 서비스를 구축하고, API 인터페이스를 클라이언트로 전달해야 합니다. 서비스 구축 단계에 관한 자세한 내용은 \"},{\"children\":[{\"text\":\"임시 키 생성 및 사용 가이드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/14048\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/14048\"},\"type\":\"ref\"},{\"text\":\"를 참조하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 정식 배포에 앞서 서버에 본인 웹 사이트의 권한 인증 기능을 추가하십시오.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"type\":\"hint\"},{\"children\":[{\"text\":\"적합한 권한 선택\"}],\"nodeId\":\".EC.A0.81.ED.95.A9.ED.95.9C-.EA.B6.8C.ED.95.9C-.EC.84.A0.ED.83.9D\",\"type\":\"h4\"},{\"children\":[{\"text\":\"최소 권한의 원칙과 본인의 요구사항에 따라 Policy를 적용하여 임시 키의 권한 범위를 제어할 것을 권장합니다. 서버에서 전달한 완전한 읽기/쓰기 권한을 가진 키가 해킹에 노출되면 다른 사용자의 데이터가 유출될 위험이 있습니다. 설정에 관한 자세한 내용은 \"},{\"children\":[{\"text\":\"임시 키 생성 및 사용 가이드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/14048\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/14048\"},\"type\":\"ref\"},{\"text\":\"를 참조하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"SDK로 라이선스 서비스 액세스\"}],\"nodeId\":\"sdk.EB.A1.9C-.EB.9D.BC.EC.9D.B4.EC.84.A0.EC.8A.A4-.EC.84.9C.EB.B9.84.EC.8A.A4-.EC.95.A1.EC.84.B8.EC.8A.A4\",\"type\":\"h3\"},{\"children\":[{\"text\":\"Android\"}],\"nodeId\":\"android\",\"type\":\"h4\"},{\"children\":[{\"text\":\"임시 키 서비스를 구축한 뒤 SDK로 라이선스 서비스에 액세스해야 합니다. SDK는 요청한 동시 접속 수를 제어하고, 유효한 키를 로컬에 캐싱합니다. 키가 무효화되면 재요청을 하기 때문에 키를 따로 관리하지 않아도 됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"표준 응답 본문에 의한 권한 부여\"}],\"nodeId\":\".ED.91.9C.EC.A4.80-.EC.9D.91.EB.8B.B5-.EB.B3.B8.EB.AC.B8.EC.97.90-.EC.9D.98.ED.95.9C-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h4\"},{\"children\":[{\"text\":\"STS SDK에서 획득한 JSON 데이터를 임시 키 서비스의 응답 본문으로 할 경우(cossign은 해당 방법 적용), 다음 코드로 COS SDK의 권한 부여 클래스를 생성할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"import android.content.Context;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.cos.xml.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.qcloud.core.auth.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.qcloud.core.common.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.qcloud.core.http.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import java.net.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Context context = ...;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"CosXmlServiceConfig cosXmlServiceConfig = ...;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"/**\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" * 라이선스 서비스의 url 주소 획득\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" */\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"URL url = null; // 백그라운드의 라이선스 서비스 url 주소\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"try {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" url = new URL(\\\"your_auth_server_url\\\");\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"} catch (MalformedURLException e) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" e.printStackTrace();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"/**\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" * {@link QCloudCredentialProvider} 객체 초기화로 SDK에 임시 키 부여\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" */\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"QCloudCredentialProvider credentialProvider = new SessionCredentialProvider(new HttpRequest.Builder\\u003cString\\u003e()\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" .url(url)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" .method(\\\"GET\\\")\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" .build());\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"CosXmlService cosXmlService = new CosXmlService(context, cosXmlServiceConfig, credentialProvider); \"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"이 방법을 적용할 경우, 서명 시작 시간은 휴대폰 로컬 시간이 기준입니다. 휴대폰 로컬 시간이 10분 이상 차이가 난다면 서명 오류가 발생할 수 있습니다. 이런 경우 다음의 사용자 정의 응답 본문으로 권한을 부여하는 것을 권장합니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"사용자 정의 응답 본문에 의한 권한 부여\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9.EC.9E.90-.EC.A0.95.EC.9D.98-.EC.9D.91.EB.8B.B5-.EB.B3.B8.EB.AC.B8.EC.97.90-.EC.9D.98.ED.95.9C-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h4\"},{\"children\":[{\"text\":\"사용자 정의한 임시 키 서비스의 HTTP 응답 본문이 단말에서 서버로 반환되는 시간을 서명 시작 시간으로 설정함으로써 사용자 휴대폰의 로컬 시간 오차로 서명 오류가 발생하는 것을 방지하거나 다른 프로토콜로 단말과 서버 간 통신하는 등 보다 효율적인 작업을 원한다면, BasicLifecycleCredentialProvider 클래스를 상속하여 fetchNewCredentials()를 출력합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"먼저 MyCredentialProvider 클래스를 정의하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"import android.content.Context;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.cos.xml.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.qcloud.core.auth.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.qcloud.core.common.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.qcloud.core.http.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import java.net.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"public class MyCredentialProvider extends BasicLifecycleCredentialProvider {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" @Override\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" protected QCloudLifecycleCredentials fetchNewCredentials() throws QCloudClientException {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 먼저 임시 키 서버로부터 서명 정보가 담긴 응답 획득\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" ....\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 응답을 분석하여 키 정보 획득\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" String tmpSecretId = ...;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" String tmpSecretKey = ...;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" String sessionToken = ...;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" long expiredTime = ...;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 서버 반환 시간을 서명 시작 시간으로 설정\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" long beginTime = ...;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // todo something you want\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 최종적으로 임시 키 정보 객체 반환 \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" return new SessionQCloudCredentials(tmpSecretId, tmpSecretKey, sessionToken, beginTime, expiredTime);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\"}],\"language\":\"java\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"본인이 정의한 MyCredentialProvider 인스턴스로 권한 부여를 요청합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"import android.content.Context;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.cos.xml.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.qcloud.core.auth.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.qcloud.core.common.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.qcloud.core.http.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import java.net.*;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Context context = ...;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"CosXmlServiceConfig cosXmlServiceConfig = ...;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"/**\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" * {@link QCloudCredentialProvider} 객체 초기화로 SDK에 임시 키 부여\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" */\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"QCloudCredentialProvider credentialProvider = new MyCredentialProvider();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"CosXmlService cosXmlService = new CosXmlService(context, cosXmlServiceConfig, credentialProvider); \"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"Android에서 COS로 파일을 업로드 및 다운로드하는 방법은 Android SDK의 \"},{\"children\":[{\"text\":\"시작하기\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/12159\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/12159\"},\"type\":\"ref\"},{\"text\":\"를 참조하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"iOS\"}],\"nodeId\":\"ios\",\"type\":\"h4\"},{\"children\":[{\"text\":\"임시 서명을 간편하게 획득하고 관리할 수 있는 QCloudCredentailFenceQueue를 제공합니다. QCloudCredentailFenceQueue로 서명을 획득할 경우, 모든 서명이 완료된 뒤 서명 요청이 실행되는 동기화 클래스 CyclicBarrier를 지원하여 스스로 비동기화를 관리하는 과정이 생략됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"QCloudCredentailFenceQueue를 적용할 경우, 먼저 인스턴스 하나를 생성해야 합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\" //AppDelegate.m\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"//AppDelegate는 QCloudCredentailFenceQueueDelegate 프로토콜 따름\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"//\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"- (BOOL)application:(UIApplication * )application didFinishLaunchingWithOptions:(NSDictionary * )launchOptions {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // init step\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" self.credentialFenceQueue = [QCloudCredentailFenceQueue new];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" self.credentialFenceQueue.delegate = self;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" return YES;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"QCloudCredentailFenceQueue의 클래스를 호출하려면 QCloudCredentailFenceQueueDelegate를 따르고, 프로토콜에 정의된 방법을 실행합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"- (void) fenceQueue:(QCloudCredentailFenceQueue * )queue requestCreatorWithContinue:(QCloudCredentailFenceQueueContinue)continueBlock\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"QCloudCredentailFenceQueue로 서명을 획득할 경우, 프로토콜에서 정의한 방법으로 서명 매개변수를 확보하여 유효한 서명을 생성한 뒤에야 SDK 내의 모든 서명 요청이 실행됩니다. 다음 예시를 참조하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"- (void)fenceQueue:(QCloudCredentailFenceQueue *)queue requestCreatorWithContinue:(QCloudCredentailFenceQueueContinue)continueBlock {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" QCloudHTTPRequest* request = [QCloudHTTPRequest new];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" request.requestData.serverURL = @“your sign service url”;//요청한 URL\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" [request setConfigureBlock:^(QCloudRequestSerializer *requestSerializer, QCloudResponseSerializer *responseSerializer) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" requestSerializer.serializerBlocks = @[QCloudURLFuseWithURLEncodeParamters];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" responseSerializer.serializerBlocks = @[QCloudAcceptRespnseCodeBlock([NSSet setWithObjects:@(200), nil],nil),//반환 코드가 200이 아닌 경우, 오류 반환\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" QCloudResponseJSONSerilizerBlock];//JSON 형식에 따라 반환 데이터 분석\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" [request setFinishBlock:^(id response, NSError *error) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (error) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" error = [NSError errorWithDomain:@\\\"com.tac.test\\\" code:-1111 userInfo:@{NSLocalizedDescriptionKey:@\\\"임시 키 미획득\\\"}];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" continueBlock(nil, error);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" } else {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" QCloudCredential* crendential = [[QCloudCredential alloc] init];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" crendential.secretID = response[@\\\"data\\\"][@\\\"credentials\\\"][@\\\"tmpSecretId\\\"];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" crendential.secretKey = response[@\\\"data\\\"][@\\\"credentials\\\"][@\\\"tmpSecretKey\\\"];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" credential.startDate =[NSDate dateWithTimeIntervalSince1970:@\\\"반환된 서버 시간\\\"]\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" crendential.experationDate = [NSDate dateWithTimeIntervalSinceNow:[response[@\\\"data\\\"][@\\\"expiredTime\\\"] intValue]];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" crendential.token = response[@\\\"data\\\"][@\\\"credentials\\\"][@\\\"sessionToken\\\"];;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" QCloudAuthentationV5Creator* creator = [[QCloudAuthentationV5Creator alloc] initWithCredential:crendential];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" continueBlock(creator, nil);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" [[QCloudHTTPSessionManager shareClient] performRequest:request];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"iOS에서 COS로 파일을 업로드 및 다운로드하는 방법은 iOS SDK의 \"},{\"children\":[{\"text\":\"시작하기\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/11280\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/11280\"},\"type\":\"ref\"},{\"text\":\"를 참조하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"체험\"}],\"nodeId\":\".EC.B2.B4.ED.97.98\",\"type\":\"h3\"},{\"children\":[{\"text\":\"Android\"}],\"nodeId\":\"android2\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"여기\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://cos-terminal-resource-1253960454.cos.ap-shanghai.myqcloud.com/cos-transfer-practice.apk\",\"props\":{\"type\":\"link\",\"url\":\"https://cos-terminal-resource-1253960454.cos.ap-shanghai.myqcloud.com/cos-transfer-practice.apk\"},\"type\":\"ref\"},{\"text\":\"를 클릭하거나 Android 휴대폰 브라우저 App으로 아래의 QR코드를 스캔하면 체험용 demo를 다운로드할 수 있습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/8b19785ec487d3e89711063bf80716a6.png\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"iOS\"}],\"nodeId\":\"ios2\",\"type\":\"h4\"},{\"children\":[{\"text\":\"iOS의 전체 코드에 관한 내용은 \"},{\"children\":[{\"text\":\"COS iOS Demo\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-sdk-ios-samples\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-sdk-ios-samples\"},\"type\":\"ref\"},{\"text\":\"를 참조하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"QCloudCOSXMLDemo/QCloudCOSXMLDemo/key.json 파일에 APPID, secretID, secretKey 매개변수 값을 입력한 뒤 다음 명령어를 실행합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"pod install\"}],\"type\":\"code-line\"}],\"language\":\"plaintext\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" APPID, secretID, secretKey는 \"},{\"children\":[{\"text\":\"API Keys\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cam/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/capi\"},\"type\":\"ref\"},{\"text\":\" 페이지에서 받을 수 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"명령어를 실행한 뒤 QCloudCOSXMLDemo.xcworkspace를 열면 Demo 체험으로 이동할 수 있습니다.\"}],\"type\":\"p\"}]"}},"30931":{"categoryId":436,"weight":50,"type":"page","extension":"","pid":12473,"id":30931,"lang":"ko","title":"서브 계정에 태그별 버킷 가져오기 권한 부여","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:11","recentReleaseTime":"2019-12-06 19:34:11","content":{"title":"서브 계정에 태그별 버킷 가져오기 권한 부여","body":"

소개

Cloud Object Storage(COS)를 사용하면 콘솔에서 또는 API를 통해 태그별로 버킷을 필터링할 수 있습니다. 이는 태그별 권한 부여를 기반으로 구현됩니다.

전제 조건

버킷에 버킷 태그가 구성되었습니다. 구성되지 않은 경우 버킷의 태그를 설정합니다 가이드에 따라 구성하십시오.
서브 계정이 생성되었습니다(예: 사용자 이름 SubUser). 생성되지 않은 경우 새로운 서브 사용자 생성 가이드에 따라 생성하십시오.

인증 단계

1. 루트 계정 Owner로 CAM 콘솔에 로그인하고 정책 구성 페이지로 이동합니다.
2. 다음과 같이 정책 생성기 또는 정책 구문을 통해 지정된 태그가 있는 버킷에 대한 서브 계정 SubUser 액세스 권한을 부여합니다.
정책 생성기 사용
1. CAM 콘솔 구성 페이지로 이동합니다.
2. 사용자 지정 정책 생성 > 정책 생성기에서 생성을 클릭합니다.
3. 권한 구성 페이지로 이동하여 다음과 같이 정보를 구성합니다.
효과: 허용이 선택되어 있으며, 기본값에서 변경하지 않습니다.
서비스: COS를 선택합니다.
작업: 목록 작업> GetService(버킷 목록 가져오기)를 선택합니다.
리소스: 모든 리소스를 선택합니다.
조건: 기타 조건 추가를 클릭합니다. 패널에서 다음을 구성합니다.
조건 키: qcs:resource_tag를 선택합니다.
오퍼레이터: string_equal을 선택합니다.
조건 값: key&val 형식으로 태그를 입력합니다. 여기에서 key와 value을 각각 태그 키와 값으로 바꿉니다.
4. 다음을 클릭하고 정책 이름을 입력합니다.
5. 완료를 클릭하면 생성이 완료됩니다.
정책 구문
1. CAM 콘솔 구성 페이지로 이동합니다.
2. 사용자 지정 정책 생성 > 정책 구문으로 생성을 클릭합니다.
3. 빈 템플릿을 선택하고 다음을 클릭합니다.
4. 다음 형식으로 정책을 입력합니다. 여기에서 key와 value을 각각 지정된 태그 키와 값으로 바꿉니다.
{
"version": "2.0",
"statement": [
{
"effect": "allow",
"action":[
"name/cos:GetService"
],
"resource": "*",
"condition":{
"for_any_value:string_equal":{
"qcs:resource_tag": [
"key&value"
]
}
}
}
]
}
5. 완료를 클릭하면 생성이 완료됩니다.
3. 정책 페이지의 2단계에서 생성한 정책을 찾고 오른쪽에서 사용자/사용자 그룹/역할 연결을 클릭하여 정책을 서브 계정 SubUser와 연결합니다.
4. 팝업 창에서 서브 계정 SubUser를 선택하고 확인을 클릭하면 서브 계정 SubUser를 해당 정책에 연결할 수 있습니다.

콘솔에서 보기

1. 서브 계정 SubUser로 COS 콘솔에 로그인합니다.
2. 버킷 목록 페이지에는 서브 계정이 액세스할 수 있는 버킷 목록이 자동으로 표시됩니다.
이제 지정된 태그(key 및 value)가 있는 버킷에 대한 서브 계정 액세스 권한 부여가 완료되었습니다.

API 호출

주의:
콘솔과 달리 GetService API는 서브 계정이 액세스할 수 있는 버킷 목록을 자동으로 표시할 수 없으며 태그 매개변수를 전달해야 합니다.
현재 GetService API를 사용하면 하나의 태그만 전달할 수 있습니다.
1. 서브 계정 SubUser의 키로 요청을 시작합니다.
2. GetService API를 호출하여 (key, value)와 같은 태그 필터링 매개변수를 전달합니다. 아래는 샘플 요청입니다. 자세한 내용은 GET Service(List Buckets)를 참고하십시오.
GET /?tagkey=key1&tagvalue=value1 HTTP/1.1
Host: service.cos.myqcloud.com
Date: Fri, 24 May 2019 11:59:51 GMT
Authorization: Auth String

","recentReleaseTime":"2025-12-31 17:57:34","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"qClrT9Gqy-zMqEcVcVxfU\"},{\"children\":[{\"text\":\"Cloud Object Storage(COS)를 사용하면 콘솔에서 또는 API를 통해 태그별로 버킷을 필터링할 수 있습니다. 이는 태그별 권한 부여를 기반으로 구현됩니다.\"}],\"type\":\"p\",\"id\":\"mwyfs2gRX_55D6l0RaEiu\"},{\"id\":\"MSS9_eoNChHzzSY9xmoSv\",\"type\":\"h2\",\"children\":[{\"text\":\"전제 조건\"}],\"nodeId\":\"e3950897-e31a-4c3b-8b23-439539b4d581\"},{\"id\":\"Zu_K8s_esU-Md9GO-IpAE\",\"type\":\"uli\",\"children\":[{\"text\":\"버킷에 버킷 태그가 구성되었습니다. 구성되지 않은 경우 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/31509\"},\"children\":[{\"text\":\"버킷의 태그를 설정합니다\"}],\"id\":\"jzYWSKpSVwszd6kGEMx4e\"},{\"text\":\" 가이드에 따라 구성하십시오.\"}]},{\"id\":\"S6eVzgy2CNs0ptXcgR0kh\",\"type\":\"uli\",\"children\":[{\"text\":\"서브 계정이 생성되었습니다(예: 사용자 이름 SubUser). 생성되지 않은 경우 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/598/13674\"},\"children\":[{\"text\":\"새로운 서브 사용자 생성\"}],\"id\":\"fnzGXhGzyVa6UO245PgCL\"},{\"text\":\" 가이드에 따라 생성하십시오.\"}]},{\"children\":[{\"text\":\"인증 단계\"}],\"nodeId\":\".EC.9D.B8.EC.A6.9D-.EB.8B.A8.EA.B3.84\",\"type\":\"h2\",\"id\":\"o2HRm_PNnuubZB1qn8qoO\"},{\"children\":[{\"text\":\"루트 계정 Owner로 \"},{\"children\":[{\"text\":\"CAM 콘솔\"}],\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/policy\"},\"type\":\"ref\",\"id\":\"TvW4OrC1GRfcaWLAyXHFM\"},{\"text\":\"에 로그인하고 정책 구성 페이지로 이동합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"vmZpdGb6FcYkp1DcaPNiH\"},{\"children\":[{\"text\":\"다음과 같이 \"},{\"b\":1,\"text\":\"정책 생성기\"},{\"text\":\" 또는 \"},{\"b\":1,\"text\":\"정책 구문\"},{\"text\":\"을 통해 지정된 태그가 있는 버킷에 대한 서브 계정 SubUser 액세스 권한을 부여합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"gYgf4IrZ6kzTlQekrvCNs\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"CAM 콘솔 구성\"}],\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/policy\"},\"type\":\"ref\",\"id\":\"YtKa86DdtSofxLwdmrAE8\"},{\"text\":\" 페이지로 이동합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"xO3qMDXfS0YKNZWWjqI09\"},{\"children\":[{\"b\":1,\"text\":\"사용자 지정 정책 생성 > 정책 생성기에서 생성\"},{\"text\":\"을 클릭합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"SEaK_ne-KzKGiOjweuB9z\"},{\"children\":[{\"text\":\"권한 구성 페이지로 이동하여 다음과 같이 정보를 구성합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"YVbUnIkJfIV0CpfPLWajA\"},{\"children\":[{\"b\":1,\"text\":\"효과\"},{\"text\":\": 허용이 선택되어 있으며, 기본값에서 변경하지 않습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"F3NEivDBnqK1Lg6dQrM9T\"},{\"children\":[{\"b\":1,\"text\":\"서비스\"},{\"text\":\": COS를 선택합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"-8GnWIFDPKlowDfildcai\"},{\"id\":\"S9euXNG4lpcLIXN4IvdmW\",\"children\":[{\"text\":\"작업\",\"b\":1},{\"text\":\": \"},{\"text\":\"목록 작업\",\"b\":1},{\"text\":\">\"},{\"b\":1,\"text\":\" GetService(버킷 목록 가져오기)\"},{\"text\":\"를 선택합니다.\"}],\"type\":\"uli\",\"start\":false,\"indent\":1},{\"children\":[{\"b\":1,\"text\":\"리소스\"},{\"text\":\": \"},{\"b\":1,\"text\":\"모든 리소스\"},{\"text\":\"를 선택합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"Ewa9UbElWi0TDWG8SbBom\"},{\"children\":[{\"b\":1,\"text\":\"조건\"},{\"text\":\": \"},{\"b\":1,\"text\":\"기타 조건 추가\"},{\"text\":\"를 클릭합니다. 패널에서 다음을 구성합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"DXZeTFYZ5jxS6RnOqYMUX\"},{\"children\":[{\"b\":1,\"text\":\"조건 키\"},{\"text\":\": \"},{\"code\":1,\"text\":\"qcs:resource_tag\"},{\"text\":\"를 선택합니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"MmmM6Pq1bw7DKC26ZtiHL\"},{\"children\":[{\"b\":1,\"text\":\"오퍼레이터\"},{\"text\":\": \"},{\"code\":1,\"text\":\"string_equal\"},{\"text\":\"을 선택합니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"cLBEzETB9BIXqIvjraBEV\"},{\"children\":[{\"b\":1,\"text\":\"조건 값\"},{\"text\":\": \"},{\"code\":1,\"text\":\"key&val\"},{\"text\":\" 형식으로 태그를 입력합니다. 여기에서 key와 value을 각각 태그 키와 값으로 바꿉니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"CMtUXj8sEcZcCjY_OISea\"},{\"children\":[{\"b\":1,\"text\":\"다음\"},{\"text\":\"을 클릭하고 정책 이름을 입력합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"lTZOQ4s_1Jw7BMOpNFnaJ\"},{\"children\":[{\"b\":1,\"text\":\"완료\"},{\"text\":\"를 클릭하면 생성이 완료됩니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"gIIhfVAd9NwXgtzrhrWq_\"}],\"id\":\"3\",\"name\":\"정책 생성기 사용\",\"type\":\"tab\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"CAM 콘솔 구성\"}],\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/policy\"},\"type\":\"ref\",\"id\":\"JsjI4KRfcNWXs6DbR6TlR\"},{\"text\":\" 페이지로 이동합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"xqSMJwIhOTRko0I0Pmq0K\"},{\"children\":[{\"b\":1,\"text\":\"사용자 지정 정책 생성 > 정책 구문으로 생성\"},{\"text\":\"을 클릭합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"-djiR6QCTDSTgKoz-_ZN8\"},{\"children\":[{\"text\":\"빈 템플릿을 선택하고 \"},{\"b\":1,\"text\":\"다음\"},{\"text\":\"을 클릭합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"kU_riStMoO8aJZlGadO0A\"},{\"children\":[{\"text\":\"다음 형식으로 정책을 입력합니다. 여기에서 key와 value을 각각 지정된 태그 키와 값으로 바꿉니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"Ugnp2gBFoyk57T22Pa1Uc\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"rGdW1iJ9oLmC-51xu0soG\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"type\":\"code-line\",\"id\":\"iV1AT2ewIziJrfEI-LnZ3\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"type\":\"code-line\",\"id\":\"G0PNKt30GeOHh78jAsO1I\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"gmVsRK9mv3wZOQaG5Xqtj\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\",\"id\":\"cVqGjBwznxxBqWH0qWax3\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"type\":\"code-line\",\"id\":\"7xjk9B2s6qr90AUwA-AR5\"},{\"children\":[{\"text\":\" \\\"name/cos:GetService\\\"\"}],\"type\":\"code-line\",\"id\":\"yGbYDu19XwAkOD_AHB-iw\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"Os01D4zke9vSbp30rd8kJ\"},{\"children\":[{\"text\":\" \\\"resource\\\": \\\"*\\\",\"}],\"type\":\"code-line\",\"id\":\"YSCBA-Daddyg-49z1cfXm\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"type\":\"code-line\",\"id\":\"dEvvPdvKmBLnid177-4E7\"},{\"children\":[{\"text\":\" \\\"for_any_value:string_equal\\\":{\"}],\"type\":\"code-line\",\"id\":\"m9DMFu_1XbpIvhD1twLmx\"},{\"children\":[{\"text\":\" \\\"qcs:resource_tag\\\": [\"}],\"type\":\"code-line\",\"id\":\"GU0_aOT3IfDrKJuk0U5CY\"},{\"children\":[{\"text\":\" \\\"key&value\\\"\"}],\"type\":\"code-line\",\"id\":\"yA0SxhH6yF64kY69n9iCZ\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"7coJ5KkkNSTq3R-TS6XGf\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"9rzxS6TzibaMMgTsrzM6y\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"w0FPNocA2KIn8QNRykKyH\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"O_mnvmU2gRDBdEfpb4fGU\"},{\"children\":[{\"text\":\" ]\"}],\"type\":\"code-line\",\"id\":\"WbLbd9km669L3FDHvthk0\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"SBHbHVh0fJMSIvjv3PZ_g\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"w-XJzqsSOTirg12Ey3HSo\",\"autoWrap\":false},{\"children\":[{\"b\":1,\"text\":\"완료\"},{\"text\":\"를 클릭하면 생성이 완료됩니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"Ba8fJr8asQdGGSUSfqi5_\"}],\"id\":\"4\",\"name\":\"정책 구문\",\"type\":\"tab\"}],\"type\":\"tabs\",\"id\":\"H7sw1kLaosIsg80MH6jB7\"},{\"children\":[{\"text\":\"정책 페이지의 2단계에서 생성한 정책을 찾고 오른쪽에서 \"},{\"b\":1,\"text\":\"사용자/사용자 그룹/역할\"},{\"text\":\" 연결을 클릭하여 정책을 서브 계정 SubUser와 연결합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"E3FG9ZjnkOisPrLLZDKti\"},{\"children\":[{\"text\":\"팝업 창에서 서브 계정 SubUser를 선택하고 \"},{\"text\":\"확인\",\"b\":1},{\"text\":\"을 클릭하면 서브 계정 SubUser를 해당 정책에 연결할 수 있습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"lIfLwVuMY8YUWPJH_61c0\"},{\"children\":[{\"text\":\"콘솔에서 보기\"}],\"nodeId\":\".EC.BD.98.EC.86.94.EC.97.90.EC.84.9C-.EB.B3.B4.EA.B8.B0\",\"type\":\"h2\",\"id\":\"j6OL5Nb1M2R1AxM3oc1-s\"},{\"children\":[{\"text\":\"서브 계정 SubUser로 \"},{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\",\"id\":\"Y7Z9jyMz6_cr-1RODL7dH\"},{\"text\":\"에 로그인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"0M51_XeEBxOGBtfjpb7y1\"},{\"children\":[{\"text\":\"버킷 목록 페이지에는 \"},{\"b\":1,\"text\":\"서브 계정이 액세스할 수 있는 버킷 목록이 자동으로 표시됩니다\"},{\"text\":\".\"}],\"start\":false,\"type\":\"oli\",\"id\":\"KraKMFep-QfAGvpfUD6sf\"},{\"children\":[{\"text\":\"이제 지정된 태그(key 및 value)가 있는 버킷에 대한 서브 계정 액세스 권한 부여가 완료되었습니다.\"}],\"type\":\"p\",\"id\":\"UW5_sOoFIYgMDEpm7VyBM\"},{\"children\":[{\"text\":\"API 호출\"}],\"nodeId\":\"api-.ED.98.B8.EC.B6.9C\",\"type\":\"h2\",\"id\":\"rQhiMwv9rnx78iiWUEjR9\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"FjACW6DAP-7dv4zcriNLp\"},{\"children\":[{\"text\":\"콘솔과 달리 GetService API는 서브 계정이 액세스할 수 있는 버킷 목록을 자동으로 표시할 수 없으며 태그 매개변수를 전달해야 합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"6mLxV4YPMS9tXSb-kvTDG\"},{\"children\":[{\"text\":\"현재 GetService API를 사용하면 하나의 태그만 전달할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"2NtRo5jjSEtsR_M9kjD0m\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"DlylohMfxpOeVbhD_VY4i\"},{\"children\":[{\"text\":\"서브 계정 SubUser의 키로 요청을 시작합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"0iKxcJAZ7e19olJROxXr7\"},{\"children\":[{\"text\":\"GetService API를 호출하여 (key, value)와 같은 태그 필터링 매개변수를 전달합니다. 아래는 샘플 요청입니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"GET Service(List Buckets)\"}],\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/8291\"},\"type\":\"ref\",\"id\":\"7RfdBlqBM1t-_loxTNoJo\"},{\"text\":\"를 참고하십시오.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"IC836IMH4BjWrnBVdCx0w\"},{\"children\":[{\"children\":[{\"text\":\"GET /?tagkey=key1&tagvalue=value1 HTTP/1.1\"}],\"type\":\"code-line\",\"id\":\"5IjkfdYCs26KiI9I32Xwn\"},{\"type\":\"code-line\",\"children\":[{\"text\":\"Host: service.cos.myqcloud.com\"}],\"id\":\"p7e3KIHJY2i3ZWVMp1lhu\"},{\"children\":[{\"text\":\"Date: Fri, 24 May 2019 11:59:51 GMT\"}],\"type\":\"code-line\",\"id\":\"m3r5kqIRzbg94R4IGQ8As\"},{\"children\":[{\"text\":\"Authorization: Auth String\"}],\"type\":\"code-line\",\"id\":\"xFQaPD_XV-BqbcVEhTlD6\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"EY1Zb5EomtKUGo1ySyYWx\",\"autoWrap\":false,\"executionContext\":{}},{\"type\":\"p\",\"children\":[{\"text\":\"\"}],\"id\":\"PkkwRX3-tRBnpTRJjHOqX\"}]"}},"32466":{"categoryId":436,"weight":74,"type":"page","extension":"","pid":32967,"id":32466,"lang":"ko","title":"링크 도용 방지 사례","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:12","recentReleaseTime":"2019-12-06 19:34:12","content":{"title":"링크 도용 방지 사례","body":"

소개

Tencent Cloud COS는 링크 도용 방지 설정을 지원합니다. 사용자는 버킷에 링크 도용 방지 기능을 통해 액세스 출처에 대한 블랙리스트/화이트리스트 설정으로 리소스 도용을 방지할 수 있습니다. 본 문서에서는 버킷에 링크 도용 방지 기능을 설정하여 리소스가 도용되지 않도록 하는 방법을 자세히 소개합니다.

링크 도용 방지 판단 원리

링크 도용 방지는 Header의 Referer 주소를 요청하여 판단합니다.
Referer는 Header의 일부입니다. 브라우저가 Web 서버에 요청을 발송할 때 Referer를 통해 해당 요청이 어느 페이지에서 링크된 것인지 서버에 알리면, 서버에서 특정 출처의 웹 사이트에 대한 리소스 액세스를 금지하거나 허용할 수 있습니다.
브라우저에서 직접 파일 링크 https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/1.jpg를 열 경우, 요청 Header에 Referer가 존재하지 않습니다.
예를 들어, 아래 이미지와 같이 https://127.0.0.1/test/test.html에 이미지 1.jpg를 삽입하고 https://127.0.0.1/test/test.html에 액세스할 경우 액세스 출처를 표시하는 Referer가 존재합니다.\n
\"\"



링크 도용 사례 분석

사용자 A가 COS에 이미지 리소스 1.jpg를 업로드하여 이미지 액세스 링크 https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/1.jpg를 획득한 경우,
사용자 A가 해당 이미지를 자신의 웹 페이지 https://example.com/index.html에 삽입하면 이미지에 정상적으로 액세스할 수 있습니다.
사용자 B가 사용자 A의 웹 페이지에서 해당 이미지를 보고 해당 이미지를 자신의 웹 페이지 https://b.com/test/test.html에 삽입하면, 해당 이미지는 사용자 B의 웹 페이지에서도 정상적으로 표시됩니다.\n위 사례는 사용자 A의 이미지 리소스 1.jpg의 링크가 사용자 B에 의해 도용된 경우입니다. 이때 사용자 A가 알지 못하는 상황에서 COS 상의 리소스가 사용자 B의 웹 페이지에서 계속 사용되는 경우, 사용자 A는 별도의 트래픽 요금을 부담하는 손실이 발생합니다.

해결 방법

링크 도용 사례 분석의 경우 사용자 A는 링크 도용 방지 설정을 통해 사용자 B의 이미지 링크 도용을 방지할 수 있습니다. 자세한 방법은 다음과 같습니다.
1. 사용자 A가 버킷 examplebucket-1250000000에 링크 도용 방지 규칙을 설정합니다. 사용자 B의 링크 도용을 방지하는 방법은 두 가지가 있습니다.
방법1: 블랙리스트 모드를 설정합니다. 도메인 설정에 *.b.com을 입력하고 저장하면 적용됩니다.
방법2: 화이트리스트 모드를 설정합니다. 도메인 설정에 *.example.com을 입력하고 저장하면 적용됩니다.
2. 링크 도용 방지 설정 활성화 후,
https://example.com/index.html에 액세스하면 이미지가 정상적으로 표시됩니다.
https://b.com/test/test.html에 액세스하면 이미지가 표시되지 않으며, 다음과 같이 표시됩니다.\n
\"\"



자세한 방법

1. COS 콘솔에 로그인한 후, 왼쪽 메뉴에서 [버킷 리스트]를 클릭해 버킷 리스트 페이지로 이동합니다.
2. 링크 도용 방지를 설정할 버킷을 선택하여 버킷으로 이동합니다.\n
\"\"


3. 왼쪽 메뉴에서 [보안 관리]>[링크 도용 방지 설정]을 클릭해 버킷 링크 도용 방지 설정 페이지로 이동합니다.
4. '링크 도용 방지 설정'에서 [편집]을 클릭해 편집 페이지로 이동합니다.\n
\"\"


5. 링크 도용 방지를 활성화하고 리스트 유형과 도메인을 설정합니다. 본 문서에서는 방법2를 예시로 설명합니다.
유형: 블랙리스트/화이트리스트 중 선택할 수 있습니다.
블랙리스트: 리스트에 있는 도메인이 버킷의 기본 액세스 주소에 액세스하는 것을 제한합니다. 리스트에 있는 도메인이 버킷의 기본 액세스 주소에 액세스하는 경우 403을 반환합니다.
화이트리스트: 리스트에 없는 도메인이 버킷의 기본 액세스 주소에 액세스하는 것을 제한합니다. 리스트에 없는 도메인이 버킷의 기본 액세스 주소에 액세스하는 경우 403을 반환합니다.
Referer: 도메인 설정은 최대 10개의 도메인 및 접두사 매칭이 가능하고 도메인, IP, 와일드카드 부호 * 등 형식의 주소를 지원합니다. 주소 1개당 한 행을 차지하며, 주소가 여러 개인 경우 줄 바꿈을 합니다. 규칙 설정에 대한 설명과 예시는 다음과 같습니다.
포트가 있는 도메인 및 IP를 지원합니다(예: example.com:8080, 10.10.10.10:8080 등의 주소).
example.com을 설정하면 example.com/123과 같이 example.com을 접두사로 하는 주소가 히트됩니다.
example.com을 설정하면 https://example.comhttp://example.com을 접두사로 하는 주소가 히트됩니다.
example.com을 설정하면 포트가 있는 도메인 example.com:8080이 히트됩니다.
example.com:8080을 설정하면 도메인 example.com이 히트되지 않습니다.
*.example.com을 설정하면 2단계, 3단계 도메인 example.com, b.example.com, a.b.example.com을 제한할 수 있습니다.
주의:
링크 도용 방지를 활성화하는 경우 반드시 상응하는 도메인을 입력해야 합니다.
6. 설정 완료 후 [저장]을 클릭하면 활성화됩니다.\n
\"\"



FAQ

링크 도용 방지에 대해 궁금한 사항은 COS FAQ의 데이터 보안 문서에서 확인할 수 있습니다.
","recentReleaseTime":"2025-11-13 17:25:25","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"e-X_OIxgCd_DKayAykV8x\"},{\"children\":[{\"text\":\"Tencent Cloud COS는 링크 도용 방지 설정을 지원합니다. 사용자는 버킷에 링크 도용 방지 기능을 통해 액세스 출처에 대한 블랙리스트/화이트리스트 설정으로 리소스 도용을 방지할 수 있습니다. 본 문서에서는 버킷에 링크 도용 방지 기능을 설정하여 리소스가 도용되지 않도록 하는 방법을 자세히 소개합니다.\"}],\"type\":\"p\",\"id\":\"oLO3sXr2LNYGg7_EXFBdW\"},{\"children\":[{\"text\":\"링크 도용 방지 판단 원리\"}],\"nodeId\":\".EB.A7.81.ED.81.AC-.EB.8F.84.EC.9A.A9-.EB.B0.A9.EC.A7.80-.ED.8C.90.EB.8B.A8-.EC.9B.90.EB.A6.AC\",\"type\":\"h2\",\"id\":\"xPtIEReEjlX6v-Soy_Ur1\"},{\"children\":[{\"text\":\"링크 도용 방지는 Header의 Referer 주소를 요청하여 판단합니다.\"}],\"type\":\"p\",\"id\":\"BVoGvMwm7tJhh9dL_8Ha_\"},{\"children\":[{\"text\":\"Referer는 Header의 일부입니다. 브라우저가 Web 서버에 요청을 발송할 때 Referer를 통해 해당 요청이 어느 페이지에서 링크된 것인지 서버에 알리면, 서버에서 특정 출처의 웹 사이트에 대한 리소스 액세스를 금지하거나 허용할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"NRb5wJiuthNkDj8t6Uj4s\"},{\"children\":[{\"text\":\"브라우저에서 직접 파일 링크 \"},{\"code\":1,\"text\":\"https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/1.jpg\"},{\"text\":\"를 열 경우, 요청 Header에 Referer가 존재하지 않습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"lKlNcCSV1nYVlraxJQWtW\"},{\"children\":[{\"text\":\"예를 들어, 아래 이미지와 같이 \"},{\"code\":1,\"text\":\"https://127.0.0.1/test/test.html\"},{\"text\":\"에 이미지 \"},{\"code\":1,\"text\":\"1.jpg\"},{\"text\":\"를 삽입하고 \"},{\"code\":1,\"text\":\"https://127.0.0.1/test/test.html\"},{\"text\":\"에 액세스할 경우 액세스 출처를 표시하는 Referer가 존재합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/60a86b1a71d911f09e39525400454e06.jpeg\",\"id\":\"asZ34TvtX-F4xYlZqZVM3\",\"naturalSize\":[1616,568],\"size\":[974,342]},{\"color\":\"red\",\"text\":\"\"}],\"type\":\"p\",\"id\":\"eeqyo2KyYY0v6ZoPmKQng\"},{\"children\":[{\"text\":\"링크 도용 사례 분석\"}],\"nodeId\":\"fenxi\",\"type\":\"h2\",\"id\":\"krpwILTlQmdQ-mczn-OsJ\"},{\"children\":[{\"text\":\"사용자 A가 COS에 이미지 리소스 \"},{\"code\":1,\"text\":\"1.jpg\"},{\"text\":\"를 업로드하여 이미지 액세스 링크 \"},{\"code\":1,\"text\":\"https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/1.jpg\"},{\"text\":\"를 획득한 경우,\"}],\"type\":\"p\",\"id\":\"69pjAuEjPLK66A7wCnSux\"},{\"children\":[{\"text\":\"사용자 A가 해당 이미지를 자신의 웹 페이지 \"},{\"code\":1,\"text\":\"https://example.com/index.html\"},{\"text\":\"에 삽입하면 이미지에 정상적으로 액세스할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"ILBas_qQYai0K_Fzxlu_n\"},{\"children\":[{\"text\":\"사용자 B가 사용자 A의 웹 페이지에서 해당 이미지를 보고 해당 이미지를 자신의 웹 페이지 \"},{\"code\":1,\"text\":\"https://b.com/test/test.html\"},{\"text\":\"에 삽입하면, 해당 이미지는 사용자 B의 웹 페이지에서도 정상적으로 표시됩니다.\\n위 사례는 사용자 A의 이미지 리소스 \"},{\"code\":1,\"text\":\"1.jpg\"},{\"text\":\"의 링크가 사용자 B에 의해 도용된 경우입니다. 이때 사용자 A가 알지 못하는 상황에서 COS 상의 리소스가 사용자 B의 웹 페이지에서 계속 사용되는 경우, 사용자 A는 별도의 트래픽 요금을 부담하는 손실이 발생합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"Gx_ov61EshMpV0HwwZbnF\"},{\"children\":[{\"text\":\"해결 방법\"}],\"nodeId\":\".ED.95.B4.EA.B2.B0-.EB.B0.A9.EB.B2.95\",\"type\":\"h2\",\"id\":\"f7f4qk8Wvobd_BkaJf3q6\"},{\"children\":[{\"text\":\"위 \"},{\"children\":[{\"text\":\"링크 도용 사례 분석\"}],\"linkTarget\":\"self\",\"linkTitle\":\"#fenxi\",\"props\":{\"type\":\"link\",\"url\":\"#fenxi\"},\"type\":\"ref\",\"id\":\"Pkh8NO-JB5k7_y6k56Gd3\"},{\"text\":\"의 경우 사용자 A는 링크 도용 방지 설정을 통해 사용자 B의 이미지 링크 도용을 방지할 수 있습니다. 자세한 방법은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"BMKZ4klveSnQnMb5Weycz\"},{\"children\":[{\"text\":\"사용자 A가 버킷 examplebucket-1250000000에 링크 도용 방지 규칙을 설정합니다. 사용자 B의 링크 도용을 방지하는 방법은 두 가지가 있습니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"ayl9JyinQxYVcBu1dtMPr\"},{\"children\":[{\"text\":\"방법1: 블랙리스트 모드를 설정합니다. 도메인 설정에 \"},{\"code\":1,\"text\":\"*.b.com\"},{\"text\":\"을 입력하고 저장하면 적용됩니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"eS9TV7jv9iTV0juvgVP51\"},{\"children\":[{\"text\":\"방법2: 화이트리스트 모드를 설정합니다. 도메인 설정에 \"},{\"code\":1,\"text\":\"*.example.com\"},{\"text\":\"을 입력하고 저장하면 적용됩니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"Gx_n4b7wsaBqnPTmKDOsL\"},{\"children\":[{\"text\":\"링크 도용 방지 설정 활성화 후,\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"F6KHNy7Anxo4ETzcfhxM5\"},{\"children\":[{\"code\":1,\"text\":\"https://example.com/index.html\"},{\"text\":\"에 액세스하면 이미지가 정상적으로 표시됩니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"m09MO_RRVh2fwmAmgRmsB\"},{\"children\":[{\"code\":1,\"text\":\"https://b.com/test/test.html\"},{\"text\":\"에 액세스하면 이미지가 표시되지 않으며, 다음과 같이 표시됩니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/606e00e071d911f09e39525400454e06.jpeg\",\"id\":\"OKPWoOGvXmRNHwwZ3KLCg\",\"naturalSize\":[1516,457],\"size\":[953,287]},{\"text\":\"\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"zrGRSzltwd4OrwWfZQdZX\"},{\"children\":[{\"text\":\"자세한 방법\"}],\"nodeId\":\".EC.9E.90.EC.84.B8.ED.95.9C-.EB.B0.A9.EB.B2.95\",\"type\":\"h2\",\"id\":\"LQdrwgL299a0CE1vZJuLx\"},{\"children\":[{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\",\"id\":\"tj6tQ2urxL8IfUsVZeTdI\"},{\"text\":\"에 로그인한 후, 왼쪽 메뉴에서 [버킷 리스트]를 클릭해 버킷 리스트 페이지로 이동합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"ApHE1Ph6nMLS6qcBqJPno\"},{\"children\":[{\"text\":\"링크 도용 방지를 설정할 버킷을 선택하여 버킷으로 이동합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/6069979d71d911f09f3d52540099c741.png\",\"id\":\"SHrRwjQz5THBHNg5y1yU6\",\"naturalSize\":[967,95],\"size\":[953,93]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"IZanvdJGsL9nihCmN2V-v\"},{\"children\":[{\"text\":\"왼쪽 메뉴에서 [보안 관리]>[링크 도용 방지 설정]을 클릭해 버킷 링크 도용 방지 설정 페이지로 이동합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"LF05snUndGXFCkHFdBkXD\"},{\"children\":[{\"text\":\"'링크 도용 방지 설정'에서 [편집]을 클릭해 편집 페이지로 이동합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/606cb6e571d911f084fc525400bf7822.png\",\"id\":\"jxqiINTiCazpqihB5xtIt\",\"naturalSize\":[315,110],\"size\":[315,110]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"obFusVwUpFSvQ-NSjgMvO\"},{\"children\":[{\"text\":\"링크 도용 방지를 활성화하고 리스트 유형과 도메인을 설정합니다. 본 문서에서는 방법2를 예시로 설명합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"koGUm3wA7boTMQ5KKAkIP\"},{\"children\":[{\"b\":1,\"text\":\"유형\"},{\"text\":\": 블랙리스트/화이트리스트 중 선택할 수 있습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"gEqBBJzy5necFJzFgu5b-\"},{\"children\":[{\"b\":1,\"text\":\"블랙리스트\"},{\"text\":\": 리스트에 있는 도메인이 버킷의 기본 액세스 주소에 액세스하는 것을 제한합니다. \"},{\"b\":1,\"text\":\"리스트에 있는\"},{\"text\":\" 도메인이 버킷의 기본 액세스 주소에 액세스하는 경우 403을 반환합니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"fyxVJwLG79VGkEMp0uz9E\"},{\"children\":[{\"b\":1,\"text\":\"화이트리스트\"},{\"text\":\": 리스트에 없는 도메인이 버킷의 기본 액세스 주소에 액세스하는 것을 제한합니다. \"},{\"b\":1,\"text\":\"리스트에 없는\"},{\"text\":\" 도메인이 버킷의 기본 액세스 주소에 액세스하는 경우 403을 반환합니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"8Go_5yQY_TQ_U1VSbeVZo\"},{\"children\":[{\"b\":1,\"text\":\"Referer\"},{\"text\":\": 도메인 설정은 최대 10개의 도메인 및 접두사 매칭이 가능하고 도메인, IP, 와일드카드 부호 \"},{\"code\":1,\"text\":\"*\"},{\"text\":\" 등 형식의 주소를 지원합니다. 주소 1개당 한 행을 차지하며, 주소가 여러 개인 경우 줄 바꿈을 합니다. 규칙 설정에 대한 설명과 예시는 다음과 같습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"DMl36SBlpM6X3a-ohWqaL\"},{\"children\":[{\"text\":\"포트가 있는 도메인 및 IP를 지원합니다(예: \"},{\"code\":1,\"text\":\"example.com:8080\"},{\"text\":\", \"},{\"code\":1,\"text\":\"10.10.10.10:8080\"},{\"text\":\" 등의 주소).\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"sO11fspf6yuPgyMti_XGr\"},{\"children\":[{\"code\":1,\"text\":\"example.com\"},{\"text\":\"을 설정하면 \"},{\"code\":1,\"text\":\"example.com/123\"},{\"text\":\"과 같이 \"},{\"code\":1,\"text\":\"example.com\"},{\"text\":\"을 접두사로 하는 주소가 히트됩니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"D-PLtl4fRBhf1c3H3nHN4\"},{\"children\":[{\"code\":1,\"text\":\"example.com\"},{\"text\":\"을 설정하면 \"},{\"code\":1,\"text\":\"https://example.com\"},{\"text\":\" 및 \"},{\"code\":1,\"text\":\"http://example.com\"},{\"text\":\"을 접두사로 하는 주소가 히트됩니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"J72WbV3dhi3eZrDd5rUyr\"},{\"children\":[{\"code\":1,\"text\":\"example.com\"},{\"text\":\"을 설정하면 포트가 있는 도메인 \"},{\"code\":1,\"text\":\"example.com:8080\"},{\"text\":\"이 히트됩니다. \"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"8HwUUQx42NK4-22sfphM_\"},{\"children\":[{\"code\":1,\"text\":\"example.com:8080\"},{\"text\":\"을 설정하면 도메인 \"},{\"code\":1,\"text\":\"example.com\"},{\"text\":\"이 히트되지 않습니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"RJgyLwz0qfTLzsQI9tqIW\"},{\"children\":[{\"code\":1,\"text\":\"*.example.com\"},{\"text\":\"을 설정하면 2단계, 3단계 도메인 \"},{\"code\":1,\"text\":\"example.com\"},{\"text\":\", \"},{\"code\":1,\"text\":\"b.example.com\"},{\"text\":\", \"},{\"code\":1,\"text\":\"a.b.example.com\"},{\"text\":\"을 제한할 수 있습니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"Rq8P4QMKa69JUrZVzt3yY\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"AuCHhtgUuWnjqxUKv8Ax6\"},{\"children\":[{\"text\":\"링크 도용 방지를 \"},{\"b\":1,\"text\":\"활성화\"},{\"text\":\"하는 경우 반드시 상응하는 도메인을 입력해야 합니다.\"}],\"type\":\"p\",\"id\":\"7vte9rI23CB0_E-nlCtie\"}],\"hintType\":\"alert\",\"indent\":3,\"type\":\"hint\",\"id\":\"2z6R2_6jcSG3QOEsZHAQp\"},{\"children\":[{\"text\":\"설정 완료 후 [저장]을 클릭하면 활성화됩니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/606a1ff371d911f0bcac525400e889b2.png\",\"id\":\"oPIgCsh8bjSQseitzJ7Up\",\"naturalSize\":[755,367],\"size\":[755,367]},{\"text\":\"\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"dBgJ8XlsemANZY6rT91fP\"},{\"children\":[{\"text\":\"FAQ\"}],\"nodeId\":\"faq\",\"type\":\"h2\",\"id\":\"SmYUU6RyPoL4ic9t2Gf5Z\"},{\"children\":[{\"text\":\"링크 도용 방지에 대해 궁금한 사항은 COS FAQ의 \"},{\"children\":[{\"text\":\"데이터 보안\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/40946\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/40946\"},\"type\":\"ref\",\"id\":\"E-WIXkUoOO3wZ4qM6D8qA\"},{\"text\":\" 문서에서 확인할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"v0whS0uu3eDlRlY6_g_Gn\"}]"}},"32467":{"categoryId":436,"weight":20,"type":"page","extension":"","pid":34077,"id":32467,"lang":"ko","title":"MD5 검사","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:12","recentReleaseTime":"2019-12-06 19:34:12","content":{"title":"MD5 검사","body":"

소개

COS는 클라이언트와 서버 간 데이터를 전송할 때 발생할 수 있는 오류에 대해 MD5 검사법을 적용하여 업로드하는 데이터의 무결성을 보장합니다. COS 서버가 수락한 데이터의 MD5 해시값이 사용자가 설정한 MD5 해시값과 일치해야만 데이터를 성공적으로 업로드할 수 있습니다.
COS의 모든 객체는 대응하는 ETag가 하나씩 있습니다. ETag는 객체 생성 시 객체 콘텐츠의 정보를 표시합니다. 하지만 ETag가 객체 콘텐츠의 MD5 해시값과 반드시 동일하지는 않습니다. 따라서 ETag로 다운로드한 객체와 원본 객체의 일치성 여부를 검사할 수 없습니다. 사용자는 사용자 정의한 객체 메타데이터(x-cos-meta-*)로 다운로드한 객체와 원본 객체의 일치성 검사를 실행할 수 있습니다.

데이터 검사 방법

업로드된 객체 검사\nCOS에 업로드된 객체와 로컬 객체의 일치성 여부를 검사하려면, 업로드 시 HTTP로 요청한 Content-MD5 필드를 Base64로 인코딩된 객체 콘텐츠의 MD5 해시값으로 설정합니다. 이때 COS 서버에서 사용자가 업로드한 객체를 검사하고, COS 서버가 수락한 객체의 MD5 해시값이 사용자가 설정한 Content-MD5와 일치해야만 객체를 성공적으로 업로드할 수 있습니다.
다운로드한 객체 검사\n객체 업로드 시 검사 알고리즘으로 객체의 해시값을 계산하여 다운로드한 객체와 원본 객체의 일치 여부를 검사할 수 있습니다. 사용자 정의한 메타데이터로 객체 해시값을 설정한 뒤, 다운로드한 객체의 해시값을 다시 계산하여 사용자 정의한 메타데이터와 비교 인증합니다. 이 경우, 사용자는 검사 알고리즘을 직접 선택할 수 있으며, 같은 객체를 업로드 및 다운로드할 때 사용하는 검사 알고리즘은 동일해야 합니다.

API 예시

간편 업로드 요청

다음은 사용자의 객체 업로드 요청 예시입니다. 객체를 업로드할 때 Content-MD5를 Base64로 인코딩된 객체 콘텐츠의 MD5 해시값으로 설정합니다. 이 때 COS 서버에서 수락한 객체의 MD5 해시값과 사용자가 설정한 Content-MD5가 동일해야 객체를 성공적으로 업로드할 수 있으며, 사용자 정의한 메타데이터 x-cos-meta-md5를 객체의 해시값으로 설정합니다.
설명:
다음 예시는 MD5 검사 알고리즘으로 얻은 객체 해시값이며, 다른 검사 알고리즘을 적용해도 됩니다.
PUT /exampleobject HTTP/1.1
Host: examplebucket-1250000000.cos.ap-beijing.myqcloud.com
Date: Fri, 21 Jun 2019 09:24:28 GMT
Content-Type: image/jpeg
Content-Length: 13
Content-MD5: ti4QvKtVqIJAvZxDbP/c+Q==
Authorization: q-sign-algorithm=sha1&q-ak=AKID8A0fBVtYFrNm02oY1g1JQQF0c3JO****&q-sign-time=1561109068;1561116268&q-key-time=1561109068;1561116268&q-header-list=content-length;content-md5;content-type;date;host&q-url-param-list=&q-signature=998bfc8836fc205d09e455c14e3d7e623bd2****
x-cos-meta-md5: b62e10bcab55a88240bd9c436cffdcf9
Connection: close

[Object Content]

멀티파트 업로드 요청

다음은 멀티파트 업로드 초기화에 관한 요청 예시입니다. 객체를 멀티파트 업로드할 때 멀티파트 업로드 초기화를 통해 객체의 사용자 정의 메타데이터를 설정할 수 있습니다. 여기서는 사용자 정의한 메타데이터 x-cos-meta-md5를 객체 해시값으로 설정합니다.
POST /exampleobject?uploads HTTP/1.1
Host: examplebucket-1250000000.cos.ap-beijing.myqcloud.com
Date: Fri, 21 Jun 2019 09:45:12 GMT
Authorization: q-sign-algorithm=sha1&q-ak=AKID8A0fBVtYFrNm02oY1g1JQQF0c3JO****&q-sign-time=1561109068;1561116268&q-key-time=1561109068;1561116268&q-header-list=content-length;content-md5;content-type;date;host&q-url-param-list=&q-signature=998bfc8836fc205d09e455c14e3d7e623bd2****
x-cos-meta-md5: b62e10bcab55a88240bd9c436cffdcf9
주의:
멀티파트 업로드 파일에 대해 COS는 모든 파트에 대한 MD5 값을 검사하지만 병합한 전체 파일의 MD5 값은 계산하지 않습니다.

객체 다운로드 응답

다음은 사용자가 객체 다운로드 요청으로 얻은 응답 예시입니다. 사용자는 응답으로 객체의 사용자 정의 메타데이터 x-cos-meta-md5를 얻고, 객체 해시값을 재차 계산한 뒤 비교를 통해 다운로드한 객체와 원본 객체의 일치성 여부를 인증합니다.
HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Length: 13
Connection: close
Accept-Ranges: bytes
Cache-Control: max-age=86400
Content-Disposition: attachment; filename=example.jpg
Date: Thu, 04 Jul 2019 11:33:00 GMT
ETag: "b62e10bcab55a88240bd9c436cffdcf9"
Last-Modified: Thu, 04 Jul 2019 11:32:55 GMT
Server: tencent-cos
x-cos-request-id: NWQxZGUzZWNfNjI4NWQ2NF9lMWYyXzk1NjFj****
x-cos-meta-md5: b62e10bcab55a88240bd9c436cffdcf9

[Object Content]

SDK 예시

다음은 Python SDK를 사례로 한 객체 검사법으로, 전체 코드에 대한 예시는 다음과 같습니다.
설명:
코드는 Python 2.7을 기반으로 하였으며, Python SDK의 자세한 사용 방법은 Python SDK의 객체 작업 문서를 참조하십시오.

1. 초기화 설정

SecretId, SecretKey, Region을 포함한 사용자 속성을 설정하고, 클라이언트 객체를 생성합니다.
# -*- coding=utf-8
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
from qcloud_cos import CosServiceError
from qcloud_cos import CosClientError
import sys
import os
import logging
import hashlib

logging.basicConfig(level=logging.INFO, stream=sys.stdout)

# SecretId, SecretKey, Region을 포함한 사용자 속성을 설정합니다.
# APPID는 설정에서 삭제되었으니 매개변수 Bucket에 APPID를 입력하십시오. Bucket은 BucketName-APPID로 구성됩니다.
secret_id = os.environ['COS_SECRET_ID'] # 사용자 SecretId. 리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한 원칙을 따르는 것이 좋습니다. 서브 계정 키를 가져오는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/598/37140
secret_key = os.environ['COS_SECRET_KEY'] # 사용자 SecretKey. 리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한 원칙을 따르는 것이 좋습니다. 서브 계정 키를 가져오는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/598/37140
region = 'ap-beijing' # 사용자 Region으로 대체, 예시는 베이징 리전
token = None # 임시 키 Token. 임시 키 생성 및 사용 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/436/14048
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 구성된 객체 가져오기
client = CosS3Client(config)

2. 간편한 객체 업로드 검사

(1) 객체의 해시값 계산

MD5 검사 알고리즘으로 객체 해시값을 얻으며, 다른 검사 알고리즘을 적용할 수도 있습니다.
object_body = 'hello cos'
#객체의 md5 해시값 획득
md5 = hashlib.md5()
md5.update(object_body)
md5_str = md5.hexdigest()

(2) 간편한 객체 업로드

코드 중 EnableMD5=True는 객체 업로드 시 MD5 검사 활성화를 의미합니다. Python SDK에서 Content-MD5를 계산하면 업로드 시간이 다소 지연됩니다. COS 서버가 수락한 객체의 MD5 해시값과 Content-MD5가 일치해야 객체가 성공적으로 업로드됩니다.\nx-cos-meta-md5는 사용자 정의한 매개변수(사용자 정의 매개변수의 이름 포맷은 x-cos-meta-*)이며, 본 예시에서는 객체의 MD5 해시값을 나타냅니다.
#간편한 객체 업로드 및 MD5 검사 활성화
response = client.put_object(
Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시로 든 버킷이며, 1250000000은 예시 APPID.
Body='hello cos', #업로드한 객체 콘텐츠
Key='example-object-1', #업로드한 객체의 Key 값으로 대체
EnableMD5=True, #업로드한 MD5 검사 활성화
Metadata={ #사용자 정의 매개변수 설정. 객체의 MD5 해시값을 매개변수로 하여 COS 서버에 입력
'x-cos-meta-md5' : md5_str
}
)
print 'ETag: ' + response['ETag'] # Object의 Etag 값

(3) 객체 다운로드

객체를 다운로드하고, 사용자 정의 매개변수를 획득합니다.
#객체 다운로드
response = client.get_object(
Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시로 든 버킷이며, 1250000000은 예시 APPID.
Key='example-object-1' #다운로드한 객체의 Key 값
)
fp = response['Body'].get_raw_stream()
download_object = fp.read() #객체 콘텐츠 획득
print "get object body: " + download_object
print 'ETag: ' + response['ETag']
print 'x-cos-meta-md5: ' + response['x-cos-meta-md5'] #사용자 정의 매개변수 x-cos-meta-md5 획득

(4) 객체 검사

객체를 성공적으로 다운로드한 뒤, 객체 해시값을 재차 계산하여(검사 알고리즘은 객체 업로드 때와 동일해야 함) 사용자 정의 매개변수 x-cos-meta-md5와 비교함으로써 다운로드한 객체와 업로드된 객체의 콘텐츠가 일치하는지 인증합니다.
#다운로드한 객체의 MD5 해시값 계산
md5 = hashlib.md5()
md5.update(download_object)
md5_str = md5.hexdigest()
print 'download object md5: ' + md5_str

#다운로드한 객체의 MD5 해시값과 업로드된 객체의 MD5 해시값을 비교하여 객체 일치 여부 인증
if md5_str == response['x-cos-meta-md5']:
print 'MD5 check OK'
else:
print 'MD5 check FAIL'

3. 객체 멀티파트 업로드 검사

(1) 객체의 해시값 계산

객체의 멀티파트를 시뮬레이션하고, 전체 객체의 해시값을 계산합니다. 다음은 MD5 검사 알고리즘으로 얻은 객체의 해시값이며, 다른 검사 알고리즘을 적용할 수도 있습니다.
OBJECT_PART_SIZE = 1024 * 1024 #각 멀티파트 크기 시뮬레이션
OBJECT_TOTAL_SIZE = OBJECT_PART_SIZE * 1 + 123 #총 객체 크기
object_body = '1' * OBJECT_TOTAL_SIZE #객체 콘텐츠

#전체 객체 콘텐츠의 MD5 해시값 계산
md5 = hashlib.md5()
md5.update(object_body)
md5_str = md5.hexdigest()

(2) 멀티파트 업로드 초기화

멀티파트 업로드 초기화 시 사용자 정의 매개변수 x-cos-meta-md5를 설정하고, 전체 객체의 MD5 해시값을 매개변수 콘텐츠로 정합니다.
#멀티파트 업로드 초기화
response = client.create_multipart_upload(
Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.
Key='exampleobject-2', #업로드한 객체의 Key 값으로 대체
StorageClass='STANDARD', #객체의 스토리지 레벨
Metadata={
'x-cos-meta-md5' : md5_str #사용자 정의 매개변수를 MD5 해시값으로 설정
}
)
#멀티파트 업로드한 UploadId 획득
upload_id = response['UploadId']

(3) 객체 멀티파트 업로드

객체 멀티파트 업로드는 객체를 여러 파트로 분할하여 업로드하는 것을 의미합니다. 최대 10000개까지 분할할 수 있으며, 각 파트의 크기는 1MB~5GB, 마지막 파트의 크기는 1MB 미만일 수 있습니다. 멀티파트로 업로드할 때 각 파트의 PartNumber(번호)를 설정해야 합니다. EnableMD5=True는 멀티파트 검사 활성화를 뜻하며, 활성화 시 업로드 시간이 다소 지연됩니다. 이때 Python SDK에서 각 파트의 Content-MD5를 계산하며, COS 서버가 수락한 객체의 MD5 해시값이 Content-MD5와 일치해야 멀티파트를 성공적으로 업로드할 수 있습니다. 업로드에 성공하면 각 파트의 ETag가 반환됩니다.
#객체를 멀티파트 업로드할 때, 각 파트의 크기는 OBJECT_PART_SIZE이며, 마지막 파트의 크기는 OBJECT_PART_SIZE보다 작을 수 있습니다.
part_list = list()
position = 0
left_size = OBJECT_TOTAL_SIZE
part_number = 0
while left_size > 0:
part_number += 1
if left_size >= OBJECT_PART_SIZE:
body = object_body[position:position+OBJECT_PART_SIZE]
else:
body = object_body[position:]
position += OBJECT_PART_SIZE
left_size -= OBJECT_PART_SIZE

#멀티파트 업로드
response = client.upload_part(
Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.
Key='exampleobject-2', #객체의 Key 값
Body=body,
PartNumber=part_number,
UploadId=upload_id,
EnableMD5=True #멀티파트 검사 활성화. COS 서버가 각 파트에 MD5 검사 실시.
)
etag = response['ETag'] #ETag는 각 파트의 MD5 값 표시
part_list.append({'ETag' : etag, 'PartNumber' : part_number})
print etag + ', ' + str(part_number)

(4) 멀티파트 업로드 완료

모든 멀티파트 업로드를 마치면 이를 완료하는 작업을 수행해야 합니다. 각 파트의 ETag와 PartNumber가 모두 대응되어야 하며, COS 서버는 이를 각 파트의 정확성 검사에 활용합니다. 멀티파트 업로드가 끝난 후 반환되는 ETag는 전체 객체 콘텐츠의 MD5 해시값이 아닌 병합된 객체의 고유 태그값입니다. 객체를 다운로드할 때는 사용자 정의 매개변수를 통해 검사하십시오.
#멀티파트 업로드 완료
response = client.complete_multipart_upload(
Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시로 든 버킷이며, 1250000000은 예시 APPID.
Key='exampleobject-2', #객체의 Key 값
UploadId=upload_id,
MultipartUpload={ #모든 파트의 ETag와 PartNumber가 모두 대응해야 함
'Part' : part_list
},
)

#ETag는 병합한 객체의 고유성을 검사하기 위한 고유 태그값으로, 객체 콘텐츠의 MD5 해시값이 아닙니다.
print "ETag: " + response['ETag']
print "Location: " + response['Location'] #URL 주소
print "Key: " + response['Key']

(5) 객체 다운로드

객체를 다운로드하고, 사용자 정의 매개변수를 획득합니다.
# 객체 다운로드
response = client.get_object(
Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.
Key='exampleobject-2' #객체의 Key 값
)
print 'ETag: ' + response['ETag'] #객체의 ETag는 객체 콘텐츠의 MD5 해시값이 아님
print 'x-cos-meta-md5: ' + response['x-cos-meta-md5'] #사용자 정의 매개변수 x-cos-meta-md5 획득

(6) 객체 검사

객체를 성공적으로 다운로드한 뒤, 객체의 MD5 해시값을 재차 계산하여 사용자 정의 매개변수 x-cos-meta-md5와 비교함으로써 다운로드한 객체와 업로드된 객체의 콘텐츠가 일치하는지 인증합니다.
#다운로드한 객체의 MD5 해시값 계산
fp = response['Body'].get_raw_stream()
DEFAULT_CHUNK_SIZE = 1024*1024
md5 = hashlib.md5()
chunk = fp.read(DEFAULT_CHUNK_SIZE)
while chunk:
md5.update(chunk)
chunk = fp.read(DEFAULT_CHUNK_SIZE)
md5_str = md5.hexdigest()
print 'download object md5: ' + md5_str

#다운로드한 객체의 MD5 해시값과 업로드된 객체의 MD5 해시값을 비교하여 객체 일치 여부 인증
if md5_str == response['x-cos-meta-md5']:
print 'MD5 check OK'
else:
print 'MD5 check FAIL'
","recentReleaseTime":"2024-06-24 16:53:18","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"COS는 클라이언트와 서버 간 데이터를 전송할 때 발생할 수 있는 오류에 대해 MD5 검사법을 적용하여 업로드하는 데이터의 무결성을 보장합니다. COS 서버가 수락한 데이터의 MD5 해시값이 사용자가 설정한 MD5 해시값과 일치해야만 데이터를 성공적으로 업로드할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"COS의 모든 객체는 대응하는 ETag가 하나씩 있습니다. ETag는 객체 생성 시 객체 콘텐츠의 정보를 표시합니다. 하지만 ETag가 객체 콘텐츠의 MD5 해시값과 반드시 동일하지는 않습니다. 따라서 ETag로 다운로드한 객체와 원본 객체의 일치성 여부를 검사할 수 없습니다. 사용자는 사용자 정의한 객체 메타데이터(x-cos-meta-\"},{\"text\":\"*\"},{\"text\":\")로 다운로드한 객체와 원본 객체의 일치성 검사를 실행할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"데이터 검사 방법\"}],\"nodeId\":\".EB.8D.B0.EC.9D.B4.ED.84.B0-.EA.B2.80.EC.82.AC-.EB.B0.A9.EB.B2.95\",\"type\":\"h2\"},{\"children\":[{\"text\":\"업로드된 객체 검사\\nCOS에 업로드된 객체와 로컬 객체의 일치성 여부를 검사하려면, 업로드 시 HTTP로 요청한 \"},{\"children\":[{\"text\":\"Content-MD5\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7728\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7728\"},\"type\":\"ref\"},{\"text\":\" 필드를 Base64로 인코딩된 객체 콘텐츠의 MD5 해시값으로 설정합니다. 이때 COS 서버에서 사용자가 업로드한 객체를 검사하고, COS 서버가 수락한 객체의 MD5 해시값이 사용자가 설정한 Content-MD5와 일치해야만 객체를 성공적으로 업로드할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"다운로드한 객체 검사\\n객체 업로드 시 검사 알고리즘으로 객체의 해시값을 계산하여 다운로드한 객체와 원본 객체의 일치 여부를 검사할 수 있습니다. 사용자 정의한 메타데이터로 객체 해시값을 설정한 뒤, 다운로드한 객체의 해시값을 다시 계산하여 사용자 정의한 메타데이터와 비교 인증합니다. 이 경우, 사용자는 검사 알고리즘을 직접 선택할 수 있으며, 같은 객체를 업로드 및 다운로드할 때 사용하는 검사 알고리즘은 동일해야 합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"API 예시\"}],\"nodeId\":\"api-.EC.98.88.EC.8B.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"간편 업로드 요청\"}],\"nodeId\":\".EA.B0.84.ED.8E.B8-.EC.97.85.EB.A1.9C.EB.93.9C-.EC.9A.94.EC.B2.AD\",\"type\":\"h4\"},{\"children\":[{\"text\":\"다음은 사용자의 객체 업로드 요청 예시입니다. 객체를 업로드할 때 Content-MD5를 Base64로 인코딩된 객체 콘텐츠의 MD5 해시값으로 설정합니다. 이 때 COS 서버에서 수락한 객체의 MD5 해시값과 사용자가 설정한 Content-MD5가 동일해야 객체를 성공적으로 업로드할 수 있으며, 사용자 정의한 메타데이터 x-cos-meta-md5를 객체의 해시값으로 설정합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"다음 예시는 MD5 검사 알고리즘으로 얻은 객체 해시값이며, 다른 검사 알고리즘을 적용해도 됩니다. \"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"children\":[{\"text\":\"PUT /exampleobject HTTP/1.1\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Host: examplebucket-1250000000.cos.ap-beijing.myqcloud.com\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Date: Fri, 21 Jun 2019 09:24:28 GMT\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Content-Type: image/jpeg\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Content-Length: 13\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Content-MD5: ti4QvKtVqIJAvZxDbP/c+Q==\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Authorization: q-sign-algorithm=sha1\\u0026q-ak=AKID8A0fBVtYFrNm02oY1g1JQQF0c3JO****\\u0026q-sign-time=1561109068;1561116268\\u0026q-key-time=1561109068;1561116268\\u0026q-header-list=content-length;content-md5;content-type;date;host\\u0026q-url-param-list=\\u0026q-signature=998bfc8836fc205d09e455c14e3d7e623bd2****\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"x-cos-meta-md5: b62e10bcab55a88240bd9c436cffdcf9\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Connection: close\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"[Object Content]\"}],\"type\":\"code-line\"}],\"language\":\"url\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"멀티파트 업로드 요청\"}],\"nodeId\":\".EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EC.97.85.EB.A1.9C.EB.93.9C-.EC.9A.94.EC.B2.AD\",\"type\":\"h4\"},{\"children\":[{\"text\":\"다음은 멀티파트 업로드 초기화에 관한 요청 예시입니다. 객체를 멀티파트 업로드할 때 멀티파트 업로드 초기화를 통해 객체의 사용자 정의 메타데이터를 설정할 수 있습니다. 여기서는 사용자 정의한 메타데이터 x-cos-meta-md5를 객체 해시값으로 설정합니다. \"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"POST /exampleobject?uploads HTTP/1.1\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Host: examplebucket-1250000000.cos.ap-beijing.myqcloud.com\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Date: Fri, 21 Jun 2019 09:45:12 GMT\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Authorization: q-sign-algorithm=sha1\\u0026q-ak=AKID8A0fBVtYFrNm02oY1g1JQQF0c3JO****\\u0026q-sign-time=1561109068;1561116268\\u0026q-key-time=1561109068;1561116268\\u0026q-header-list=content-length;content-md5;content-type;date;host\\u0026q-url-param-list=\\u0026q-signature=998bfc8836fc205d09e455c14e3d7e623bd2****\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"x-cos-meta-md5: b62e10bcab55a88240bd9c436cffdcf9\"}],\"type\":\"code-line\"}],\"language\":\"url\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 멀티파트 업로드 파일에 대해 COS는 모든 파트에 대한 MD5 값을 검사하지만 병합한 전체 파일의 MD5 값은 계산하지 않습니다.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"type\":\"hint\"},{\"children\":[{\"text\":\"객체 다운로드 응답\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C-.EC.9D.91.EB.8B.B5\",\"type\":\"h4\"},{\"children\":[{\"text\":\"다음은 사용자가 객체 다운로드 요청으로 얻은 응답 예시입니다. 사용자는 응답으로 객체의 사용자 정의 메타데이터 x-cos-meta-md5를 얻고, 객체 해시값을 재차 계산한 뒤 비교를 통해 다운로드한 객체와 원본 객체의 일치성 여부를 인증합니다. \"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"HTTP/1.1 200 OK\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Content-Type: application/octet-stream\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Content-Length: 13\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Connection: close\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Accept-Ranges: bytes\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Cache-Control: max-age=86400\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Content-Disposition: attachment; filename=example.jpg\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Date: Thu, 04 Jul 2019 11:33:00 GMT\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"ETag: \\\"b62e10bcab55a88240bd9c436cffdcf9\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Last-Modified: Thu, 04 Jul 2019 11:32:55 GMT\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"Server: tencent-cos\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"x-cos-request-id: NWQxZGUzZWNfNjI4NWQ2NF9lMWYyXzk1NjFj****\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"x-cos-meta-md5: b62e10bcab55a88240bd9c436cffdcf9\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"[Object Content]\"}],\"type\":\"code-line\"}],\"language\":\"url\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"SDK 예시\"}],\"nodeId\":\"sdk-.EC.98.88.EC.8B.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"다음은 Python SDK를 사례로 한 객체 검사법으로, 전체 코드에 대한 예시는 다음과 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"코드는 Python 2.7을 기반으로 하였으며, Python SDK의 자세한 사용 방법은 Python SDK의 \"},{\"children\":[{\"text\":\"객체 작업\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/43582\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/43582\"},\"type\":\"ref\"},{\"text\":\" 문서를 참조하십시오.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"1. 초기화 설정\"}],\"nodeId\":\"1.-.EC.B4.88.EA.B8.B0.ED.99.94-.EC.84.A4.EC.A0.95\",\"type\":\"h4\"},{\"children\":[{\"text\":\"SecretId, SecretKey, Region을 포함한 사용자 속성을 설정하고, 클라이언트 객체를 생성합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"# -*- coding=utf-8\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"from qcloud_cos import CosConfig\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"from qcloud_cos import CosS3Client\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"from qcloud_cos import CosServiceError\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"from qcloud_cos import CosClientError\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import sys\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import os\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import logging\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import hashlib\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"logging.basicConfig(level=logging.INFO, stream=sys.stdout)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"# SecretId, SecretKey, Region을 포함한 사용자 속성을 설정합니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"# APPID는 설정에서 삭제되었으니 매개변수 Bucket에 APPID를 입력하십시오. Bucket은 BucketName-APPID로 구성됩니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"secret_id = os.environ['COS_SECRET_ID'] # 사용자 SecretId. 리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한 원칙을 따르는 것이 좋습니다. 서브 계정 키를 가져오는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/598/37140\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"secret_key = os.environ['COS_SECRET_KEY'] # 사용자 SecretKey. 리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한 원칙을 따르는 것이 좋습니다. 서브 계정 키를 가져오는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/598/37140\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"region = 'ap-beijing' # 사용자 Region으로 대체, 예시는 베이징 리전\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"token = None # 임시 키 Token. 임시 키 생성 및 사용 방법에 대한 자세한 내용은 다음을 참고하십시오. https://cloud.tencent.com/document/product/436/14048\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 구성된 객체 가져오기\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"client = CosS3Client(config)\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"2. 간편한 객체 업로드 검사\"}],\"nodeId\":\"2.-.EA.B0.84.ED.8E.B8.ED.95.9C-.EA.B0.9D.EC.B2.B4-.EC.97.85.EB.A1.9C.EB.93.9C-.EA.B2.80.EC.82.AC\",\"type\":\"h4\"},{\"children\":[{\"text\":\"(1) 객체의 해시값 계산\"}],\"nodeId\":\"(1)-.EA.B0.9D.EC.B2.B4.EC.9D.98-.ED.95.B4.EC.8B.9C.EA.B0.92-.EA.B3.84.EC.82.B0\",\"type\":\"h4\"},{\"children\":[{\"text\":\"MD5 검사 알고리즘으로 객체 해시값을 얻으며, 다른 검사 알고리즘을 적용할 수도 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"object_body = 'hello cos'\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"#객체의 md5 해시값 획득\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"md5 = hashlib.md5()\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"md5.update(object_body)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"md5_str = md5.hexdigest()\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"(2) 간편한 객체 업로드\"}],\"nodeId\":\"(2)-.EA.B0.84.ED.8E.B8.ED.95.9C-.EA.B0.9D.EC.B2.B4-.EC.97.85.EB.A1.9C.EB.93.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"코드 중 EnableMD5=True는 객체 업로드 시 MD5 검사 활성화를 의미합니다. Python SDK에서 Content-MD5를 계산하면 업로드 시간이 다소 지연됩니다. COS 서버가 수락한 객체의 MD5 해시값과 Content-MD5가 일치해야 객체가 성공적으로 업로드됩니다.\\nx-cos-meta-md5는 사용자 정의한 매개변수(사용자 정의 매개변수의 이름 포맷은 x-cos-meta-\"},{\"text\":\"*\"},{\"text\":\")이며, 본 예시에서는 객체의 MD5 해시값을 나타냅니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"#간편한 객체 업로드 및 MD5 검사 활성화\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"response = client.put_object(\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시로 든 버킷이며, 1250000000은 예시 APPID.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Body='hello cos', #업로드한 객체 콘텐츠\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Key='example-object-1', #업로드한 객체의 Key 값으로 대체 \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" EnableMD5=True, #업로드한 MD5 검사 활성화\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Metadata={ #사용자 정의 매개변수 설정. 객체의 MD5 해시값을 매개변수로 하여 COS 서버에 입력\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'x-cos-meta-md5' : md5_str\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\")\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"print 'ETag: ' + response['ETag'] # Object의 Etag 값\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"(3) 객체 다운로드\"}],\"nodeId\":\"(3)-.EA.B0.9D.EC.B2.B4-.EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"객체를 다운로드하고, 사용자 정의 매개변수를 획득합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"#객체 다운로드\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"response = client.get_object(\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시로 든 버킷이며, 1250000000은 예시 APPID.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Key='example-object-1' #다운로드한 객체의 Key 값\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\")\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"fp = response['Body'].get_raw_stream()\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"download_object = fp.read() #객체 콘텐츠 획득\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"print \\\"get object body: \\\" + download_object\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"print 'ETag: ' + response['ETag'] \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"print 'x-cos-meta-md5: ' + response['x-cos-meta-md5'] #사용자 정의 매개변수 x-cos-meta-md5 획득\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"(4) 객체 검사\"}],\"nodeId\":\"(4)-.EA.B0.9D.EC.B2.B4-.EA.B2.80.EC.82.AC\",\"type\":\"h4\"},{\"children\":[{\"text\":\"객체를 성공적으로 다운로드한 뒤, 객체 해시값을 재차 계산하여(검사 알고리즘은 객체 업로드 때와 동일해야 함) 사용자 정의 매개변수 x-cos-meta-md5와 비교함으로써 다운로드한 객체와 업로드된 객체의 콘텐츠가 일치하는지 인증합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"#다운로드한 객체의 MD5 해시값 계산\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"md5 = hashlib.md5() \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"md5.update(download_object)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"md5_str = md5.hexdigest()\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"print 'download object md5: ' + md5_str\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"#다운로드한 객체의 MD5 해시값과 업로드된 객체의 MD5 해시값을 비교하여 객체 일치 여부 인증\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"if md5_str == response['x-cos-meta-md5']:\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" print 'MD5 check OK'\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"else:\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" print 'MD5 check FAIL'\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"3. 객체 멀티파트 업로드 검사\"}],\"nodeId\":\"3.-.EA.B0.9D.EC.B2.B4-.EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EC.97.85.EB.A1.9C.EB.93.9C-.EA.B2.80.EC.82.AC\",\"type\":\"h4\"},{\"children\":[{\"text\":\"(1) 객체의 해시값 계산\"}],\"nodeId\":\"(1)-.EA.B0.9D.EC.B2.B4.EC.9D.98-.ED.95.B4.EC.8B.9C.EA.B0.92-.EA.B3.84.EC.82.B02\",\"type\":\"h4\"},{\"children\":[{\"text\":\"객체의 멀티파트를 시뮬레이션하고, 전체 객체의 해시값을 계산합니다. 다음은 MD5 검사 알고리즘으로 얻은 객체의 해시값이며, 다른 검사 알고리즘을 적용할 수도 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"OBJECT_PART_SIZE = 1024 * 1024 #각 멀티파트 크기 시뮬레이션\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"OBJECT_TOTAL_SIZE = OBJECT_PART_SIZE * 1 + 123 #총 객체 크기\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"object_body = '1' * OBJECT_TOTAL_SIZE #객체 콘텐츠\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"#전체 객체 콘텐츠의 MD5 해시값 계산\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"md5 = hashlib.md5()\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"md5.update(object_body)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"md5_str = md5.hexdigest()\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"(2) 멀티파트 업로드 초기화\"}],\"nodeId\":\"(2)-.EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EC.97.85.EB.A1.9C.EB.93.9C-.EC.B4.88.EA.B8.B0.ED.99.94\",\"type\":\"h4\"},{\"children\":[{\"text\":\"멀티파트 업로드 초기화 시 사용자 정의 매개변수 x-cos-meta-md5를 설정하고, 전체 객체의 MD5 해시값을 매개변수 콘텐츠로 정합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"#멀티파트 업로드 초기화\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"response = client.create_multipart_upload(\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Key='exampleobject-2', #업로드한 객체의 Key 값으로 대체 \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" StorageClass='STANDARD', #객체의 스토리지 레벨\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Metadata={\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'x-cos-meta-md5' : md5_str #사용자 정의 매개변수를 MD5 해시값으로 설정\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\")\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"#멀티파트 업로드한 UploadId 획득\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"upload_id = response['UploadId']\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"(3) 객체 멀티파트 업로드\"}],\"nodeId\":\"(3)-.EA.B0.9D.EC.B2.B4-.EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EC.97.85.EB.A1.9C.EB.93.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"객체 멀티파트 업로드는 객체를 여러 파트로 분할하여 업로드하는 것을 의미합니다. 최대 10000개까지 분할할 수 있으며, 각 파트의 크기는 1MB~5GB, 마지막 파트의 크기는 1MB 미만일 수 있습니다. 멀티파트로 업로드할 때 각 파트의 PartNumber(번호)를 설정해야 합니다. EnableMD5=True는 멀티파트 검사 활성화를 뜻하며, 활성화 시 업로드 시간이 다소 지연됩니다. 이때 Python SDK에서 각 파트의 Content-MD5를 계산하며, COS 서버가 수락한 객체의 MD5 해시값이 Content-MD5와 일치해야 멀티파트를 성공적으로 업로드할 수 있습니다. 업로드에 성공하면 각 파트의 ETag가 반환됩니다. \"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"#객체를 멀티파트 업로드할 때, 각 파트의 크기는 OBJECT_PART_SIZE이며, 마지막 파트의 크기는 OBJECT_PART_SIZE보다 작을 수 있습니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"part_list = list()\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"position = 0\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"left_size = OBJECT_TOTAL_SIZE\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"part_number = 0\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"while left_size \\u003e 0:\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" part_number += 1\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" if left_size \\u003e= OBJECT_PART_SIZE:\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" body = object_body[position:position+OBJECT_PART_SIZE]\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" else:\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" body = object_body[position:]\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" position += OBJECT_PART_SIZE\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" left_size -= OBJECT_PART_SIZE\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" #멀티파트 업로드\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" response = client.upload_part(\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Key='exampleobject-2', #객체의 Key 값 \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Body=body,\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" PartNumber=part_number,\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" UploadId=upload_id,\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" EnableMD5=True #멀티파트 검사 활성화. COS 서버가 각 파트에 MD5 검사 실시.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" )\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" etag = response['ETag'] #ETag는 각 파트의 MD5 값 표시\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" part_list.append({'ETag' : etag, 'PartNumber' : part_number})\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" print etag + ', ' + str(part_number)\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"(4) 멀티파트 업로드 완료\"}],\"nodeId\":\"(4)-.EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EC.97.85.EB.A1.9C.EB.93.9C-.EC.99.84.EB.A3.8C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"모든 멀티파트 업로드를 마치면 이를 완료하는 작업을 수행해야 합니다. 각 파트의 ETag와 PartNumber가 모두 대응되어야 하며, COS 서버는 이를 각 파트의 정확성 검사에 활용합니다. 멀티파트 업로드가 끝난 후 반환되는 ETag는 전체 객체 콘텐츠의 MD5 해시값이 아닌 병합된 객체의 고유 태그값입니다. 객체를 다운로드할 때는 사용자 정의 매개변수를 통해 검사하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"#멀티파트 업로드 완료\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"response = client.complete_multipart_upload(\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시로 든 버킷이며, 1250000000은 예시 APPID.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Key='exampleobject-2', #객체의 Key 값 \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" UploadId=upload_id,\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" MultipartUpload={ #모든 파트의 ETag와 PartNumber가 모두 대응해야 함\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Part' : part_list \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\")\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"#ETag는 병합한 객체의 고유성을 검사하기 위한 고유 태그값으로, 객체 콘텐츠의 MD5 해시값이 아닙니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"print \\\"ETag: \\\" + response['ETag'] \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"print \\\"Location: \\\" + response['Location'] #URL 주소\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"print \\\"Key: \\\" + response['Key'] \"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"(5) 객체 다운로드\"}],\"nodeId\":\"(5)-.EA.B0.9D.EC.B2.B4-.EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"객체를 다운로드하고, 사용자 정의 매개변수를 획득합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"# 객체 다운로드\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"response = client.get_object(\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Key='exampleobject-2' #객체의 Key 값 \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\")\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"print 'ETag: ' + response['ETag'] #객체의 ETag는 객체 콘텐츠의 MD5 해시값이 아님\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"print 'x-cos-meta-md5: ' + response['x-cos-meta-md5'] #사용자 정의 매개변수 x-cos-meta-md5 획득\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"(6) 객체 검사\"}],\"nodeId\":\"(6)-.EA.B0.9D.EC.B2.B4-.EA.B2.80.EC.82.AC\",\"type\":\"h4\"},{\"children\":[{\"text\":\"객체를 성공적으로 다운로드한 뒤, 객체의 MD5 해시값을 재차 계산하여 사용자 정의 매개변수 x-cos-meta-md5와 비교함으로써 다운로드한 객체와 업로드된 객체의 콘텐츠가 일치하는지 인증합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"#다운로드한 객체의 MD5 해시값 계산\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"fp = response['Body'].get_raw_stream()\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"DEFAULT_CHUNK_SIZE = 1024*1024\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"md5 = hashlib.md5()\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"chunk = fp.read(DEFAULT_CHUNK_SIZE) \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"while chunk:\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" md5.update(chunk)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" chunk = fp.read(DEFAULT_CHUNK_SIZE)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"md5_str = md5.hexdigest()\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"print 'download object md5: ' + md5_str\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"#다운로드한 객체의 MD5 해시값과 업로드된 객체의 MD5 해시값을 비교하여 객체 일치 여부 인증\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"if md5_str == response['x-cos-meta-md5']:\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" print 'MD5 check OK'\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"else:\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" print 'MD5 check FAIL'\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"}]"}},"32535":{"categoryId":436,"weight":95,"type":"page","extension":"","pid":33125,"id":32535,"lang":"ko","title":"버킷 복사 기반의 재해 복구 고가용성 아키텍처","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:11","recentReleaseTime":"2019-12-06 19:34:11","content":{"title":"버킷 복사 기반의 재해 복구 고가용성 아키텍처","body":"

소개

Tencent Cloud COS는 99.95%의 가용성과 99.999999999%의 신뢰성을 자부합니다. 하지만 자연재해, 광케이블 장애와 같은 불가항력적 요인들로 인해 클라우드 데이터의 가용성과 신뢰성이 100%에 도달할 수는 없습니다. 반면 금융업과 같은 일부 업종은 그 특수성으로 인해 상당히 높은 수준의 가용성과 신뢰성이 요구됩니다.
Tencent Cloud COS는 기업 비즈니스의 연속성과 안정성을 도모하여 기업의 고가용성 및 고신뢰성에 대한 요구사항을 충족하기 위해 버킷 복사 기능을 기반으로 한 고가용성의 데이터 재해 복구 솔루션을 제공합니다. 기업은 클라우드 이용 시 비즈니스 요구사항에 맞춰 클라우드 내 데이터를 재해 복구하고 백업함으로써 비즈니스를 지속적이며 안정적으로 운영할 수 있습니다.
본 문서에서는 버킷 복사를 기반으로 한 클라우드 비즈니스의 액티브/스탠바이 전환이라는 재해 복구 솔루션과, 버킷 복사를 기반으로 한 고가용성 솔루션의 두 가지 내용을 주로 소개합니다. 버킷 복사, Origin-pull, SCF, CDN 등 다양한 제품과 기능을 통해 비즈니스 가용성을 향상시킬 수 있습니다.

버킷 복사 기반의 재해 복구 백업 솔루션

재해 복구를 위해서는 이중화(Redundance), 원거리(Remote), 데이터 전체 백업(Replication)라는 세 가지 요소가 충족돼야 합니다.
이중화: 데이터 이중화를 뜻하며, 데이터를 사용 가능한 다른 시스템으로 백업해야 합니다.
원거리: 백업 데이터를 원거리의 다른 리전에 보관해야 합니다. 재해는 보통 인근 지역으로 여파가 미치기 때문에, 충분한 거리를 확보해야만 이중화 데이터의 가용성을 보장할 수 있습니다.
데이터 전체 백업: 백업 데이터의 유실률을 '제로(zero)'로 확보해야 합니다.
COS의 버킷 복사 기능은 증분 데이터의 리전 간 동기화를 지원합니다. 사용자가 업로드한 데이터는 파일 크기와 리전 거리에 따라 다른 리전의 버킷으로 복제되기까지 수 초에서 수 분의 시간이 소요될 수 있습니다. 버킷 복사를 기반으로 할 경우, 데이터를 타 리전에 이중으로 백업함으로써 비즈니스를 위한 재해 복구 조치를 취할 수 있습니다. 버킷 복사에 관한 내용은 버킷 복사 개요를 참조하십시오. 버킷 복사 기능을 활성화하려면 우선 버전 제어 기능을 활성화해야 합니다. 버전 제어와 관련한 내용은 버전 제어 개요를 참조하십시오.
버킷 복사 기반의 재해 복구 백업 아키텍처의 순서도는 다음과 같습니다.\n
\"\"

이 아키텍처에서 사용자의 버킷 A와 버킷 B는 액티브/스탠바이 관계입니다. 예를 들어 기업 사용자의 데이터가 버킷 A에 보관되어 있는 경우, 다른 리전의 버킷 B는 스탠바이용 버킷입니다. 이 기업이 비즈니스의 연속성과 안정성을 보장하기 위해 버킷 A와 B에 각각 버킷 복사 규칙을 설정 및 적용했다면, 버킷 A의 증분 데이터는 버킷 B에 자동 복제되며 버킷 B의 증분 데이터도 버킷 A로 자동 복제됩니다.
주의:
버킷 A에서 버킷 B로 복제된 증분 데이터는 비록 버킷 B의 증분 데이터일지라도 버킷 A로 재차 복제되지 않습니다.
특별한 문제가 없는 경우, 기업의 주요 읽기/쓰기 요청 링크는 버킷 A를 지향하며, 모든 증분 데이터는 백업 데이터로서 버킷 B로 자동 증분 되어 동기화 복제됩니다. 사용자는 프로그램을 업로드하거나 다운로드할 때 네트워크 품질 점검 모듈을 추가할 수 있으며, 액티브 버킷 A가 다운됐음을 감지하면 읽기/쓰기 요청 링크를 신속히 스탠바이 버킷 B로 전환합니다.
주의:
Tencent Cloud의 SCF를 기반으로 네트워크 품질을 점검할 수 있습니다. SCF 코드를 수정하여 자동화 테스팅 주소를 액티브/스탠바이 버킷의 도메인으로 변경할 수 있으며, 비즈니스 요구사항에 맞춰 알람 코드 스니펫을 다른 비즈니스에 필요한 상태로 변경할 수 있습니다.

버킷 복사 기반의 고가용성 솔루션

앞서 버킷 복사 기반의 재해 복구 백업 솔루션을 소개했습니다. 이 솔루션은 클라우드의 제품과 기능을 활용한 데이터 백업 및 재해 복구를 위한 전환 작업을 지원합니다. 하지만 실제 비즈니스는 복잡하고 다양하게 운영되기 때문에 상술한 재해 복구 백업 솔루션이 비즈니스적으로 충분한 가용성을 보장하지 못할 수 있습니다. 따라서 다음과 같은 버킷 복사 기반의 고가용성 솔루션을 소개합니다. 버킷 복사, Origin-pull, SCF, CDN 등 다양한 제품과 기능을 활용해 비즈니스 가용성을 높일 수 있습니다.
버킷 복사 기반의 비즈니스 고가용성 아키텍처의 순서도는 다음과 같습니다.\n
\"\"

본 아키텍처는 다음과 같은 몇 개의 레이어로 나뉩니다.
고가용성 레이어: 통합 네트워크 점검 및 비즈니스 스케쥴링 시 링크의 상호접속률 등 지표에 따라 링크를 전환하며, 사용자가 SCF를 토대로 실현(설명 참조)할 수 있습니다. 또한 비즈니스 요구사항에 맞춰 클라이언트에서 직접 실현하는 것도 가능합니다.
스토리지 레이어: 보통 COS의 다른 리전의 버킷으로 구성됩니다. 사용자는 Origin-pull 정책 설정을 통해 외부 원본 서버나 타 클라우드 벤더에 있는 버킷을 가져와 데이터 일관성을 보다 강화할 수 있습니다.
CDN 레이어: Tencent Cloud CDN의 대용량 엣지 노드는 근거리 액세스 기능을 지원합니다. 사용자가 직접 원본 서버 데이터에 액세스하는 것을 방지함으로써 원본 서버 데이터의 보안성을 보장합니다.
본 아키텍처는 다음과 같은 방법으로 비즈니스의 고가용성을 보장합니다.
1. 특별한 문제가 없는 경우, 기업의 주요 쓰기 요청 링크는 버킷 A를 지향하며, 모든 증분 데이터는 백업 데이터로서 버킷 B로 자동 동기화 복제됩니다.
2. 액티브 버킷 A의 링크에 장애(예: 자동화 테스팅 품질 저하 또는 업로드 실패 감지)가 발생하면 클라이언트에서 쓰기 요청 링크를 액티브 버킷 B로 전환합니다. 이때 모든 증분 데이터는 버킷 A로 자동으로 동기화되어 복제됩니다.
3. 사용자는 외부 원본 서버나 타 클라우드 벤더 측에 이중화 데이터를 백업하는 것과 함께 버킷 B에 Origin-pull 정책을 설정할 수 있습니다. 만약 액티브 버킷 A와 B의 링크가 동시에 연결되지 않는 최악의 상황을 가정할 경우, 버킷 B에 대한 데이터 업로드가 실패하면 버킷 B가 원본 서버로부터 데이터를 가져오게 됩니다.
주의:
데이터 전체를 이중화하여 백업할 경우 많은 비용이 부과됩니다. 핫 데이터(예: 몇 시간 내 업로드한 파일)에 한해 이중화 백업을 함으로써 데이터 스토리지 비용을 절약할 수 있습니다.
원본 서버를 고가용성 아키텍처의 일부로 선택할 경우, 원본 서버의 대역폭과 대역폭 제한에 따른 결과를 고려하여 아키텍처를 설계하십시오.
4. 버킷에 직접 액세스하여 데이터를 읽어올 수 있으며, 버킷에 CDN 가속 도메인 바인딩을 하여 Tencent Cloud CDN의 엣지 노드에서 근거리 액세스를 할 수 있습니다. 비즈니스 데이터가 콘텐츠 전송 시나리오와 관련이 있거나 사용자가 버킷에 직접 액세스하는 것을 원치 않을 경우, Tencent Cloud CDN을 함께 사용하는 것을 권장합니다.
설명:
버킷에서 직접 데이터를 읽어오려면 클라이언트에서 follow HTTP 302를 지원해야 합니다.
Tencent Cloud CDN은 약 천 개의 엣지 노드를 제공합니다. 사용자와 가까운 거리에 액세스 노드를 제공하여 읽어오는 속도를 높이고 있습니다. CDN에 여러 개의 원본 서버를 액티브/스탠바이 관계로 바인딩함으로써 고가용성을 보장할 수 있습니다. 원본 서버 설정을 참고하여 설정하십시오.
원본 서버의 보안을 강화하려면 원본 서버의 개인 읽기/쓰기 및 CDN Origin-pull 인증을 활성화하십시오. 사용자는 CDN 엣지 노드에 캐싱된 데이터에 익명으로 액세스할 수 있을 뿐만 아니라 원본 서버의 데이터 보안도 확보할 수 있습니다.

참조 문서

재해 복구를 위한 고가용성 아키텍처를 사용할 때 다음 문서를 참조할 수 있습니다.
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"Tencent Cloud COS는 99.95%의 가용성과 99.999999999%의 신뢰성을 자부합니다. 하지만 자연재해, 광케이블 장애와 같은 불가항력적 요인들로 인해 클라우드 데이터의 가용성과 신뢰성이 100%에 도달할 수는 없습니다. 반면 금융업과 같은 일부 업종은 그 특수성으로 인해 상당히 높은 수준의 가용성과 신뢰성이 요구됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"Tencent Cloud COS는 기업 비즈니스의 연속성과 안정성을 도모하여 기업의 고가용성 및 고신뢰성에 대한 요구사항을 충족하기 위해 버킷 복사 기능을 기반으로 한 고가용성의 데이터 재해 복구 솔루션을 제공합니다. 기업은 클라우드 이용 시 비즈니스 요구사항에 맞춰 클라우드 내 데이터를 재해 복구하고 백업함으로써 비즈니스를 지속적이며 안정적으로 운영할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"본 문서에서는 버킷 복사를 기반으로 한 클라우드 비즈니스의 액티브/스탠바이 전환이라는 재해 복구 솔루션과, 버킷 복사를 기반으로 한 고가용성 솔루션의 두 가지 내용을 주로 소개합니다. 버킷 복사, Origin-pull, SCF, CDN 등 다양한 제품과 기능을 통해 비즈니스 가용성을 향상시킬 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"버킷 복사 기반의 재해 복구 백업 솔루션\"}],\"nodeId\":\".EB.B2.84.ED.82.B7-.EB.B3.B5.EC.82.AC-.EA.B8.B0.EB.B0.98.EC.9D.98-.EC.9E.AC.ED.95.B4-.EB.B3.B5.EA.B5.AC-.EB.B0.B1.EC.97.85-.EC.86.94.EB.A3.A8.EC.85.98\",\"type\":\"h2\"},{\"children\":[{\"text\":\"재해 복구를 위해서는 이중화(Redundance), 원거리(Remote), 데이터 전체 백업(Replication)라는 세 가지 요소가 충족돼야 합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"이중화: 데이터 이중화를 뜻하며, 데이터를 사용 가능한 다른 시스템으로 백업해야 합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"원거리: 백업 데이터를 원거리의 다른 리전에 보관해야 합니다. 재해는 보통 인근 지역으로 여파가 미치기 때문에, 충분한 거리를 확보해야만 이중화 데이터의 가용성을 보장할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"데이터 전체 백업: 백업 데이터의 유실률을 '제로(zero)'로 확보해야 합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"COS의 버킷 복사 기능은 증분 데이터의 리전 간 동기화를 지원합니다. 사용자가 업로드한 데이터는 파일 크기와 리전 거리에 따라 다른 리전의 버킷으로 복제되기까지 수 초에서 수 분의 시간이 소요될 수 있습니다. 버킷 복사를 기반으로 할 경우, 데이터를 타 리전에 이중으로 백업함으로써 비즈니스를 위한 재해 복구 조치를 취할 수 있습니다. 버킷 복사에 관한 내용은 \"},{\"children\":[{\"text\":\"버킷 복사 개요\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/19237\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/19237\"},\"type\":\"ref\"},{\"text\":\"를 참조하십시오. 버킷 복사 기능을 활성화하려면 우선 버전 제어 기능을 활성화해야 합니다. 버전 제어와 관련한 내용은 \"},{\"children\":[{\"text\":\"버전 제어 개요\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/19883\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/19883\"},\"type\":\"ref\"},{\"text\":\"를 참조하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"버킷 복사 기반의 재해 복구 백업 아키텍처의 순서도는 다음과 같습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/fba213608e66f1e8b8426692eb709f33.png\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"이 아키텍처에서 사용자의 버킷 A와 버킷 B는 액티브/스탠바이 관계입니다. 예를 들어 기업 사용자의 데이터가 버킷 A에 보관되어 있는 경우, 다른 리전의 버킷 B는 스탠바이용 버킷입니다. 이 기업이 비즈니스의 연속성과 안정성을 보장하기 위해 버킷 A와 B에 각각 버킷 복사 규칙을 설정 및 적용했다면, 버킷 A의 증분 데이터는 버킷 B에 자동 복제되며 버킷 B의 증분 데이터도 버킷 A로 자동 복제됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"버킷 A에서 버킷 B로 복제된 증분 데이터는 비록 버킷 B의 증분 데이터일지라도 버킷 A로 재차 복제되지 않습니다.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"type\":\"hint\"},{\"children\":[{\"text\":\"특별한 문제가 없는 경우, 기업의 주요 읽기/쓰기 요청 링크는 버킷 A를 지향하며, 모든 증분 데이터는 백업 데이터로서 버킷 B로 자동 증분 되어 동기화 복제됩니다. 사용자는 프로그램을 업로드하거나 다운로드할 때 네트워크 품질 점검 모듈을 추가할 수 있으며, 액티브 버킷 A가 다운됐음을 감지하면 읽기/쓰기 요청 링크를 신속히 스탠바이 버킷 B로 전환합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"Tencent Cloud의 SCF를 기반으로 네트워크 품질을 점검할 수 있습니다. SCF 코드를 수정하여 자동화 테스팅 주소를 액티브/스탠바이 버킷의 도메인으로 변경할 수 있으며, 비즈니스 요구사항에 맞춰 알람 코드 스니펫을 다른 비즈니스에 필요한 상태로 변경할 수 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"type\":\"hint\"},{\"children\":[{\"text\":\"버킷 복사 기반의 고가용성 솔루션\"}],\"nodeId\":\".EB.B2.84.ED.82.B7-.EB.B3.B5.EC.82.AC-.EA.B8.B0.EB.B0.98.EC.9D.98-.EA.B3.A0.EA.B0.80.EC.9A.A9.EC.84.B1-.EC.86.94.EB.A3.A8.EC.85.98\",\"type\":\"h2\"},{\"children\":[{\"text\":\"앞서 버킷 복사 기반의 재해 복구 백업 솔루션을 소개했습니다. 이 솔루션은 클라우드의 제품과 기능을 활용한 데이터 백업 및 재해 복구를 위한 전환 작업을 지원합니다. 하지만 실제 비즈니스는 복잡하고 다양하게 운영되기 때문에 상술한 재해 복구 백업 솔루션이 비즈니스적으로 충분한 가용성을 보장하지 못할 수 있습니다. 따라서 다음과 같은 버킷 복사 기반의 고가용성 솔루션을 소개합니다. 버킷 복사, Origin-pull, SCF, CDN 등 다양한 제품과 기능을 활용해 비즈니스 가용성을 높일 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"버킷 복사 기반의 비즈니스 고가용성 아키텍처의 순서도는 다음과 같습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/e56c3707f14b2e30c216e22c4c68eda0.png\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"본 아키텍처는 다음과 같은 몇 개의 레이어로 나뉩니다.\"}],\"type\":\"p\"},{\"children\":[{\"b\":1,\"text\":\"고가용성 레이어\"},{\"text\":\": 통합 네트워크 점검 및 비즈니스 스케쥴링 시 링크의 상호접속률 등 지표에 따라 링크를 전환하며, 사용자가 SCF를 토대로 실현(설명 참조)할 수 있습니다. 또한 비즈니스 요구사항에 맞춰 클라이언트에서 직접 실현하는 것도 가능합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"스토리지 레이어\"},{\"text\":\": 보통 COS의 다른 리전의 버킷으로 구성됩니다. 사용자는 \"},{\"children\":[{\"text\":\"Origin-pull 정책 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/31508\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/31508\"},\"type\":\"ref\"},{\"text\":\"을 통해 \"},{\"b\":1,\"text\":\"외부 원본 서버나 타 클라우드 벤더에 있는\"},{\"text\":\" 버킷을 가져와 데이터 일관성을 보다 강화할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"CDN 레이어\"},{\"text\":\": Tencent Cloud CDN의 대용량 엣지 노드는 근거리 액세스 기능을 지원합니다. 사용자가 직접 원본 서버 데이터에 액세스하는 것을 방지함으로써 원본 서버 데이터의 보안성을 보장합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"본 아키텍처는 다음과 같은 방법으로 비즈니스의 고가용성을 보장합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"특별한 문제가 없는 경우, 기업의 주요 쓰기 요청 링크는 버킷 A를 지향하며, 모든 증분 데이터는 백업 데이터로서 버킷 B로 자동 동기화 복제됩니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"액티브 버킷 A의 링크에 장애(예: 자동화 테스팅 품질 저하 또는 업로드 실패 감지)가 발생하면 클라이언트에서 쓰기 요청 링크를 액티브 버킷 B로 전환합니다. 이때 모든 증분 데이터는 버킷 A로 자동으로 동기화되어 복제됩니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"사용자는 외부 원본 서버나 타 클라우드 벤더 측에 이중화 데이터를 백업하는 것과 함께 버킷 B에 Origin-pull 정책을 설정할 수 있습니다. 만약 액티브 버킷 A와 B의 링크가 동시에 연결되지 않는 최악의 상황을 가정할 경우, 버킷 B에 대한 데이터 업로드가 실패하면 버킷 B가 원본 서버로부터 데이터를 가져오게 됩니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"데이터 전체를 이중화하여 백업할 경우 많은 비용이 부과됩니다. 핫 데이터(예: 몇 시간 내 업로드한 파일)에 한해 이중화 백업을 함으로써 데이터 스토리지 비용을 절약할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"원본 서버를 고가용성 아키텍처의 일부로 선택할 경우, 원본 서버의 대역폭과 대역폭 제한에 따른 결과를 고려하여 아키텍처를 설계하십시오.\"}],\"start\":false,\"type\":\"uli\"}],\"hintType\":\"alert\",\"type\":\"hint\"},{\"children\":[{\"text\":\"버킷에 직접 액세스하여 데이터를 읽어올 수 있으며, 버킷에 \"},{\"children\":[{\"text\":\"CDN 가속 도메인 바인딩\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/18670\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/18670\"},\"type\":\"ref\"},{\"text\":\"을 하여 Tencent Cloud CDN의 엣지 노드에서 근거리 액세스를 할 수 있습니다. 비즈니스 데이터가 콘텐츠 전송 시나리오와 관련이 있거나 사용자가 버킷에 직접 액세스하는 것을 원치 않을 경우, \"},{\"children\":[{\"text\":\"Tencent Cloud CDN\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/228\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/228\"},\"type\":\"ref\"},{\"text\":\"을 함께 사용하는 것을 권장합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"버킷에서 직접 데이터를 읽어오려면 클라이언트에서 follow HTTP 302를 지원해야 합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"Tencent Cloud CDN은 약 천 개의 엣지 노드를 제공합니다. 사용자와 가까운 거리에 액세스 노드를 제공하여 읽어오는 속도를 높이고 있습니다. CDN에 여러 개의 원본 서버를 액티브/스탠바이 관계로 바인딩함으로써 고가용성을 보장할 수 있습니다. \"},{\"children\":[{\"text\":\"원본 서버 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/228/6289\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/228/6289\"},\"type\":\"ref\"},{\"text\":\"을 참고하여 설정하십시오.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"원본 서버의 보안을 강화하려면 원본 서버의 개인 읽기/쓰기 및 CDN Origin-pull 인증을 활성화하십시오. 사용자는 CDN 엣지 노드에 캐싱된 데이터에 익명으로 액세스할 수 있을 뿐만 아니라 원본 서버의 데이터 보안도 확보할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"참조 문서\"}],\"nodeId\":\".EC.B0.B8.EC.A1.B0-.EB.AC.B8.EC.84.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"재해 복구를 위한 고가용성 아키텍처를 사용할 때 다음 문서를 참조할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"버전 제어 개요\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/19883\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/19883\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"버킷 복사 개요\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/19237\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/19237\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"Origin-pull 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/31508\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/31508\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"CDN 가속 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/18670\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/18670\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"원본 서버 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/228/6289\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/228/6289\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"도메인 액세스\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/228/5734\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/228/5734\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"}]"}},"32537":{"categoryId":436,"weight":100,"type":"page","extension":"","pid":9511,"id":32537,"lang":"ko","title":"AWS S3 SDK를 사용하여 COS에 액세스하기","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:11","recentReleaseTime":"2019-12-06 19:34:11","content":{"title":"AWS S3 SDK를 사용하여 COS에 액세스하기","body":"

소개

Cloud Object Storage(COS)는 AWS S3 호환 API를 제공합니다. 데이터를 S3에서 COS로 마이그레이션한 후에 간단한 설정 수정만으로 클라이언트 애플리케이션을 손쉽게 COS 서비스와 호환 사용할 수 있습니다. 본 문서는 다양한 개발 플랫폼의 S3 SDK 적용 절차를 소개합니다. 이 추가 적용 절차가 끝나면 S3 SDK 인터페이스를 사용해 COS 파일에 액세스할 수 있습니다.

준비 작업

Signing Up하고 CAM 콘솔에서 Tencent Cloud 키 SecretID와 SecretKey를 얻습니다.
이제 S3 SDK를 통합해 정상 실행할 수 있는 클라이언트 애플리케이션이 준비되었습니다.

Android

다음은 AWS Android SDK 2.14.2 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다. 디바이스가 COS에 액세스하는 경우 영구 키를 클라이언트 코드에 두면 노출 위험이 커지므로 STS 서비스에 연결해 임시 키를 사용하십시오. 자세한 내용은 임시 키 생성 및 사용 가이드를 참조하십시오.

초기화

인스턴스를 초기화할 때 임시 키 제공자와 Endpoint 설정이 필요합니다. 버킷이 위치한 리전이 ap-guangzhou인 경우를 예로 들어봅니다.
AmazonS3Client s3 = new AmazonS3Client(new AWSCredentialsProvider() {
@Override
public AWSCredentials getCredentials() {
// 이 백그라운드에서 STS로 임시 키 정보를 요청합니다.
return new BasicSessionCredentials(
"<TempSecretID>", "<TempSecretKey>", "<STSSessionToken>"
);
}

@Override
public void refresh() {
//
}
});

s3.setEndpoint("cos.ap-guangzhou.myqcloud.com");

iOS

AWS iOS SDK 2.10.2 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다. 디바이스가 COS에 액세스하는 경우 영구 키를 클라이언트 코드에 두면 노출 위험이 커지므로 STS 서비스에 연결해 임시 키를 사용하십시오. 자세한 내용은 임시 키 생성 및 사용 가이드를 참조하십시오.

1. AWSCredentialsProvider 프로토콜 실행

-(AWSTask<AWSCredentials *> *)credentials{
// 이 백그라운드에서 STS로 임시 키 정보를 요청합니다.
AWSCredentials *credential = [[AWSCredentials alloc]initWithAccessKey:@"<TempSecretID>" secretKey:@"<TempSecretKey>" sessionKey:@"<STSSessionToken>" expiration:[NSDate dateWithTimeIntervalSince1970:1565770577]];

return [AWSTask taskWithResult:credential];

}

- (void)invalidateCachedTemporaryCredentials{

}

2. 임시 키 제공자와 Endpoint 제공

버킷이 위치한 리전이 ap-guangzhou인 경우
NSURL* bucketURL = [NSURL URLWithString:@"http://cos.ap-guangzhou.myqcloud.com"];

AWSEndpoint* endpoint = [[AWSEndpoint alloc] initWithRegion:AWSRegionUnknown service:AWSServiceS3 URL:bucketURL];
AWSServiceConfiguration* configuration = [[AWSServiceConfiguration alloc]
initWithRegion:AWSRegionUSEast2 endpoint:endpoint
credentialsProvider:[MyCredentialProvider new]]; // MyCredentialProvider가 AWSCredentialsProvider 프로토콜 실행

[[AWSServiceManager defaultServiceManager] setDefaultServiceConfiguration:configuration];

Node.js

AWS JS SDK 2.509.0 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다.

초기화

인스턴스를 초기화할 때 Tencent Cloud 키와 Endpoint를 설정합니다. 버킷이 위치한 리전이 ap-guangzhou라고 가정했을 경우 코드는 아래와 같이 표시됩니다.
var AWS = require('aws-sdk');

AWS.config.update({
accessKeyId: "COS_SECRETID",
secretAccessKey: "COS_SECRETKEY",
region: "ap-guangzhou",
endpoint: 'https://cos.ap-guangzhou.myqcloud.com',
});

s3 = new AWS.S3({apiVersion: '2006-03-01'});

Java

다음은 AWS Java SDK 1.11.609 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다.

1. AWS 구성 및 인증서 파일 수정하기

설명:
다음은 Linux를 예시로 AWS 구성 및 인증서 파일을 수정합니다.
AWS SDK 기본 구성 파일은 사용자 디렉터리에서 구성 및 인증서 파일을 참고하십시오.
설정파일(파일 위치는 ~/.aws/config)에서 다음 설정을 추가합니다.- 구성 파일(파일 위치는 ~/.aws/config)에서 다음 설정 정보를 추가합니다.
[default]
s3 =
addressing_style = virtual
인증서 파일(파일 위치는 ~/.aws/credentials)에서 Tencent Cloud 키를 설정합니다.
[default]
aws_access_key_id = [COS_SECRETID]
aws_secret_access_key = [COS_SECRETKEY]

2. 코드에서 Endpoint 설정하기

버킷이 위치한 리전이 ap-guangzhou라고 가정했을 때 코드는 다음과 같습니다.
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(
"http://cos.ap-guangzhou.myqcloud.com",
"ap-guangzhou"))
.build();
V2 버전의 AWS Java SDK를 사용하는 경우, 코드 예시는 다음과 같습니다:
S3Client s3Client = S3Client.builder()
.endpointOverride(URI.create("http://cos.ap-guangzhou.myqcloud.com"))
.region(Region.of("ap-guangzhou"))
.build();

Python

다음은 AWS Python SDK 1.9.205 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다.

1. AWS 구성 및 인증서 파일 수정하기

설명:
다음은 Linux를 예시로 AWS 구성 및 인증서 파일을 수정합니다.
AWS SDK 기본 구성 파일은 사용자 디렉터리에서 구성 및 인증서 파일을 참고하십시오.
구성 파일(파일 위치는 ~/.aws/config)에서 다음 설정을 추가합니다.
[default]
s3 =
signature_version = s3
addressing_style = virtual
인증서 파일(파일 위치는 ~/.aws/credentials)에서 Tencent Cloud 키를 설정합니다.
[default]
aws_access_key_id = [COS_SECRETID]
aws_secret_access_key = [COS_SECRETKEY]

2. 코드에서 Endpoint 설정하기

버킷이 위치한 리전이 ap-guangzhou인 경우
client = boto3.client('s3', endpoint_url='https://cos.ap-guangzhou.myqcloud.com')

PHP

다음은 AWS PHP SDK 3.109.3 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다.

1. AWS 구성 및 인증서 파일 수정하기

설명:
다음은 Linux를 예시로 AWS 구성 및 인증서 파일을 수정합니다.
AWS SDK 기본 구성 파일은 사용자 디렉터리에서 구성 및 인증서 파일을 참고하십시오.
구성 파일(파일 위치는 ~/.aws/config)에서 다음 설정을 추가합니다.
[default]
s3 =
addressing_style = virtual
인증서 파일(파일 위치는 ~/.aws/credentials)에서 Tencent Cloud 키를 설정합니다.
[default]
aws_access_key_id = [COS_SECRETID]
aws_secret_access_key = [COS_SECRETKEY]

2. 코드에서 Endpoint 설정하기

버킷이 위치한 리전이 ap-guangzhou인 경우
$S3Client = new S3Client([
"Region": "ap-guangzhou",
'version' => '2006-03-01',
'endpoint' => 'https://cos.ap-guangzhou.myqcloud.com'
]);


.NET

다음은 AWS .NET SDK 3.3.104.12 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다.

초기화

인스턴스를 초기화할 때 Tencent Cloud 키와 Endpoint를 설정합니다. 버킷이 속한 리전이 ap-guangzhou라고 가정했을 경우
string sAccessKeyId = "COS_SECRETID";
string sAccessKeySecret = "COS_SECRETKEY";
string region = "ap-guangzhou";

var config = new AmazonS3Config() { ServiceURL = "https://cos." + region + ".myqcloud.com" };
var client = new AmazonS3Client(sAccessKeyId, sAccessKeySecret, config);


Go

aws-sdk-go

다음은 AWS Go SDK 1.21.9 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다.

1. 키에 따라 session 생성하기

버킷이 위치한 리전이 ap-guangzhou인 경우
func newSession() (*session.Session, error) {
creds := credentials.NewStaticCredentials("COS_SECRETID", "COS_SECRETKEY", "")
"Region": "ap-guangzhou",
endpoint := "http://cos.ap-guangzhou.myqcloud.com"
config := &aws.Config{
Region: aws.String(region),
Endpoint: &endpoint,
S3ForcePathStyle: aws.Bool(true),
Credentials: creds,
// DisableSSL: &disableSSL,
}
return session.NewSession(config)
}

2. session에 따라 server 생성 요청 발송하기

sess, _ := newSession()
service := s3.New(sess)

// 파일 업로드의 경우
fp, _ := os.Open("yourLocalFilePath")
defer fp.Close()

ctx, cancel := context.WithTimeout(context.Background(), time.Duration(30)*time.Second)
defer cancel()

service.PutObjectWithContext(ctx, &s3.PutObjectInput{
Bucket: aws.String("examplebucket-1250000000"),
Key: aws.String("exampleobject"),
Body: fp,
})

aws-sdk-go-v2

아래는 aws-sdk-go-v2 버전의 객체 업로드를 예로 들어, COS 서비스에 접근하는 방법을 소개합니다.
package main

import (
"context"
"fmt"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/service/s3"
"os"
"strings"
)

func main() {
// 환경 변수 SECRETID와 SECRETKEY를 통해 키를 가져옵니다
creds := credentials.NewStaticCredentialsProvider(os.Getenv("SECRETID"), os.Getenv("SECRETKEY"), "") //키
customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
return aws.Endpoint{
PartitionID: "aws",
URL: "http://cos.ap-guangzhou.myqcloud.com",
SigningRegion: "ap-guangzhou",
}, nil

})

cfg, _ := config.LoadDefaultConfig(
context.TODO(),

config.WithCredentialsProvider(creds),
config.WithEndpointResolverWithOptions(customResolver))

s3Client := s3.NewFromConfig(cfg, func(o *s3.Options) {
o.UsePathStyle = false // virtual-host 방식을 사용하여 접근
})

input := &s3.PutObjectInput{
Body: strings.NewReader("xxxxxxx"),
Bucket: aws.String("test-1250000000"), //스토리지 버킷 이름
Key: aws.String("test"), //객체 키
StorageClass: "STANDARD",
}

result, err := s3Client.PutObject(context.Background(), input)
if err != nil {
panic(err)
}
fmt.Println(result)

C++

다음은 AWS C++ SDK 1.7.68 버전을 예시로 COS 서비스에 액세스하기 쉽게 적용하는 방법을 소개합니다.

1. AWS 구성 및 인증서 파일 수정하기

설명:
다음은 Linux를 예시로 AWS 구성 및 인증서 파일을 수정합니다.
AWS SDK 기본 구성 파일은 사용자 디렉터리에서 구성 및 인증서 파일을 참고하십시오.
구성 파일(파일 위치는 ~/.aws/config)에서 다음 설정을 추가합니다.
[default]
s3 =
addressing_style = virtual
인증서 파일(파일 위치는 ~/.aws/credentials)에서 Tencent Cloud 키를 설정합니다.
[default]
aws_access_key_id = [COS_SECRETID]
aws_secret_access_key = [COS_SECRETKEY]

2. 코드에서 Endpoint 설정하기

버킷이 위치한 리전이 ap-guangzhou라고 가정했을 때 코드는 다음과 같습니다.
Aws::Client::ClientConfiguration awsCC;
awsCC.scheme = Aws::Http::Scheme::HTTP;
awsCC.region = "ap-guangzhou";
awsCC.endpointOverride = "cos.ap-guangzhou.myqcloud.com";
Aws::S3::S3Client s3_client(awsCC);

","recentReleaseTime":"2025-01-24 13:10:25","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"ivAcUzos-_IZ-VHoWGg7o\"},{\"children\":[{\"text\":\"Cloud Object Storage(COS)는 AWS S3 호환 API를 제공합니다. 데이터를 S3에서 COS로 마이그레이션한 후에 간단한 설정 수정만으로 클라이언트 애플리케이션을 손쉽게 COS 서비스와 호환 사용할 수 있습니다. 본 문서는 다양한 개발 플랫폼의 S3 SDK 적용 절차를 소개합니다. 이 추가 적용 절차가 끝나면 S3 SDK 인터페이스를 사용해 COS 파일에 액세스할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"WgjOoNdGFlZ9x6b0nuACo\"},{\"children\":[{\"text\":\"준비 작업\"}],\"nodeId\":\".EC.A4.80.EB.B9.84-.EC.9E.91.EC.97.85\",\"type\":\"h4\",\"id\":\"dX1JzAOmXsc0oDNyCQXiY\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"Signing Up\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/378/17985\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/378/17985\"},\"type\":\"ref\",\"id\":\"J7-sD7ky3TT9LDzSWWW6e\"},{\"text\":\"하고 \"},{\"children\":[{\"text\":\"CAM 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cam/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/capi\"},\"type\":\"ref\",\"id\":\"w2oMUuwBYmTI-EEjxvfXe\"},{\"text\":\"에서 Tencent Cloud 키 SecretID와 SecretKey를 얻습니다.\"}],\"start\":true,\"type\":\"uli\",\"id\":\"oxOLcGW4ax5cBa9pzFgjZ\"},{\"children\":[{\"text\":\"이제 S3 SDK를 통합해 정상 실행할 수 있는 클라이언트 애플리케이션이 준비되었습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"54XjKJGJuS8ovSikpwdN6\"},{\"children\":[{\"text\":\"Android\"}],\"nodeId\":\"android\",\"type\":\"h2\",\"id\":\"HSuCniwVjt2azJ69DaK2y\"},{\"children\":[{\"text\":\"다음은 AWS Android SDK 2.14.2 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다. 디바이스가 COS에 액세스하는 경우 영구 키를 클라이언트 코드에 두면 노출 위험이 커지므로 STS 서비스에 연결해 임시 키를 사용하십시오. 자세한 내용은 \"},{\"children\":[{\"text\":\"임시 키 생성 및 사용 가이드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/14048\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/14048\"},\"type\":\"ref\",\"id\":\"8_8nuMnUVFDrSWrymcsHn\"},{\"text\":\"를 참조하십시오. \"}],\"type\":\"p\",\"id\":\"yM_mL0gOTcv5jXLr5S3aX\"},{\"children\":[{\"text\":\"초기화\"}],\"nodeId\":\".EC.B4.88.EA.B8.B0.ED.99.94\",\"type\":\"h4\",\"id\":\"Xc8MrtXVbkuUdpjR8JGNI\"},{\"children\":[{\"text\":\"인스턴스를 초기화할 때 임시 키 제공자와 Endpoint 설정이 필요합니다. 버킷이 위치한 리전이 \"},{\"code\":1,\"text\":\"ap-guangzhou\"},{\"text\":\"인 경우를 예로 들어봅니다.\"}],\"type\":\"p\",\"id\":\"-qe5brHTL-PpCyZk_YxBE\"},{\"children\":[{\"children\":[{\"text\":\"AmazonS3Client s3 = new AmazonS3Client(new AWSCredentialsProvider() {\"}],\"type\":\"code-line\",\"id\":\"_gF0EWdycwI6ZfN2C3f2W\"},{\"children\":[{\"text\":\" @Override\"}],\"type\":\"code-line\",\"id\":\"AHcLufwoZvEXvTYzl6fhX\"},{\"children\":[{\"text\":\" public AWSCredentials getCredentials() {\"}],\"type\":\"code-line\",\"id\":\"nWB_xfQ7AbgEzEBK_K_rT\"},{\"children\":[{\"text\":\" // 이 백그라운드에서 STS로 임시 키 정보를 요청합니다.\"}],\"type\":\"code-line\",\"id\":\"TAL4C3VOY9oYbhewchibC\"},{\"children\":[{\"text\":\" return new BasicSessionCredentials(\"}],\"type\":\"code-line\",\"id\":\"XOSDWGKXUoeZrQwYfse2A\"},{\"children\":[{\"text\":\" \\\"\\\", \\\"\\\", \\\"\\\"\"}],\"type\":\"code-line\",\"id\":\"R_Li2PkiQ4jtfy9GaRP5r\"},{\"children\":[{\"text\":\" );\"}],\"type\":\"code-line\",\"id\":\"xaAz8aZ7ug47r88bEiLNP\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"SExnmUFZRPXqh67GisIi2\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"fjPTJmkXBuxhafhU-IMF_\"},{\"children\":[{\"text\":\" @Override\"}],\"type\":\"code-line\",\"id\":\"4fD8P4vLSzp7j6Y7sgzRM\"},{\"children\":[{\"text\":\" public void refresh() {\"}],\"type\":\"code-line\",\"id\":\"ZrpUWyOBYSGxP6r1d-eJo\"},{\"children\":[{\"text\":\" //\"}],\"type\":\"code-line\",\"id\":\"lgDg6AmdUig1rrZGxUW6w\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"3QA9suDdgsohm8vH-X6kq\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\",\"id\":\"Tp-uw4czm2cZuL-LSRjAG\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"p1z38UeJy93rD40idGV5e\"},{\"children\":[{\"text\":\"s3.setEndpoint(\\\"cos.ap-guangzhou.myqcloud.com\\\"); \"}],\"type\":\"code-line\",\"id\":\"rOD_IjjKVJDf1kzWzrgpi\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"5D1oK-Ta4_kHL9jcbAuC1\",\"autoWrap\":false},{\"children\":[{\"text\":\"iOS\"}],\"nodeId\":\"ios\",\"type\":\"h2\",\"id\":\"nu_43-mnc175tlPXOiAff\"},{\"children\":[{\"text\":\"AWS iOS SDK 2.10.2 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다. 디바이스가 COS에 액세스하는 경우 영구 키를 클라이언트 코드에 두면 노출 위험이 커지므로 STS 서비스에 연결해 임시 키를 사용하십시오. 자세한 내용은 \"},{\"children\":[{\"text\":\"임시 키 생성 및 사용 가이드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/14048\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/14048\"},\"type\":\"ref\",\"id\":\"L-Qr1X9kfGMGhFAgf5hkJ\"},{\"text\":\"를 참조하십시오. \"}],\"type\":\"p\",\"id\":\"Mt_XyQzsgJzWAObf4rNt3\"},{\"children\":[{\"text\":\"1. AWSCredentialsProvider 프로토콜 실행\"}],\"nodeId\":\"1.-awscredentialsprovider-.ED.94.84.EB.A1.9C.ED.86.A0.EC.BD.9C-.EC.8B.A4.ED.96.89\",\"type\":\"h4\",\"id\":\"xg5XRE5VgDEdfpmqMoxIF\"},{\"children\":[{\"children\":[{\"text\":\"-(AWSTask *)credentials{\"}],\"type\":\"code-line\",\"id\":\"JcOydqTcSv8-afGJw6WW5\"},{\"children\":[{\"text\":\" // 이 백그라운드에서 STS로 임시 키 정보를 요청합니다.\"}],\"type\":\"code-line\",\"id\":\"6AH-cpN6tQBF6hVjoWoC4\"},{\"children\":[{\"text\":\" AWSCredentials *credential = [[AWSCredentials alloc]initWithAccessKey:@\\\"\\\" secretKey:@\\\"\\\" sessionKey:@\\\"\\\" expiration:[NSDate dateWithTimeIntervalSince1970:1565770577]];\"}],\"type\":\"code-line\",\"id\":\"Q2ZNFMDcUwEVXolT_Lniv\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"wqe3igjC2NlS8Xg4Pm5DK\"},{\"children\":[{\"text\":\" return [AWSTask taskWithResult:credential];\"}],\"type\":\"code-line\",\"id\":\"CieUD6v3Ehx1X6sHeQdJY\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"AnGx7mmU1Ujd2-VS2n1Ow\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"oThJJ774Qu886CXPj8cl7\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"2hdwnI-LHipuNGpvbVJG2\"},{\"children\":[{\"text\":\"- (void)invalidateCachedTemporaryCredentials{\"}],\"type\":\"code-line\",\"id\":\"srxznju6jXTdV7Tpn1oXt\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"lgi-1McIC9Q3DnBH6uaV5\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"wjV7AG-cDK109WABMInom\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"OjVkysjCZRSwkkWrZOxee\",\"autoWrap\":false},{\"children\":[{\"text\":\"2. 임시 키 제공자와 Endpoint 제공\"}],\"nodeId\":\"2.-.EC.9E.84.EC.8B.9C-.ED.82.A4-.EC.A0.9C.EA.B3.B5.EC.9E.90.EC.99.80-endpoint-.EC.A0.9C.EA.B3.B5\",\"type\":\"h4\",\"id\":\"oTR5PpS4ZhljmjXZE0KZQ\"},{\"children\":[{\"text\":\"버킷이 위치한 리전이 \"},{\"code\":1,\"text\":\"ap-guangzhou\"},{\"text\":\"인 경우\"}],\"type\":\"p\",\"id\":\"itXi_J393aqi-gFcP70nG\"},{\"children\":[{\"children\":[{\"text\":\"NSURL* bucketURL = [NSURL URLWithString:@\\\"http://cos.ap-guangzhou.myqcloud.com\\\"];\"}],\"type\":\"code-line\",\"id\":\"2hTAHvpyaHCpQ-449dAJd\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"1b9WCCFpgaNvMofYwl9bc\"},{\"children\":[{\"text\":\"AWSEndpoint* endpoint = [[AWSEndpoint alloc] initWithRegion:AWSRegionUnknown service:AWSServiceS3 URL:bucketURL];\"}],\"type\":\"code-line\",\"id\":\"Fg9vs0379oizK9LoPvLnl\"},{\"children\":[{\"text\":\"AWSServiceConfiguration* configuration = [[AWSServiceConfiguration alloc] \"}],\"type\":\"code-line\",\"id\":\"wwpgMTK5RT0IMexIg25gi\"},{\"children\":[{\"text\":\" initWithRegion:AWSRegionUSEast2 endpoint:endpoint \"}],\"type\":\"code-line\",\"id\":\"CYJ-p5GwK3H9Hn843O2pG\"},{\"children\":[{\"text\":\" credentialsProvider:[MyCredentialProvider new]]; // MyCredentialProvider가 AWSCredentialsProvider 프로토콜 실행\"}],\"type\":\"code-line\",\"id\":\"JwO8wWT-WtO8HFXuRDM6d\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"1VnKSFGat-lNQ5HVVRnzy\"},{\"children\":[{\"text\":\"[[AWSServiceManager defaultServiceManager] setDefaultServiceConfiguration:configuration];\"}],\"type\":\"code-line\",\"id\":\"wBnTERs9C2RNm0z1bgVJk\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"5sEuGQjGAyb2G7r_e8Duv\",\"autoWrap\":false},{\"children\":[{\"text\":\"Node.js\"}],\"nodeId\":\"node.js\",\"type\":\"h2\",\"id\":\"V3ZhvHvmDnz-xdM6i08Ld\"},{\"children\":[{\"text\":\"AWS JS SDK 2.509.0 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다.\"}],\"type\":\"p\",\"id\":\"DoAbQqv6XUFAZe4BdN_0G\"},{\"children\":[{\"text\":\"초기화\"}],\"nodeId\":\".EC.B4.88.EA.B8.B0.ED.99.942\",\"type\":\"h4\",\"id\":\"Dd40DQFF3urB83T5FVwSD\"},{\"children\":[{\"text\":\"인스턴스를 초기화할 때 Tencent Cloud 키와 Endpoint를 설정합니다. 버킷이 위치한 리전이 \"},{\"code\":1,\"text\":\"ap-guangzhou\"},{\"text\":\"라고 가정했을 경우 코드는 아래와 같이 표시됩니다.\"}],\"type\":\"p\",\"id\":\"KPONUUKWr1yWJlvEwBxEk\"},{\"children\":[{\"children\":[{\"text\":\"var AWS = require('aws-sdk');\"}],\"type\":\"code-line\",\"id\":\"7CMbKrQn-q5ZLrJ03GuAb\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"UEKoquTStppV1m6km30GH\"},{\"children\":[{\"text\":\"AWS.config.update({\"}],\"type\":\"code-line\",\"id\":\"69Zba0iUhgJ2ks5KEyilN\"},{\"children\":[{\"text\":\" accessKeyId: \\\"COS_SECRETID\\\",\"}],\"type\":\"code-line\",\"id\":\"FTIEWtbaoVyQPg_xu4WL4\"},{\"children\":[{\"text\":\" secretAccessKey: \\\"COS_SECRETKEY\\\",\"}],\"type\":\"code-line\",\"id\":\"3VNv46ucLNWPsNhaBdxf1\"},{\"children\":[{\"text\":\" region: \\\"ap-guangzhou\\\",\"}],\"type\":\"code-line\",\"id\":\"zq27L_MPAZWxeSnk3aEQ0\"},{\"children\":[{\"text\":\" endpoint: 'https://cos.ap-guangzhou.myqcloud.com',\"}],\"type\":\"code-line\",\"id\":\"VVkvFqp1kjmpB7aMpsNDX\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\",\"id\":\"Y5srBozgr1xOYE1Vr14cg\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"goE_mTaNbKCu_sJxy1k1m\"},{\"children\":[{\"text\":\"s3 = new AWS.S3({apiVersion: '2006-03-01'});\"}],\"type\":\"code-line\",\"id\":\"H7WFtetbRKVR9rSvAK73m\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"WuziOnn7RqH3IPMGLRP55\",\"autoWrap\":false},{\"children\":[{\"text\":\"Java\"}],\"nodeId\":\"java\",\"type\":\"h2\",\"id\":\"jzxXcZ9e_U9md285OYALd\"},{\"children\":[{\"text\":\"다음은 AWS Java SDK 1.11.609 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다.\"}],\"type\":\"p\",\"id\":\"FFOn2GNaP9BAPaTdIZMrY\"},{\"children\":[{\"text\":\"1. AWS 구성 및 인증서 파일 수정하기\"}],\"nodeId\":\"1.-aws-.EA.B5.AC.EC.84.B1-.EB.B0.8F-.EC.9D.B8.EC.A6.9D.EC.84.9C-.ED.8C.8C.EC.9D.BC-.EC.88.98.EC.A0.95.ED.95.98.EA.B8.B0\",\"type\":\"h4\",\"id\":\"UAv56KCvl45fPJ0VcwSyH\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"zqg9mC_deOC1hSlfLy1Oj\"},{\"children\":[{\"text\":\"다음은 Linux를 예시로 AWS 구성 및 인증서 파일을 수정합니다.\"}],\"type\":\"p\",\"id\":\"8jOh_D4cSBfDYdPwuBMqF\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"hrnaIZQtaLKNY1T0tkFBx\"},{\"children\":[{\"text\":\"AWS SDK 기본 구성 파일은 사용자 디렉터리에서 \"},{\"children\":[{\"text\":\"구성 및 인증서 파일\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html\",\"props\":{\"type\":\"link\",\"url\":\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html\"},\"type\":\"ref\",\"id\":\"U6mNy0q7jX4yNB_Vf8y8A\"},{\"text\":\"을 참고하십시오.\"}],\"type\":\"p\",\"id\":\"tjZZ3QNTrUxu6GAofXkt0\"},{\"children\":[{\"text\":\"설정파일(파일 위치는 \"},{\"code\":1,\"text\":\"~/.aws/config\"},{\"text\":\")에서 다음 설정을 추가합니다.- 구성 파일(파일 위치는 \"},{\"code\":1,\"text\":\"~/.aws/config\"},{\"text\":\")에서 다음 설정 정보를 추가합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"KEayIRaau0-p8Sy10tByZ\"},{\"children\":[{\"children\":[{\"text\":\"[default] \"}],\"type\":\"code-line\",\"id\":\"XS4w_NRKxZJHw_v7MR6fW\"},{\"children\":[{\"text\":\"s3 = \"}],\"type\":\"code-line\",\"id\":\"7I4sO7vRCxhBvDyjNB0_y\"},{\"children\":[{\"text\":\"addressing_style = virtual \"}],\"type\":\"code-line\",\"id\":\"u4vYI0gVOxINuygnriQMc\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"cUqIsKtHc9vt2a9ajV46H\",\"autoWrap\":false},{\"children\":[{\"text\":\"인증서 파일(파일 위치는 \"},{\"code\":1,\"text\":\"~/.aws/credentials\"},{\"text\":\")에서 Tencent Cloud 키를 설정합니다. \"}],\"start\":false,\"type\":\"uli\",\"id\":\"57tu7jqfbWwPRRr-UFJBr\"},{\"children\":[{\"children\":[{\"text\":\"[default] \"}],\"type\":\"code-line\",\"id\":\"6lIhS4PQh5D6AhVWYB_pH\"},{\"children\":[{\"text\":\"aws_access_key_id = [COS_SECRETID] \"}],\"type\":\"code-line\",\"id\":\"-MeSCtPz9y_Y9FklM7jeN\"},{\"children\":[{\"text\":\"aws_secret_access_key = [COS_SECRETKEY] \"}],\"type\":\"code-line\",\"id\":\"DPfNwVcmTo8D2pXAP1ViF\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"QRNe0xwYO98lMBH6VcKFl\",\"autoWrap\":false},{\"children\":[{\"text\":\"2. 코드에서 Endpoint 설정하기\"}],\"nodeId\":\"2.-.EC.BD.94.EB.93.9C.EC.97.90.EC.84.9C-endpoint-.EC.84.A4.EC.A0.95.ED.95.98.EA.B8.B0\",\"type\":\"h4\",\"id\":\"D8laF7Ar7dFIBX6EGnQ-5\"},{\"children\":[{\"text\":\"버킷이 위치한 리전이 \"},{\"code\":1,\"text\":\"ap-guangzhou\"},{\"text\":\"라고 가정했을 때 코드는 다음과 같습니다.\"}],\"type\":\"uli\",\"id\":\"h1KyJ7oZD9-Raxx3AiGSO\"},{\"children\":[{\"children\":[{\"text\":\"AmazonS3 s3Client = AmazonS3ClientBuilder.standard()\"}],\"type\":\"code-line\",\"id\":\"tBnCWWBD4M_TVJmm2gS2M\"},{\"children\":[{\"text\":\" .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(\"}],\"type\":\"code-line\",\"id\":\"uUY2NvopU3Dz_JzM5bJcu\"},{\"children\":[{\"text\":\" \\\"http://cos.ap-guangzhou.myqcloud.com\\\", \"}],\"type\":\"code-line\",\"id\":\"ihRk6-2TiRmKpaK0pswQG\"},{\"children\":[{\"text\":\" \\\"ap-guangzhou\\\"))\"}],\"type\":\"code-line\",\"id\":\"Aqdwuj_E3CKKksegb3q8n\"},{\"children\":[{\"text\":\" .build();\"}],\"type\":\"code-line\",\"id\":\"B4YYP83znWAqVqqr3_LZf\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"LlaLXKl05hJjyLL5ohNlJ\",\"autoWrap\":false},{\"__nid\":\"b1a25ff1f2629229358ba0259098f32606a9b8f7\",\"children\":[{\"text\":\"V2 버전의 AWS Java SDK를 사용하는 경우, 코드 예시는 다음과 같습니다:\"}],\"diff\":{\"type\":\"insert\"},\"id\":\"9ylN-yDCFqWxo4QoUMNZx\",\"type\":\"uli\"},{\"__nid\":\"g_4fNRRaoLXn2aorAV8V9\",\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"S3Client s3Client = S3Client.builder() \"}],\"id\":\"n2fm-U6PMz8wZMRiSUoEu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .endpointOverride(URI.create(\\\"http://cos.ap-guangzhou.myqcloud.com\\\")) \"}],\"id\":\"HcNXnXao3YJusHaPcYzp7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .region(Region.of(\\\"ap-guangzhou\\\")) \"}],\"id\":\"mualwqBWQVErzIMTTc128\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .build();\"}],\"id\":\"KY2UTvxln1OVrecMAQ-dg\",\"type\":\"code-line\"}],\"diff\":{\"type\":\"insert\"},\"id\":\"rNGU6heJagjvhYq3f2WUw\",\"language\":\"java\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"Python\"}],\"nodeId\":\"python\",\"type\":\"h2\",\"id\":\"86IqrA_vLKEfF-xApS3Cb\"},{\"children\":[{\"text\":\"다음은 AWS Python SDK 1.9.205 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다.\"}],\"type\":\"p\",\"id\":\"KVkmUxJVf7fcdm5iaLfqG\"},{\"children\":[{\"text\":\"1. AWS 구성 및 인증서 파일 수정하기\"}],\"nodeId\":\"1.-aws-.EA.B5.AC.EC.84.B1-.EB.B0.8F-.EC.9D.B8.EC.A6.9D.EC.84.9C-.ED.8C.8C.EC.9D.BC-.EC.88.98.EC.A0.95.ED.95.98.EA.B8.B02\",\"type\":\"h4\",\"id\":\"df3tpnkG1UOrkexXt2swy\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"pZJE2sF53kBuBWtiC3ogA\"},{\"children\":[{\"text\":\"다음은 Linux를 예시로 AWS 구성 및 인증서 파일을 수정합니다.\"}],\"type\":\"p\",\"id\":\"fkO8sejZ90hxsUv3h_WSo\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"NL2ju_rOHiD2O6lquZLfl\"},{\"children\":[{\"text\":\"AWS SDK 기본 구성 파일은 사용자 디렉터리에서 \"},{\"children\":[{\"text\":\"구성 및 인증서 파일\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html\",\"props\":{\"type\":\"link\",\"url\":\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html\"},\"type\":\"ref\",\"id\":\"1BNGLsY4OnTu0-dcy1ydX\"},{\"text\":\"을 참고하십시오.\"}],\"type\":\"p\",\"id\":\"h7qab7OYZRF0jT93nWLD1\"},{\"children\":[{\"text\":\"구성 파일(파일 위치는 \"},{\"code\":1,\"text\":\"~/.aws/config\"},{\"text\":\")에서 다음 설정을 추가합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"IA5Z7tfJ7MIJBmnOl8fYr\"},{\"children\":[{\"children\":[{\"text\":\"[default] \"}],\"type\":\"code-line\",\"id\":\"Us1-w-8SIPTtU4DCt8uxa\"},{\"children\":[{\"text\":\"s3 = \"}],\"type\":\"code-line\",\"id\":\"vUP1zQsR6TaqN8LuG91ds\"},{\"children\":[{\"text\":\" signature_version = s3\"}],\"type\":\"code-line\",\"id\":\"4azLgijZYR_5EJ1N3wZ_m\"},{\"children\":[{\"text\":\" addressing_style = virtual\"}],\"type\":\"code-line\",\"id\":\"lg5d31FKSv0ZfAP3XxhVm\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"XpvpRg0ym94I6DaA2cOUj\",\"autoWrap\":false},{\"children\":[{\"text\":\"인증서 파일(파일 위치는 \"},{\"code\":1,\"text\":\"~/.aws/credentials\"},{\"text\":\")에서 Tencent Cloud 키를 설정합니다. \"}],\"start\":false,\"type\":\"uli\",\"id\":\"TDwXliweZ_APGzD4l7duC\"},{\"children\":[{\"children\":[{\"text\":\"[default] \"}],\"type\":\"code-line\",\"id\":\"4CjsdXUVCc3k-29nnIq0N\"},{\"children\":[{\"text\":\"aws_access_key_id = [COS_SECRETID] \"}],\"type\":\"code-line\",\"id\":\"5O6rjE2PA7PnceTVYrbTk\"},{\"children\":[{\"text\":\"aws_secret_access_key = [COS_SECRETKEY] \"}],\"type\":\"code-line\",\"id\":\"JiMF_cH1hiuJ_Z5zDibro\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"OgiXKfy7WX0M9fdmnQX1a\",\"autoWrap\":false},{\"children\":[{\"text\":\"2. 코드에서 Endpoint 설정하기\"}],\"nodeId\":\"2.-.EC.BD.94.EB.93.9C.EC.97.90.EC.84.9C-endpoint-.EC.84.A4.EC.A0.95.ED.95.98.EA.B8.B02\",\"type\":\"h4\",\"id\":\"0YAAsfARoTIysqqHlTJOW\"},{\"children\":[{\"text\":\"버킷이 위치한 리전이 \"},{\"code\":1,\"text\":\"ap-guangzhou\"},{\"text\":\"인 경우\"}],\"type\":\"p\",\"id\":\"l4v3oltmNm_QS8UERc02M\"},{\"children\":[{\"children\":[{\"text\":\"client = boto3.client('s3', endpoint_url='https://cos.ap-guangzhou.myqcloud.com')\"}],\"type\":\"code-line\",\"id\":\"qrjXMjT9QgPSG_HyrtUEj\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"4sTKg56-wFrX1Z_anSrAU\",\"autoWrap\":false},{\"children\":[{\"text\":\"PHP\"}],\"nodeId\":\"php\",\"type\":\"h2\",\"id\":\"_HlClwy1RHFBNWL2M1l9H\"},{\"children\":[{\"text\":\"다음은 AWS PHP SDK 3.109.3 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다.\"}],\"type\":\"p\",\"id\":\"PyK4qC3lvzW3g1hGajH69\"},{\"children\":[{\"text\":\"1. AWS 구성 및 인증서 파일 수정하기\"}],\"nodeId\":\"1.-aws-.EA.B5.AC.EC.84.B1-.EB.B0.8F-.EC.9D.B8.EC.A6.9D.EC.84.9C-.ED.8C.8C.EC.9D.BC-.EC.88.98.EC.A0.95.ED.95.98.EA.B8.B03\",\"type\":\"h4\",\"id\":\"1fY-d7txIkyR6BU8viIkT\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"jxzF8syF8YwAzM_eIndqO\"},{\"children\":[{\"text\":\"다음은 Linux를 예시로 AWS 구성 및 인증서 파일을 수정합니다.\"}],\"type\":\"p\",\"id\":\"w8hU2VOme6k4ZsiqQEZTX\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"JOMdmeGKM7SIS2iVBstEg\"},{\"children\":[{\"text\":\"AWS SDK 기본 구성 파일은 사용자 디렉터리에서 \"},{\"children\":[{\"text\":\"구성 및 인증서 파일\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html\",\"props\":{\"type\":\"link\",\"url\":\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html\"},\"type\":\"ref\",\"id\":\"I-5bjeX7SaOnbYJnulnLZ\"},{\"text\":\"을 참고하십시오.\"}],\"type\":\"p\",\"id\":\"gRI84Xi4O-rIhpWT_6szA\"},{\"children\":[{\"text\":\"구성 파일(파일 위치는 \"},{\"code\":1,\"text\":\"~/.aws/config\"},{\"text\":\")에서 다음 설정을 추가합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"OerS4zU6cOzdkDJB0gnMs\"},{\"children\":[{\"children\":[{\"text\":\"[default] \"}],\"type\":\"code-line\",\"id\":\"68wePe4JYr-Y0aU-heU_-\"},{\"children\":[{\"text\":\"s3 = \"}],\"type\":\"code-line\",\"id\":\"HI33LwG481B2EBJ4_32rl\"},{\"children\":[{\"text\":\"addressing_style = virtual \"}],\"type\":\"code-line\",\"id\":\"ii-ghmJZ62mcL9M6wFKjb\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"Jq9suqkU4vEYMh7oFdgJn\",\"autoWrap\":false},{\"children\":[{\"text\":\"인증서 파일(파일 위치는 \"},{\"code\":1,\"text\":\"~/.aws/credentials\"},{\"text\":\")에서 Tencent Cloud 키를 설정합니다. \"}],\"start\":false,\"type\":\"uli\",\"id\":\"k7fn8wDigLhKgb7vvb_vD\"},{\"children\":[{\"children\":[{\"text\":\"[default] \"}],\"type\":\"code-line\",\"id\":\"0HW8mgpEWmACSGlziWy4X\"},{\"children\":[{\"text\":\"aws_access_key_id = [COS_SECRETID] \"}],\"type\":\"code-line\",\"id\":\"07brB7FJwE4ajm0_-1Hau\"},{\"children\":[{\"text\":\"aws_secret_access_key = [COS_SECRETKEY] \"}],\"type\":\"code-line\",\"id\":\"jaYXSu9sHQGut9kdCi-W2\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"L6XTQ5n1t6KmfezsVh8g4\",\"autoWrap\":false},{\"children\":[{\"text\":\"2. 코드에서 Endpoint 설정하기\"}],\"nodeId\":\"2.-.EC.BD.94.EB.93.9C.EC.97.90.EC.84.9C-endpoint-.EC.84.A4.EC.A0.95.ED.95.98.EA.B8.B03\",\"type\":\"h4\",\"id\":\"Ms82lxjo2fMA_gfQ99B4v\"},{\"children\":[{\"text\":\"버킷이 위치한 리전이 \"},{\"code\":1,\"text\":\"ap-guangzhou\"},{\"text\":\"인 경우\"}],\"type\":\"p\",\"id\":\"RnePHuMa4IlThhoHurnBS\"},{\"children\":[{\"children\":[{\"text\":\"$S3Client = new S3Client([\"}],\"type\":\"code-line\",\"id\":\"N7W_Ex1-w3S1BUzQ7EZAz\"},{\"children\":[{\"text\":\" \\\"Region\\\": \\\"ap-guangzhou\\\",\"}],\"type\":\"code-line\",\"id\":\"hhwgLYuTeCoGewicL7Uf0\"},{\"children\":[{\"text\":\" 'version' => '2006-03-01',\"}],\"type\":\"code-line\",\"id\":\"O7NmWGk5-5uiQKnX10I2Y\"},{\"children\":[{\"text\":\" 'endpoint' => 'https://cos.ap-guangzhou.myqcloud.com'\"}],\"type\":\"code-line\",\"id\":\"kt3AR4CRWxgxvASqIM98p\"},{\"children\":[{\"text\":\"]);\"}],\"type\":\"code-line\",\"id\":\"c8afV8CnUZ3eJX5FugWwR\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"HgyA3PUbWqv-OvQ2TMZQb\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"PageYzk67-QdDQqa4-Gtp\",\"autoWrap\":false},{\"children\":[{\"text\":\".NET\"}],\"nodeId\":\".net\",\"type\":\"h2\",\"id\":\"Ptj5bFB_FpHz1HpMvqAcP\"},{\"children\":[{\"text\":\"다음은 AWS .NET SDK 3.3.104.12 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다.\"}],\"type\":\"p\",\"id\":\"l9mSKiBEPFBcIF2LDVHbw\"},{\"children\":[{\"text\":\"초기화\"}],\"nodeId\":\".EC.B4.88.EA.B8.B0.ED.99.943\",\"type\":\"h4\",\"id\":\"FMYMewNUdbSduYuL8b2GP\"},{\"children\":[{\"text\":\"인스턴스를 초기화할 때 Tencent Cloud 키와 Endpoint를 설정합니다. 버킷이 속한 리전이 \"},{\"code\":1,\"text\":\"ap-guangzhou\"},{\"text\":\"라고 가정했을 경우\"}],\"type\":\"p\",\"id\":\"4rWB2OkR_J6jJ0RD_zOE7\"},{\"children\":[{\"children\":[{\"text\":\"string sAccessKeyId = \\\"COS_SECRETID\\\";\"}],\"type\":\"code-line\",\"id\":\"3U0XxxgL5s8tXm-vmvqNq\"},{\"children\":[{\"text\":\"string sAccessKeySecret = \\\"COS_SECRETKEY\\\";\"}],\"type\":\"code-line\",\"id\":\"2R6ujXlQVnYO7oTNaCCXO\"},{\"children\":[{\"text\":\"string region = \\\"ap-guangzhou\\\";\"}],\"type\":\"code-line\",\"id\":\"VB-j6duo2yfdLH8CgF2xL\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"YyfZcs_2A2Ny5e76UYGtL\"},{\"children\":[{\"text\":\"var config = new AmazonS3Config() { ServiceURL = \\\"https://cos.\\\" + region + \\\".myqcloud.com\\\" };\"}],\"type\":\"code-line\",\"id\":\"thIvsU26b5PIl-v5TQ_EU\"},{\"children\":[{\"text\":\"var client = new AmazonS3Client(sAccessKeyId, sAccessKeySecret, config);\"}],\"type\":\"code-line\",\"id\":\"Zqsg34EqWq0cy69-QPMa8\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"pbu1qVk5ACtXMgXMzly4N\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"6XyM7z2IGa15XWEN-V5-g\",\"autoWrap\":false},{\"children\":[{\"text\":\"Go\"}],\"nodeId\":\"go\",\"type\":\"h2\",\"id\":\"tqHKJP5QPoNoUSW15z72b\"},{\"type\":\"h3\",\"id\":\"dLcUs0lSmdM9w4klAdbnt\",\"children\":[{\"text\":\"aws-sdk-go\"}],\"nodeId\":\"583635f8-c763-4dda-98c1-58ab629b8224\"},{\"children\":[{\"text\":\"다음은 AWS Go SDK 1.21.9 버전을 예시로 COS 서비스에 액세스하기 위한 방법을 소개합니다.\"}],\"type\":\"p\",\"id\":\"42xYZIB7zkFiej0l4RTIv\"},{\"children\":[{\"text\":\"1. 키에 따라 session 생성하기\"}],\"nodeId\":\"1.-.ED.82.A4.EC.97.90-.EB.94.B0.EB.9D.BC-session-.EC.83.9D.EC.84.B1.ED.95.98.EA.B8.B0\",\"type\":\"h4\",\"id\":\"muSoGJ0ZkIGVdwDl5GY-X\"},{\"children\":[{\"text\":\"버킷이 위치한 리전이 \"},{\"code\":1,\"text\":\"ap-guangzhou\"},{\"text\":\"인 경우\"}],\"type\":\"p\",\"id\":\"UR_r0Ipr0CdZW7j3MMgu1\"},{\"children\":[{\"children\":[{\"text\":\"func newSession() (*session.Session, error) {\"}],\"type\":\"code-line\",\"id\":\"Doh63X92iFGhL5beKyyVl\"},{\"children\":[{\"text\":\" creds := credentials.NewStaticCredentials(\\\"COS_SECRETID\\\", \\\"COS_SECRETKEY\\\", \\\"\\\")\"}],\"type\":\"code-line\",\"id\":\"dTjAYO1pu971SLQwCT5Md\"},{\"children\":[{\"text\":\" \\\"Region\\\": \\\"ap-guangzhou\\\",\"}],\"type\":\"code-line\",\"id\":\"htjdKxhBSRQyOAV_pzjoL\"},{\"children\":[{\"text\":\" endpoint := \\\"http://cos.ap-guangzhou.myqcloud.com\\\"\"}],\"type\":\"code-line\",\"id\":\"4VrDObTMdrZ6bpu45eZ7k\"},{\"children\":[{\"text\":\" config := &aws.Config{\"}],\"type\":\"code-line\",\"id\":\"mA7VuqAUEilpATvcpgxBv\"},{\"children\":[{\"text\":\" Region: aws.String(region),\"}],\"type\":\"code-line\",\"id\":\"hY0tHSqXmKzxI0PaygrbL\"},{\"children\":[{\"text\":\" Endpoint: &endpoint,\"}],\"type\":\"code-line\",\"id\":\"TSvmwcuABzjgia_KmEmQE\"},{\"children\":[{\"text\":\" S3ForcePathStyle: aws.Bool(true),\"}],\"type\":\"code-line\",\"id\":\"noXGY6nGUhC365X6aozTN\"},{\"children\":[{\"text\":\" Credentials: creds,\"}],\"type\":\"code-line\",\"id\":\"nA8Oixc_YL06Pk5dQLbfC\"},{\"children\":[{\"text\":\" // DisableSSL: &disableSSL,\"}],\"type\":\"code-line\",\"id\":\"wJnpBuQJyhMLhd543l7wN\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"hsOKhDNQwWHFtu7K6c24w\"},{\"children\":[{\"text\":\" return session.NewSession(config)\"}],\"type\":\"code-line\",\"id\":\"DuyOqpP2g0qsaAScf_n9V\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"j19KjOLQWjQS6HASbGI3R\"}],\"language\":\"go\",\"type\":\"code-block\",\"id\":\"b4Zv3DNiJGWfjjV_gms_y\",\"autoWrap\":false},{\"children\":[{\"text\":\"2. session에 따라 server 생성 요청 발송하기\"}],\"nodeId\":\"2.-session.EC.97.90-.EB.94.B0.EB.9D.BC-server-.EC.83.9D.EC.84.B1-.EC.9A.94.EC.B2.AD-.EB.B0.9C.EC.86.A1.ED.95.98.EA.B8.B0\",\"type\":\"h4\",\"id\":\"8qmvv83WEzGbmUVBpCK24\"},{\"children\":[{\"children\":[{\"text\":\"sess, _ := newSession()\"}],\"type\":\"code-line\",\"id\":\"dc9EYmzGKXwlKShx4K3QC\"},{\"children\":[{\"text\":\"service := s3.New(sess)\"}],\"type\":\"code-line\",\"id\":\"22uwADC00PLfygLhA4O-G\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"8TaiDQ0o9KkVHiXbUo7nb\"},{\"children\":[{\"text\":\"// 파일 업로드의 경우\"}],\"type\":\"code-line\",\"id\":\"aGN0KmsGVGnNudq_TwnMb\"},{\"children\":[{\"text\":\"fp, _ := os.Open(\\\"yourLocalFilePath\\\")\"}],\"type\":\"code-line\",\"id\":\"6MuSFx3fXlKzV_x3ol7Sp\"},{\"children\":[{\"text\":\"defer fp.Close()\"}],\"type\":\"code-line\",\"id\":\"C7068nloxfqHeJ-pFZhNK\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"o2X2WJSJtStLIWB_mDfRz\"},{\"children\":[{\"text\":\"ctx, cancel := context.WithTimeout(context.Background(), time.Duration(30)*time.Second)\"}],\"type\":\"code-line\",\"id\":\"u4q0Kk6Js47dqOnGSdwxY\"},{\"children\":[{\"text\":\"defer cancel()\"}],\"type\":\"code-line\",\"id\":\"PJHdBSjfgTAGWlEq9Epfw\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"TcgWM3fsgCzI_wiiwI1af\"},{\"children\":[{\"text\":\"service.PutObjectWithContext(ctx, &s3.PutObjectInput{\"}],\"type\":\"code-line\",\"id\":\"3csXMDB5GsXdauqqwbl7n\"},{\"children\":[{\"text\":\" Bucket: aws.String(\\\"examplebucket-1250000000\\\"),\"}],\"type\":\"code-line\",\"id\":\"Jpc0AsNHlZ8r6DzUfx37U\"},{\"children\":[{\"text\":\" Key: aws.String(\\\"exampleobject\\\"),\"}],\"type\":\"code-line\",\"id\":\"QAJILFGFzEBuqbPdT4mX9\"},{\"children\":[{\"text\":\" Body: fp,\"}],\"type\":\"code-line\",\"id\":\"FR-3qpJJ36dNeV2ma2yk6\"},{\"children\":[{\"text\":\"})\"}],\"type\":\"code-line\",\"id\":\"QcyoYzKORnlN0QQtq1-Vu\"}],\"language\":\"go\",\"type\":\"code-block\",\"id\":\"aBRqBqIUECc6b8UHdVopq\",\"autoWrap\":false},{\"children\":[{\"text\":\"aws-sdk-go-v2\"}],\"id\":\"77uf_LHMkh43BmkDYqLk8\",\"nodeId\":\"bf9c860d-78d7-4605-adb6-353b452baa09\",\"type\":\"h3\"},{\"children\":[{\"text\":\"아래는 aws-sdk-go-v2 버전의 객체 업로드를 예로 들어, COS 서비스에 접근하는 방법을 소개합니다.\"}],\"id\":\"utfJpWdweaPPmSX8iG2ij\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"package main\"}],\"id\":\"WIvvlWh2g6NDw797Bg-KZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"1FP0pdsueNN7i4FBID6QJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import (\"}],\"id\":\"CpOBLNJCFscwQHfgMWLml\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"context\\\"\"}],\"id\":\"WVp94UWv-IS52jBL6Blgd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"fmt\\\"\"}],\"id\":\"93SEcm03_49LLSHIxgdZx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"github.com/aws/aws-sdk-go-v2/aws\\\"\"}],\"id\":\"FSYLDq1GxLr1H4J8yLVRc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"github.com/aws/aws-sdk-go-v2/config\\\"\"}],\"id\":\"_3G4D8SNEDoCHddOP0PpW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"github.com/aws/aws-sdk-go-v2/credentials\\\"\"}],\"id\":\"iB-SkmgeOq1uIFY4ZjPCW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"github.com/aws/aws-sdk-go-v2/service/s3\\\"\"}],\"id\":\"3i5AK13OkOli5Ut3x5hgN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"os\\\"\"}],\"id\":\"e9watA9mjFMegtC2pB9ap\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"strings\\\"\"}],\"id\":\"swNpXeoaC3EYQvAlBzNzj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\")\"}],\"id\":\"tKInfwbieyYy5ZdDveSqb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"AgOhHtcO04QB_ugfyE_Pu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"func main() {\"}],\"id\":\"BJr9AYAYE5_CNR2z564ng\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 환경 변수 SECRETID와 SECRETKEY를 통해 키를 가져옵니다\"}],\"id\":\"_vgTPW0ipYJGt47o8qnDd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" creds := credentials.NewStaticCredentialsProvider(os.Getenv(\\\"SECRETID\\\"), os.Getenv(\\\"SECRETKEY\\\"), \\\"\\\") //키\"}],\"id\":\"71JMzEwE6tDK110e8WRuS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {\"}],\"id\":\"DDtDyelQpAF5bml8FAIek\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return aws.Endpoint{\"}],\"id\":\"0d8p9182kEMg6LcwEbsNh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" PartitionID: \\\"aws\\\",\"}],\"id\":\"7ODGq2IrEmFmULaOYbHfi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" URL: \\\"http://cos.ap-guangzhou.myqcloud.com\\\",\"}],\"id\":\"01zGDrMVxSb6cZva8pDAy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" SigningRegion: \\\"ap-guangzhou\\\",\"}],\"id\":\"x468PoivIvO5ivjHidI_V\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }, nil\"}],\"id\":\"uHWMucqUEGTvV4uaFvzkm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"M4vDK7Ss-YcQ22TSD6fCM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" })\"}],\"id\":\"da26DWYa-fdiVklorRHZt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"lsZ16SOVDiD3JQygHX1tr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" cfg, _ := config.LoadDefaultConfig(\"}],\"id\":\"8qFtn_ncoaglaip24lRtP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" context.TODO(),\"}],\"id\":\"CqEsBfd2G5Sf_Q_N7Xmu7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"jUqXHc6FrzoBzqSy3LqC2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.WithCredentialsProvider(creds),\"}],\"id\":\"OCfZPRQarJTDX2qlKeqpY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.WithEndpointResolverWithOptions(customResolver))\"}],\"id\":\"NJwmzniQEp3ybwiO7YK2_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"44aTmA3UhNmxHbyGhr1aN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" s3Client := s3.NewFromConfig(cfg, func(o *s3.Options) {\"}],\"id\":\"ihGkSGWKjRMu5wRSBl3Uz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" o.UsePathStyle = false // virtual-host 방식을 사용하여 접근\"}],\"id\":\"pmlMcUlFLl-rallcGvEGj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" })\"}],\"id\":\"sWvKQ0FAoWfj_v1UCPm6R\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"_OwSJqs9spe3d29pfF25H\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" input := &s3.PutObjectInput{\"}],\"id\":\"7zl90EyFL-BraKX4qJCXJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Body: strings.NewReader(\\\"xxxxxxx\\\"),\"}],\"id\":\"pgUoIEZ2VVyRIFavxlZEH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Bucket: aws.String(\\\"test-1250000000\\\"), //스토리지 버킷 이름\"}],\"id\":\"0HUEWD4ii7xzgYkhhjAHV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Key: aws.String(\\\"test\\\"), //객체 키\"}],\"id\":\"JgjdhLgr78bnLM8idIJKS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" StorageClass: \\\"STANDARD\\\",\"}],\"id\":\"Dx6cqgPs_Y41Z9InSf62F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"LVtPhwBY6Z_mNRtbRISK5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"wvkxWuGS8BJ3gkQRSgjFo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" result, err := s3Client.PutObject(context.Background(), input)\"}],\"id\":\"F6RYLLVbSb_mONdnvGfXP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if err != nil {\"}],\"id\":\"0F1JhYXfEg2puO8QyF0JL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" panic(err)\"}],\"id\":\"R5tEjmm7Fsnp_d5-fkcNI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"kAQ53QaQMlmJ4A1nMKsEu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fmt.Println(result)\"}],\"id\":\"VMQnUfJ3b-5hUs3fJU_2_\",\"type\":\"code-line\"}],\"id\":\"UXYczqrYAO3d7Zkhjdb6M\",\"language\":\"go\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"C++\"}],\"nodeId\":\"c.2B.2B\",\"type\":\"h2\",\"id\":\"KUVsj-F3eaCltGdLE1MpS\"},{\"children\":[{\"text\":\"다음은 AWS C++ SDK 1.7.68 버전을 예시로 COS 서비스에 액세스하기 쉽게 적용하는 방법을 소개합니다.\"}],\"type\":\"p\",\"id\":\"a3dRSCC2vuXQi6A6s2Ix8\"},{\"children\":[{\"text\":\"1. AWS 구성 및 인증서 파일 수정하기\"}],\"nodeId\":\"1.-aws-.EA.B5.AC.EC.84.B1-.EB.B0.8F-.EC.9D.B8.EC.A6.9D.EC.84.9C-.ED.8C.8C.EC.9D.BC-.EC.88.98.EC.A0.95.ED.95.98.EA.B8.B04\",\"type\":\"h4\",\"id\":\"rC9XEZVfk8bIXVJJMaHCb\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"A3xim6tiVz_FqZRf816UG\"},{\"children\":[{\"text\":\"다음은 Linux를 예시로 AWS 구성 및 인증서 파일을 수정합니다.\"}],\"type\":\"p\",\"id\":\"rZRo9vg-cdSiiScD3DnCB\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"Hfp7pjqCSO_AUdzX6zh04\"},{\"children\":[{\"text\":\"AWS SDK 기본 구성 파일은 사용자 디렉터리에서 \"},{\"children\":[{\"text\":\"구성 및 인증서 파일\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html\",\"props\":{\"type\":\"link\",\"url\":\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html\"},\"type\":\"ref\",\"id\":\"goCl72O7bAfCq_GonkM_F\"},{\"text\":\"을 참고하십시오.\"}],\"type\":\"p\",\"id\":\"bcNV_qSfShj87ycUMutWA\"},{\"children\":[{\"text\":\"구성 파일(파일 위치는 \"},{\"code\":1,\"text\":\"~/.aws/config\"},{\"text\":\")에서 다음 설정을 추가합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"OJV_Iq6OnNZYuIhlu8rvP\"},{\"children\":[{\"children\":[{\"text\":\"[default] \"}],\"type\":\"code-line\",\"id\":\"rRfSDzi2v8fDlsDGtIjVV\"},{\"children\":[{\"text\":\"s3 = \"}],\"type\":\"code-line\",\"id\":\"dFTV-cjeDBH8VzfApetB3\"},{\"children\":[{\"text\":\"addressing_style = virtual \"}],\"type\":\"code-line\",\"id\":\"th4e1HvHIeaNmq85qfM81\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"CX16IRvWEEyAbPwewrwjC\",\"autoWrap\":false},{\"children\":[{\"text\":\"인증서 파일(파일 위치는 \"},{\"code\":1,\"text\":\"~/.aws/credentials\"},{\"text\":\")에서 Tencent Cloud 키를 설정합니다. \"}],\"start\":false,\"type\":\"uli\",\"id\":\"Vfx5jUUVc-L3xW0pFtSDq\"},{\"children\":[{\"children\":[{\"text\":\"[default] \"}],\"type\":\"code-line\",\"id\":\"dcKMvJYQpOU-SbajiG9_p\"},{\"children\":[{\"text\":\"aws_access_key_id = [COS_SECRETID] \"}],\"type\":\"code-line\",\"id\":\"bYUY5foIERuyQzcjs79BD\"},{\"children\":[{\"text\":\"aws_secret_access_key = [COS_SECRETKEY] \"}],\"type\":\"code-line\",\"id\":\"jjd0a1d2wPPbYclu_RKq0\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"6Ei89F42mZsAJWLVQLlrJ\",\"autoWrap\":false},{\"children\":[{\"text\":\"2. 코드에서 Endpoint 설정하기\"}],\"nodeId\":\"2.-.EC.BD.94.EB.93.9C.EC.97.90.EC.84.9C-endpoint-.EC.84.A4.EC.A0.95.ED.95.98.EA.B8.B04\",\"type\":\"h4\",\"id\":\"_FN3fFETZDLZcaGZ6XctI\"},{\"children\":[{\"text\":\"버킷이 위치한 리전이 \"},{\"code\":1,\"text\":\"ap-guangzhou\"},{\"text\":\"라고 가정했을 때 코드는 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"e59t0P6nvh7vIVWcJaCRA\"},{\"children\":[{\"children\":[{\"text\":\"Aws::Client::ClientConfiguration awsCC;\"}],\"type\":\"code-line\",\"id\":\"s-eGn18gOA0DrAk7MPpvm\"},{\"children\":[{\"text\":\"awsCC.scheme = Aws::Http::Scheme::HTTP;\"}],\"type\":\"code-line\",\"id\":\"ExlAhJdUC77MN-mP5GoGS\"},{\"children\":[{\"text\":\"awsCC.region = \\\"ap-guangzhou\\\";\"}],\"type\":\"code-line\",\"id\":\"-2XsPI14XBESy6o-XRMdN\"},{\"children\":[{\"text\":\"awsCC.endpointOverride = \\\"cos.ap-guangzhou.myqcloud.com\\\"; \"}],\"type\":\"code-line\",\"id\":\"h69CgV_04BZT_9ynq8_Zz\"},{\"children\":[{\"text\":\"Aws::S3::S3Client s3_client(awsCC);\"}],\"type\":\"code-line\",\"id\":\"bLzRia1PCp-hwBPnLgpsK\"}],\"language\":\"cpp\",\"type\":\"code-block\",\"id\":\"eowgrmVT-ILSIb7E9Jnkz\",\"autoWrap\":false},{\"type\":\"p\",\"children\":[{\"text\":\"\"}],\"id\":\"RGxSWTY-K_wXK0kJ9wMI5\"}]"}},"32962":{"categoryId":436,"weight":130,"type":"page","extension":"","pid":9511,"id":32962,"lang":"ko","title":"개요","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:10","recentReleaseTime":"2019-12-06 19:34:10","content":{"title":"개요","body":"
COS(Cloud Object Storage)는 액세스 제어, 권한 관리, 성능 최적화, 데이터 마이그레이션, 데이터 다이렉트 업로드 및 백업, 데이터 보안 도메인 관리, 빅 데이터, 서버리스 아키텍처 등 다양한 응용 시나리오 및 사례 운영 상세 설명을 제공하여 더욱 빠르고 편리하게 다양한 비즈니스 수요를 충족합니다. 구체적인 사례는 다음과 같습니다.
모범 사례
설명
액세스 제어 및 권한 관리
액세스 제어 및 권한 관리는 Tencent Cloud COS 중 가장 실용적인 기능으로, 이해를 돕기 위해 본 디렉터리 사례를 참고하십시오.
성능 최적화
COS는 더 높은 요청률을 달성하기 위해 성능 확장을 지원합니다. 자세한 지침은 요청 속도 및 성능 최적화를 참고하십시오.
COS는 열악한 네트워크 조건에서 모바일 장치의 업로드 성공률을 향상시키기 위해 멀티파트 업로드의 부분 크기를 동적으로 조정할 수 있습니다. 자세한 내용은 약한 네트워크 환경에서 멀티파트 업로드 재개를 참고하십시오.
COS는 AWS S3 호환 API를 제공합니다. 아래와 같이 간단한 설정 수정으로 S3 SDK 인터페이스를 사용해 COS 파일에 액세스하는 방법을 소개합니다.
재해 복구 및 백업
재해 복구 및 백업에 대한 모범 사례와 적용 가능한 솔루션은 다음 세 가지 시나리오에 요약되어 있습니다.
도메인 이름 관리
HTTPS 사용자 정의 도메인 이름을 구성하여 COS에 액세스할 수 있습니다. 자세한 내용은 사용자 지정 엔드포인트에 대한 HTTPS 지원을 참고하십시오.
COS에서 CORS 규칙을 설정할 수 있습니다. 자세한 내용은 CORS 설정을 참고하십시오.
COS에서 정적 웹사이트를 호스팅할 수 있습니다. 자세한 내용은 Hosting Static Website를 참고하십시오.
COS에서 프런트엔드 단일 페이지 애플리케이션을 구축할 수 있습니다. 자세한 내용은 COS 정적 웹 사이트 기능을 통해 프런트엔드 단일 페이지 애플리케이션 구축을 참고하십시오.
데이터 다이렉트 업로드
다음은 데이터 다이렉트 업로드의 모범 사례입니다.
데이터 보안
사전 이벤트 방지, 중간 이벤트 모니터링 및 사후 이벤트 역추적 측면에서 데이터 보안 솔루션을 설명합니다. 자세한 내용은 COS 데이터 보안 솔루션 소개를 참고하십시오.
COS에서 링크 도용 방지를 구성하여 액세스 소스를 제어할 수 있습니다. 자세한 내용은 링크 도용 방지 사례를 참고하십시오.
데이터 검증
MD5 체크섬을 사용하여 COS에 업로드된 데이터의 무결성을 보장할 수 있습니다. 자세한 내용은 MD5 검증을 참고하십시오.
CRC-64 체크섬을 사용하여 데이터를 검증할 수 있습니다. 자세한 내용은 CRC64 검사를 참고하십시오.
빅 데이터
Druid의 Deep storage로 COS를 사용할 수 있습니다. 자세한 내용은 COS를 Druid의 Deep storage로 사용을 참고하십시오.
Terraform을 사용하여 COS를 관리할 수 있습니다.
DataX를 사용하여 COS에서 데이터를 가져오거나 COS에서 내보낼 수 있습니다. 자세한 내용은 DataX로 COS 가져오기 또는 내보내기를 참고하십시오.
CDH를 사용하여 COSN을 구성할 수 있습니다. 자세한 내용은 CDH용 COSN 구성을 참고하십시오.
COS Ranger를 사용하여 권한을 제어할 수 있습니다. 자세한 내용은 COS Ranger 권한 시스템 솔루션을 참고하십시오.
Oceanus와 COS를 연결할 수 있습니다. 자세한 내용은 Oceanus를 COS에 연결을 참고하십시오.
3rd party 애플리케이션에서 COS 사용
COS 일반 설정을 사용하여 S3 호환 3rd party 애플리케이션의 데이터를 COS에 저장할 수 있습니다. 자세한 내용은 S3와 호환되는 타사 애플리케이션에서 COS의 일반 구성 사용를 참고하십시오.
원격 첨부 기능을 사용하여 포럼 첨부 파일을 COS에 저장할 수 있습니다.
WordPress 플러그인을 사용하여 COS에 멀티미디어 콘텐츠를 저장할 수 있습니다. 자세한 내용은 COS에 WordPress 원격 첨부 파일 저장하기를 참고하십시오.
API를 통해 여러 파일을 압축할 수 있습니다.
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"COS(Cloud Object Storage)는 액세스 제어, 권한 관리, 성능 최적화, 데이터 마이그레이션, 데이터 다이렉트 업로드 및 백업, 데이터 보안 도메인 관리, 빅 데이터, 서버리스 아키텍처 등 다양한 응용 시나리오 및 사례 운영 상세 설명을 제공하여 더욱 빠르고 편리하게 다양한 비즈니스 수요를 충족합니다. 구체적인 사례는 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"aFafp0jezeFYO-VjjPFJF\"},{\"type\":\"table\",\"rowHeader\":true,\"children\":[{\"type\":\"row\",\"children\":[{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"모범 사례\"}],\"id\":\"6uFieWPo1sij5JMThT-MQ\"}],\"id\":\"sMD2BWu96yzzQRPY6iG7C\"},{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"설명\"}],\"id\":\"zkWYXUhdVHtkr5JI3nDn2\"}],\"id\":\"lO_qp43hYKoMEz692HubQ\"}],\"id\":\"d1lMH2C_Z9JqMAucka0Qu\"},{\"type\":\"row\",\"children\":[{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"액세스 제어 및 권한 관리\"}],\"id\":\"U-O2CuR031zRJG-thPoT-\"}],\"id\":\"Z6hDi7DhcnPNMLErE3xXf\"},{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"액세스 제어 및 권한 관리는 Tencent Cloud COS 중 가장 실용적인 기능으로, 이해를 돕기 위해 본 디렉터리 사례를 참고하십시오.\"}],\"id\":\"3ZVVxWj-vhErnn4Cm177c\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/12470\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"ACL 액세스 제어 사례\"}],\"id\":\"FsG4_z3MmaNsB-qPSVsku\"},{\"text\":\"\"}],\"id\":\"9eoOOAGl6WoQEpPpkc2a4\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/12469\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"CAM 사례\"}],\"id\":\"C2EtftVp7mWF0Z3rr8hkn\"},{\"text\":\"\"}],\"id\":\"YAYKHDRi0-MHQP7FHqU0l\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/11714\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"서브 계정에 COS 액세스 권한 부여\"}],\"id\":\"KFEmqp3q3Ty_wHE_iTnvw\"},{\"text\":\"\"}],\"id\":\"nXvX7l6RSPqYIExUpauni\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/12514\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"권한 설정 관련 사례\"}],\"id\":\"z6bT97v-bvITJ1MKRFz-5\"},{\"text\":\"\"}],\"id\":\"lWjEYUm5whnJuKOmS7tQ7\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/30580\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"COS API 권한 부여 정책 사용 가이드\"}],\"id\":\"y4mcBcRBzeQ7Bpwapee7I\"},{\"text\":\"\"}],\"id\":\"ybkSnT6xR0gzEWoWMFrvJ\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/35265\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"프런트엔드에서 COS로 다이렉트 업로드 시 임시 자격 증명 사용 보안 가이드\"}],\"id\":\"BUZT12BxCBnuLcqJbeNgY\"},{\"text\":\"\"}],\"id\":\"gD11bAnrM4O_2f20jQO7p\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14048\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"임시 키 생성 및 사용 가이드\"}],\"id\":\"6emYDCNFqAl_EZkljJOPE\"},{\"text\":\"\"}],\"id\":\"mhFcxUQozhYvruJMpLzve\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/30931\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"서브 계정에 태그별 버킷 가져오기 권한 부여\"}],\"id\":\"Bl7y1tmD7karZpBwx225t\"},{\"text\":\"\"}],\"id\":\"60YYKHl5IRUa0geGBGF0p\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/46206\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"조건 키 설명 및 사용 예시\"}],\"id\":\"x6yJvFXZeaP_TDpK4IgKW\"},{\"text\":\"\"}],\"id\":\"IsCYpp50DYlZKm7xayTib\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/32971\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"한 루트 계정의 서브 계정에 다른 루트 계정의 버킷 작업 권한 부여\"}],\"id\":\"2Q6wZ5FmdRtw7vwf-EOph\"},{\"text\":\"\"}],\"id\":\"FWRTcuFZCs9xB0b191Soa\"}],\"id\":\"icEenzKYGZ6GyY_Ln-N2F\"}],\"id\":\"pKx6BcIOcjf8sbhSqxs9B\"},{\"type\":\"row\",\"children\":[{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"성능 최적화\"}],\"id\":\"YBL0eq7oNL8T-Z_rY2Un9\"}],\"id\":\"X_S3K8Rgzrx3HZTm6jwwe\"},{\"type\":\"cell\",\"children\":[{\"type\":\"uli\",\"children\":[{\"text\":\"COS는 더 높은 요청률을 달성하기 위해 성능 확장을 지원합니다. 자세한 지침은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/13653\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"요청 속도 및 성능 최적화\"}],\"id\":\"umOGg6Zz-u5df72ID9Dnj\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"RBLmnTt1-775hNEludmDa\"},{\"type\":\"uli\",\"children\":[{\"text\":\"COS는 열악한 네트워크 조건에서 모바일 장치의 업로드 성공률을 향상시키기 위해 멀티파트 업로드의 부분 크기를 동적으로 조정할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/30932\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"약한 네트워크 환경에서 멀티파트 업로드 재개\"}],\"id\":\"dCFQaYitcjtvhU8zDgUYk\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"kqBsjHFU4sq091sZtB-2K\"}],\"id\":\"iBbnkMuXAZW6PJLHnwslZ\"}],\"id\":\"QFLrYP4RSji1HG-fu8cmP\"},{\"type\":\"row\",\"children\":[{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/32537\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"AWS S3 SDK로 COS에 액세스\"}],\"id\":\"V0eWm6iUeMt8cntXnfoQW\"},{\"text\":\"\"}],\"id\":\"zqREbGbsC57UsxCfP6Aw0\"}],\"id\":\"fKVSQpq3N5YfRRyKS90fr\"},{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"COS는 AWS S3 호환 API를 제공합니다. 아래와 같이 간단한 설정 수정으로 S3 SDK 인터페이스를 사용해 COS 파일에 액세스하는 방법을 소개합니다.\"}],\"id\":\"Q6nVukPqug8Wv_omzctI6\"}],\"id\":\"MUdaeE4eK9Gg6mKt15wkD\"}],\"id\":\"xWI2MPLmvvUQtEGWcbrP-\"},{\"type\":\"row\",\"children\":[{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"재해 복구 및 백업\"}],\"id\":\"2tN6oynJWJSxD-LBhd2lx\"}],\"id\":\"ZRJGuHbbKWebUkptoumfA\"},{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"재해 복구 및 백업에 대한 모범 사례와 적용 가능한 솔루션은 다음 세 가지 시나리오에 요약되어 있습니다.\"}],\"id\":\"OHiDgjCJvSepmYG7V0Ggi\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/32535\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"버킷 복사 기반의 재해 복구 고가용성 아키텍처\"}],\"id\":\"cm45AddG-xf6z9anpvt0u\"},{\"text\":\"\"}],\"id\":\"1JQ5utYnpeJPxqpNjnvsF\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/35263\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"클라우드 데이터 백업\"}],\"id\":\"J-FB1t5C-ZK3Y2N15ck0y\"},{\"text\":\"\"}],\"id\":\"3ZjgM9l9pjj1lOnOVf_ds\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/35264\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"로컬 데이터 백업\"}],\"id\":\"1z2AIoDKt-cjQgQDprsvB\"},{\"text\":\"\"}],\"id\":\"V9gTgTPfKuPd97_6SIYqm\"}],\"id\":\"pyzZXOhQyedWq8BnPPBpF\"}],\"id\":\"alXDsk_4aOx_BtQlUI9qi\"},{\"type\":\"row\",\"children\":[{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"도메인 이름 관리\"}],\"id\":\"UtNDrWqFWUD1efRn8nxmL\"}],\"id\":\"bhGzUxxNWjdRQl6ahpzHF\"},{\"type\":\"cell\",\"children\":[{\"type\":\"uli\",\"children\":[{\"text\":\"HTTPS 사용자 정의 도메인 이름을 구성하여 COS에 액세스할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/11142\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"사용자 지정 엔드포인트에 대한 HTTPS 지원\"}],\"id\":\"AEDJOt4KZ5s449G1uDPgO\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"tgLuRdvm9ohzmiJfr_Vyh\"},{\"type\":\"uli\",\"children\":[{\"text\":\"COS에서 CORS 규칙을 설정할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/11488\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"CORS 설정\"}],\"id\":\"goeg-rTggQ0hlweyEk7vw\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"KLTxBYNarxIUkO8cqmAi0\"},{\"type\":\"uli\",\"children\":[{\"text\":\"COS에서 정적 웹사이트를 호스팅할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/9512\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"Hosting Static Website\"}],\"id\":\"WnHtVHJj6Fhgdoyn5hWc2\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"PJLfCjRugbc2bzM9dsAV6\"},{\"type\":\"uli\",\"children\":[{\"text\":\"COS에서 프런트엔드 단일 페이지 애플리케이션을 구축할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/43860\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"COS 정적 웹 사이트 기능을 통해 프런트엔드 단일 페이지 애플리케이션 구축\"}],\"id\":\"3mjb4SQHEBsJyLpzUeyTB\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"QZKQKd4CCRvRVknAYWav8\"}],\"id\":\"1TUraCtd2NGwqX2xaeZ4D\"}],\"id\":\"3litYp6NF4x85RtueKU_b\"},{\"type\":\"row\",\"children\":[{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"데이터 다이렉트 업로드\"}],\"id\":\"a4u0Mih3ymPS8m0aNBBba\"}],\"id\":\"YOfYEy3jYSTAVjNimw4Mn\"},{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"다음은 데이터 다이렉트 업로드의 모범 사례입니다.\"}],\"id\":\"XBArxEgJnqLga6V7NusGg\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/9067\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"Web의 다이렉트 업로드 사례\"}],\"id\":\"gWedYNQ2_smS2SUQK-EET\"},{\"text\":\"\"}],\"id\":\"mQQCyLvcR-ANHtTmS1Nxk\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/30934\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"미니프로그램 다이렉트 업로드 사례\"}],\"id\":\"eYY1Bn--QiooaN1uec2J8\"},{\"text\":\"\"}],\"id\":\"thTwBEIoku8DzmBfOiiDa\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/30618\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"모바일 애플리케이션 다이렉트 업로드 사례\"}],\"id\":\"ZJCBtoMfvSqFLbk7X0CVq\"},{\"text\":\"\"}],\"id\":\"4FFNfke7LRLyadPhLsZvV\"},{\"type\":\"uli\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/46466\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"uni-app 다이렉트 업로드 사례\"}],\"id\":\"rlYGKU65dvNRIEbj_VKHm\"},{\"text\":\"\"}],\"id\":\"ZhutkXI7b9ZnKrGf8IQSF\"}],\"id\":\"BVjp3XGNrIJy7NRvz83N_\"}],\"id\":\"9s4LFKYPanSRy8f8odHYn\"},{\"type\":\"row\",\"children\":[{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"데이터 보안\"}],\"id\":\"2XV8DuutsVZWerZzkSxAq\"}],\"id\":\"nn7eYAI6pJUWYHl9mXK11\"},{\"type\":\"cell\",\"children\":[{\"type\":\"uli\",\"children\":[{\"text\":\"사전 이벤트 방지, 중간 이벤트 모니터링 및 사후 이벤트 역추적 측면에서 데이터 보안 솔루션을 설명합니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/38853\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"COS 데이터 보안 솔루션 소개\"}],\"id\":\"tc-bY6C4rz5m9zATelt3m\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"djPunUkQ0zGrKMWD6cutl\"},{\"type\":\"uli\",\"children\":[{\"text\":\"COS에서 링크 도용 방지를 구성하여 액세스 소스를 제어할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/32466\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"링크 도용 방지 사례\"}],\"id\":\"MZw4UjoiX0xSntKH6YOIV\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"MYbtb10rcvTTfTZT_jiNf\"}],\"id\":\"fIoRLxIdfxAEyx6_Tk-tN\"}],\"id\":\"iG_bBzZc9VOWviJQ8Jlin\"},{\"type\":\"row\",\"children\":[{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"데이터 검증\"}],\"id\":\"y9mAJDYdKLiMsA7tMFudj\"}],\"id\":\"5KW-RjSLsGePqYE7vSGAn\"},{\"type\":\"cell\",\"children\":[{\"type\":\"uli\",\"children\":[{\"text\":\"MD5 체크섬을 사용하여 COS에 업로드된 데이터의 무결성을 보장할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/32467\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"MD5 검증\"}],\"id\":\"gIx060GfgnwhosWmz8AW_\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"ZAOXNa0IoGPg80cmWkWYw\"},{\"type\":\"uli\",\"children\":[{\"text\":\"CRC-64 체크섬을 사용하여 데이터를 검증할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/34078\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"CRC64 검사\"}],\"id\":\"W1L2PEXfQeGEQOWSzQhtx\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"hxOkGUM-JPpf6L3uSqtgL\"}],\"id\":\"8a6JpFPf4T7azj9hJRqN2\"}],\"id\":\"QsvHtXnlV4J_tmcnl_isL\"},{\"type\":\"row\",\"children\":[{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"빅 데이터\"}],\"id\":\"S0bshwYUjI71xtE5049Yk\"}],\"id\":\"s2Rq3xO3RgaY48w1C22HF\"},{\"type\":\"cell\",\"children\":[{\"type\":\"uli\",\"children\":[{\"text\":\"Druid의 Deep storage로 COS를 사용할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/18740\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"COS를 Druid의 Deep storage로 사용\"}],\"id\":\"1jV-7nrx9SiIckImjwnIQ\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"4dIsYS8gT1qWXfROsKeo3\"},{\"type\":\"uli\",\"children\":[{\"text\":\"Terraform을 사용하여 COS를 관리할 수 있습니다.\"}],\"id\":\"lRhsrZ3deveaOwFLNR3jA\"},{\"type\":\"uli\",\"children\":[{\"text\":\"DataX를 사용하여 COS에서 데이터를 가져오거나 COS에서 내보낼 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/36008\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"DataX로 COS 가져오기 또는 내보내기\"}],\"id\":\"UmWiCgxa7cEg-8c5LDhEj\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"zGMUWco3x349cQ_EJQyQO\"},{\"type\":\"uli\",\"children\":[{\"text\":\"CDH를 사용하여 COSN을 구성할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/37881\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"CDH용 COSN 구성\"}],\"id\":\"4zYhMjgk2t9hLK6nLlngG\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"eePqESKem7edTZIcq-CGC\"},{\"type\":\"uli\",\"children\":[{\"text\":\"COS Ranger를 사용하여 권한을 제어할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/39144\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"COS Ranger 권한 시스템 솔루션\"}],\"id\":\"QstuaUhXC4kDe-3XO4o-r\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"EHPE4ZD_fq0b1_7SlK1RQ\"},{\"type\":\"uli\",\"children\":[{\"text\":\"Oceanus와 COS를 연결할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/47422\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"Oceanus를 COS에 연결\"}],\"id\":\"VCk-8oj5pZIp-AU0dsF7g\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"0is5xsR6ZtiVZ1awQ2JpI\"}],\"id\":\"0GejzQ1KrXFep01szDkJ1\"}],\"id\":\"Q5Kda3-KVFDcEgE3W8sUW\"},{\"type\":\"row\",\"children\":[{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"3rd party 애플리케이션에서 COS 사용\"}],\"id\":\"eiuXqJuym-J883a2UcooZ\"}],\"id\":\"r2y9G6t0LMcPdaMJYToGg\"},{\"type\":\"cell\",\"children\":[{\"type\":\"uli\",\"children\":[{\"text\":\"COS 일반 설정을 사용하여 S3 호환 3rd party 애플리케이션의 데이터를 COS에 저장할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/34688\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"S3와 호환되는 타사 애플리케이션에서 COS의 일반 구성 사용\"}],\"id\":\"bIhV06G8DK5p4Sjg-O3le\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"yK2PLFosl2-HlamNN-S2T\"},{\"type\":\"uli\",\"children\":[{\"text\":\"원격 첨부 기능을 사용하여 포럼 첨부 파일을 COS에 저장할 수 있습니다.\"}],\"id\":\"qdezLbBmbkGXbkamBA4JZ\"},{\"type\":\"uli\",\"children\":[{\"text\":\"WordPress 플러그인을 사용하여 COS에 멀티미디어 콘텐츠를 저장할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/34082\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"COS에 WordPress 원격 첨부 파일 저장하기\"}],\"id\":\"yO7gwf4uvcGcGn9HBIkc6\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"rOVWrW0CzfzXC3kzI1duK\"}],\"id\":\"M_pfbFg6APYPy5imhvGWn\"}],\"id\":\"EYR1IP7K3nnHt6Y9JAdW-\"},{\"type\":\"row\",\"children\":[{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/41619\"},\"linkTarget\":\"self\",\"children\":[{\"text\":\"API를 통한 파일 일괄 압축\"}],\"id\":\"cWhC0TWTHXfUMR1A0Bxfz\"},{\"text\":\"\"}],\"id\":\"dwRlJNnf-pGBwovEJZeLh\"}],\"id\":\"JCbineZI0PpNxt10eO8_l\"},{\"type\":\"cell\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"API를 통해 여러 파일을 압축할 수 있습니다.\"}],\"id\":\"SXsciD-M8xDg1h6fFBFPY\"}],\"id\":\"uTHUF2HZ7FBJhX0ekiqV0\"}],\"id\":\"1gRLHbf7jqFiAz6pK72hm\"}],\"id\":\"tLjSM0xhjwu1022hE4Byo\",\"widths\":[26,74],\"widthMode\":\"percentage\"}]"}},"32971":{"categoryId":436,"weight":1,"type":"page","extension":"","pid":12473,"id":32971,"lang":"ko","title":"다른 루트 계정에 있는 서브 계정에 버킷 권한 부여","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2019-12-06 19:34:11","recentReleaseTime":"2019-12-06 19:34:11","content":{"title":"다른 루트 계정에 있는 서브 계정에 버킷 권한 부여","body":"

작업 시나리오

루트 계정 A(APPID: 1250000000)에는 examplebucket1-1250000000examplebucket2-1250000000이라는 두 개의 버킷이 있으며 루트 계정 B의 서브 계정 B0은 비즈니스 요구 사항을 충족하기 위해 조작하려고 합니다. 이 문서에서는 그렇게 할 수 있는 권한을 부여하는 방법을 설명합니다.

작업 단계

루트 계정 B에 A 계정이 소유한 버킷에 대한 권한 부여

1. 루트 계정 A로 COS 콘솔에 로그인합니다.
2. 버킷 리스트를 클릭하고 인증할 버킷을 찾은 다음 이름을 클릭하여 버킷 세부 정보 페이지로 들어갑니다.
3. 왼쪽 사이드바에서 권한 관리를 클릭하여 버킷의 권한 관리 페이지로 이동합니다.
4. Policy 권한 설정 구성 항목을 찾아 정책 추가를 클릭하고 사용자 지정 정책을 선택한 후 다음을 클릭합니다.
5. 아래와 같이 양식을 작성합니다.
정책 ID: 선택 사항입니다.
효과: 허용
사용자: 사용자 추가를 클릭하고 사용자 유형을 루트 계정으로 선택한 후 계정 ID에 루트 계정 B의 UIN을 입력합니다. 예시: 100000000002.
리소스: 필요에 따라 선택합니다. 기본값은 버킷 전체입니다.
리소스 경로: 리소스 지정 시에만 작성하며, 필요에 따라 작성합니다.
작업: 작업 추가를 클릭하고 모든 작업을 선택합니다. 일부 작업만 권한을 부여할 경우 실제 필요한 작업 한 개 또는 여러 개를 선택할 수 있습니다.
조건: 필요에 따라 작성하며, 필요 없는 경우 비워 둘 수 있습니다.
6. 완료를 클릭하여 루트 계정 B가 버킷에 대해 지정한 권한을 부여합니다.
7. 기타 버킷에 대한 권한 부여가 필요한 경우 이상의 순서를 다시 반복합니다.

서브 계정 B0에 A 계정이 소유한 버킷에 대한 권한 부여

1. 루트 계정 B를 사용하여 CAM 콘솔에 로그인한 후 정책 페이지로 이동합니다.
2. 사용자 정의 정책 생성 > 정책 구문으로 생성을 선택하고 빈 템플릿을 선택한 후 다음을 클릭합니다.
설명:
루트 계정 B에서 서브 계정 B0에 권한을 부여합니다. 사용자 정의 정책을 통해서만 권한을 부여할 수 있으며, 사전 설정 정책을 통한 권한 부여는 지원하지 않습니다.
3. 다음과 같이 작성합니다.
정책 이름: 중복되지 않고 의미가 있는 정책 이름을 사용자 정의합니다. 예: cos-child-account
비고: 선택 가능하며, 직접 작성합니다.
정책 내용:
{
"version": "2.0",
"statement": [
{
"action": "cos:*",
"effect": "allow",
"resource": [
"qcs::cos::uid/1250000000:examplebucket1-1250000000/*",
"qcs::cos::uid/1250000000:examplebucket2-1250000000/*"
]
}
]
}
위의 정책은 루트 계정 B에 작업 권한이 있는 A 명의로 된 버킷을 모두 서브 계정 B0에 인가하는 것을 의미합니다. 여기서, uid/1250000000 중의 1250000000는 루트 계정 A의 APPID이고, examplebucket1-1250000000examplebucket2-1250000000은 루트 계정 B에 작업 권한이 있는 A 명의로 된 버킷입니다.
4. 완료를 클릭하면 정책 생성이 완료됩니다.
5. 정책 리스트에서 생성된 정책을 찾아 오른쪽 사용자/사용자 그룹/역할 연결을 클릭합니다.
6. 팝업창에서 서브 계정 B0을 선택하고 확인을 클릭합니다.
7. 권한 부여 작업이 완료됩니다. 이제 서브 계정 B0의 키를 사용하여 A 소유의 버킷에 대한 작업을 테스트해 볼 수 있습니다.
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"작업 시나리오\"}],\"nodeId\":\".EC.9E.91.EC.97.85-.EC.8B.9C.EB.82.98.EB.A6.AC.EC.98.A4\",\"type\":\"h2\",\"id\":\"JXLiEzdplMd9xJh2n8O_J\"},{\"children\":[{\"text\":\"루트 계정 A(APPID: 1250000000)에는 \"},{\"code\":1,\"text\":\"examplebucket1-1250000000\"},{\"text\":\" 및 \"},{\"code\":1,\"text\":\"examplebucket2-1250000000\"},{\"text\":\"이라는 두 개의 버킷이 있으며 루트 계정 B의 서브 계정 B0은 비즈니스 요구 사항을 충족하기 위해 조작하려고 합니다. 이 문서에서는 그렇게 할 수 있는 권한을 부여하는 방법을 설명합니다.\"}],\"type\":\"p\",\"id\":\"NIWbFBfTHKxoktnE3KhNM\"},{\"children\":[{\"text\":\"작업 단계\"}],\"nodeId\":\".EC.9E.91.EC.97.85-.EB.8B.A8.EA.B3.84\",\"type\":\"h2\",\"id\":\"Hg_PmmWGSraF_-GrRIb1_\"},{\"children\":[{\"text\":\"루트 계정 B에 A 계정이 소유한 버킷에 대한 권한 부여\"}],\"nodeId\":\".EB.A3.A8.ED.8A.B8-.EA.B3.84.EC.A0.95-b.EC.97.90-a-.EA.B3.84.EC.A0.95.EC.9D.B4-.EC.86.8C.EC.9C.A0.ED.95.9C-.EB.B2.84.ED.82.B7.EC.97.90-.EB.8C.80.ED.95.9C-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h4\",\"id\":\"UfS5pnj4ocg6_1BoUALN4\"},{\"children\":[{\"text\":\"루트 계정 A로 \"},{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\",\"id\":\"3Bu35zNXKfIqea_KLCzyn\"},{\"text\":\"에 로그인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"yA8TFBsGE94FuN6YgApaO\"},{\"children\":[{\"b\":1,\"text\":\"버킷 리스트\"},{\"text\":\"를 클릭하고 인증할 버킷을 찾은 다음 이름을 클릭하여 버킷 세부 정보 페이지로 들어갑니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"mKZgJp-pTInyUpk6GAg2Z\"},{\"children\":[{\"text\":\"왼쪽 사이드바에서 \"},{\"b\":1,\"text\":\"권한 관리\"},{\"text\":\"를 클릭하여 버킷의 권한 관리 페이지로 이동합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"a7GaG_0KJWSRYqv29XTPq\"},{\"children\":[{\"b\":1,\"text\":\"Policy 권한 설정\"},{\"text\":\" 구성 항목을 찾아 \"},{\"b\":1,\"text\":\"정책 추가\"},{\"text\":\"를 클릭하고 사용자 지정 정책을 선택한 후 \"},{\"b\":1,\"text\":\"다음\"},{\"text\":\"을 클릭합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"3MOq-6E-xJtgn_f4sD7CL\"},{\"children\":[{\"text\":\"아래와 같이 양식을 작성합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"r8l1_eq8yT8z_LdLDpDvt\"},{\"children\":[{\"b\":1,\"text\":\"정책 ID\"},{\"text\":\": 선택 사항입니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"HgDN4NLaLy3Qy4FZl_93g\"},{\"children\":[{\"b\":1,\"text\":\"효과\"},{\"text\":\": 허용\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"qVNBeaHPnaLjUzVjAVtUZ\"},{\"children\":[{\"b\":1,\"text\":\"사용자\"},{\"text\":\": 사용자 추가를 클릭하고 사용자 유형을 루트 계정으로 선택한 후 계정 ID에 루트 계정 B의 UIN을 입력합니다. 예시: 100000000002.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"5kG-j7GSNMHa9PN7P8YXk\"},{\"children\":[{\"b\":1,\"text\":\"리소스\"},{\"text\":\": 필요에 따라 선택합니다. 기본값은 버킷 전체입니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"VvqcKPlj4DUMtSHPr25si\"},{\"children\":[{\"b\":1,\"text\":\"리소스 경로\"},{\"text\":\": 리소스 지정 시에만 작성하며, 필요에 따라 작성합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"kUII9hGbJkliBVm8btO1E\"},{\"children\":[{\"b\":1,\"text\":\"작업\"},{\"text\":\": 작업 추가를 클릭하고 모든 작업을 선택합니다. 일부 작업만 권한을 부여할 경우 실제 필요한 작업 한 개 또는 여러 개를 선택할 수 있습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"tc5b89OZqjHIncDMfpuWl\"},{\"children\":[{\"b\":1,\"text\":\"조건\"},{\"text\":\": 필요에 따라 작성하며, 필요 없는 경우 비워 둘 수 있습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"dCmJvhqeYMAieQPB5YM0j\"},{\"children\":[{\"b\":1,\"text\":\"완료\"},{\"text\":\"를 클릭하여 루트 계정 B가 버킷에 대해 지정한 권한을 부여합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"stE5BpJyZWsujh8CRWrAy\"},{\"children\":[{\"text\":\"기타 버킷에 대한 권한 부여가 필요한 경우 이상의 순서를 다시 반복합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"yLqXghxPBeea-z2o-MmuV\"},{\"children\":[{\"text\":\"서브 계정 B0에 A 계정이 소유한 버킷에 대한 권한 부여\"}],\"nodeId\":\".EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95-b0.EC.97.90-a-.EA.B3.84.EC.A0.95.EC.9D.B4-.EC.86.8C.EC.9C.A0.ED.95.9C-.EB.B2.84.ED.82.B7.EC.97.90-.EB.8C.80.ED.95.9C-.EA.B6.8C.ED.95.9C-.EB.B6.80.EC.97.AC\",\"type\":\"h4\",\"id\":\"to3G0lIPNO2EaH4KG0idD\"},{\"children\":[{\"text\":\"루트 계정 B를 사용하여 CAM 콘솔에 로그인한 후 \"},{\"children\":[{\"text\":\"정책\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cam/policy\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/policy\"},\"type\":\"ref\",\"id\":\"WcziicTna3IkuGbqsuNxu\"},{\"text\":\" 페이지로 이동합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"cVJk8uJx8WH6qSzoly1JN\"},{\"children\":[{\"b\":1,\"text\":\"사용자 정의 정책 생성 > 정책 구문으로 생성\"},{\"text\":\"을 선택하고 빈 템플릿을 선택한 후 \"},{\"b\":1,\"text\":\"다음\"},{\"text\":\"을 클릭합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"HHMbCT2Fw3UbbogiTXMlP\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"AW67r-_k_yj6yxr1ZccXg\"},{\"children\":[{\"text\":\"루트 계정 B에서 서브 계정 B0에 권한을 부여합니다. 사용자 정의 정책을 통해서만 권한을 부여할 수 있으며, 사전 설정 정책을 통한 권한 부여는 지원하지 않습니다.\"}],\"type\":\"p\",\"id\":\"6nIHWABuVis-YGDlWjbqH\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\",\"id\":\"DoTxRXF1kHbVhuvCPUgI3\"},{\"children\":[{\"text\":\"다음과 같이 작성합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"iMi1oUPdNOJfIS7ryHBG2\"},{\"children\":[{\"b\":1,\"text\":\"정책 이름\"},{\"text\":\": 중복되지 않고 의미가 있는 정책 이름을 사용자 정의합니다. 예: cos-child-account\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"LgBNX0evrpVjN0osG4F62\"},{\"children\":[{\"b\":1,\"text\":\"비고\"},{\"text\":\": 선택 가능하며, 직접 작성합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"2hKd7Jrq7MHzrOFZjwH1Y\"},{\"children\":[{\"b\":1,\"text\":\"정책 내용\"},{\"text\":\":\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"i1KMSJHcB5qrq-vNukJlS\"},{\"children\":[{\"type\":\"code-line\",\"id\":\"FmXiQ5o2di0T2L2Z2zfju\",\"children\":[{\"text\":\"{\"}]},{\"type\":\"code-line\",\"id\":\"gCjchWf96fd3LOiuN7Gml\",\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}]},{\"type\":\"code-line\",\"id\":\"g5gtB49WwD8vNrfFl2_L0\",\"children\":[{\"text\":\" \\\"statement\\\": [\"}]},{\"type\":\"code-line\",\"id\":\"hs3Mkb69Qgd1lkwFxOKM0\",\"children\":[{\"text\":\" {\"}]},{\"type\":\"code-line\",\"id\":\"CqgcNfFG2F8cKtrJPRUP2\",\"children\":[{\"text\":\" \\\"action\\\": \\\"cos:*\\\",\"}]},{\"type\":\"code-line\",\"id\":\"ftCWQbK8xdk-g6xmF3YEr\",\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}]},{\"type\":\"code-line\",\"id\":\"5Tc4O8qTHE5MCeOYlOQrz\",\"children\":[{\"text\":\" \\\"resource\\\": [ \"}]},{\"type\":\"code-line\",\"id\":\"gy-xtgrjMWpS69nq_fMW0\",\"children\":[{\"text\":\" \\\"qcs::cos::uid/1250000000:examplebucket1-1250000000/*\\\",\"}]},{\"type\":\"code-line\",\"id\":\"fkDSJabdl3dnrNa1w4s-2\",\"children\":[{\"text\":\" \\\"qcs::cos::uid/1250000000:examplebucket2-1250000000/*\\\"\"}]},{\"type\":\"code-line\",\"id\":\"Ede-ChC2CNs9gVwWL_O5i\",\"children\":[{\"text\":\" ]\"}]},{\"type\":\"code-line\",\"id\":\"QdtZG20OPZLYQFn4D9AQE\",\"children\":[{\"text\":\" }\"}]},{\"type\":\"code-line\",\"id\":\"wUPDpDJOjad8JUZ5Mef1a\",\"children\":[{\"text\":\" ]\"}]},{\"type\":\"code-line\",\"id\":\"aJfUzTLgVu5t8RWuyRiMk\",\"children\":[{\"text\":\"}\"}]}],\"indent\":2,\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"CC1R1tlefqUTNv2fWFVi_\",\"autoWrap\":false},{\"type\":\"p\",\"children\":[{\"text\":\"위의 정책은 루트 계정 B에 작업 권한이 있는 A 명의로 된 버킷을 모두 서브 계정 B0에 인가하는 것을 의미합니다. 여기서, \"},{\"code\":1,\"text\":\"uid/1250000000\"},{\"text\":\" 중의 1250000000는 루트 계정 A의 APPID이고, \"},{\"code\":1,\"text\":\"examplebucket1-1250000000\"},{\"text\":\" 및 \"},{\"code\":1,\"text\":\"examplebucket2-1250000000\"},{\"text\":\"은 루트 계정 B에 작업 권한이 있는 A 명의로 된 버킷입니다.\"}],\"id\":\"SxROV8Mx8c0rYh0TXwnkD\",\"indent\":1},{\"children\":[{\"b\":1,\"text\":\"완료\"},{\"text\":\"를 클릭하면 정책 생성이 완료됩니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"ddnC9aYKpWLWb06T6wQjq\"},{\"children\":[{\"b\":1,\"text\":\"정책\"},{\"text\":\" 리스트에서 생성된 정책을 찾아 오른쪽 \"},{\"b\":1,\"text\":\"사용자/사용자 그룹/역할 연결\"},{\"text\":\"을 클릭합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"HXWJbjlPKIOakuhxvxQk1\"},{\"children\":[{\"text\":\"팝업창에서 서브 계정 B0을 선택하고 \"},{\"b\":1,\"text\":\"확인\"},{\"text\":\"을 클릭합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"_FgfYwcYS2ZsnTvPW-7AO\"},{\"children\":[{\"text\":\"권한 부여 작업이 완료됩니다. 이제 서브 계정 B0의 키를 사용하여 A 소유의 버킷에 대한 작업을 테스트해 볼 수 있습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"K9or3hQy8dkUbwQjPzWTt\"}]"}},"34078":{"categoryId":436,"weight":3,"type":"page","extension":"","pid":34077,"id":34078,"lang":"ko","title":"CRC64 검사","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-03 22:55:01","recentReleaseTime":"2021-03-03 22:55:01","content":{"title":"CRC64 검사","body":"

소개

클라이언트와 서버 간에 데이터가 전송되면서 데이터에 오류가 발생하기도 합니다. COS는 MD5 검증으로 데이터 무결성을 검증하며, CRC64 검사 코드를 이용해 데이터 검사를 합니다.
COS는 새로 업로드되는 객체에 CRC64 계산을 실시하고, 그 결과를 객체의 속성으로 보관합니다. 이후 반환되는 응답 헤더에 x-cos-hash-crc64ecma가 포함되는데, 이 헤더는 업로드한 객체의 CRC64 값을 나타내며 ECMA-182 표준에 따라 계산하여 값을 얻습니다. CRC64의 특성상 런칭 이전 시점부터 COS의 객체에 존재하기 때문에 COS에서 객체의 CRC64 값을 계산하지 않습니다. 따라서 해당 유형의 객체를 획득할 때 CRC64 값이 반환되지 않습니다.

작업 설명

현재 CRC64를 지원하는 API는 다음과 같습니다.
간편 업로드 인터페이스
PUT ObjectPOST Object: 반환된 응답 헤더에서 파일의 CRC64 검사 값을 획득할 수 있습니다.
멀티파트 업로드 인터페이스
Upload Part: COS에서 반환된 CRC64 값과 로컬에서 계산된 값을 비교 검증합니다.
Complete Multipart Upload: 멀티파트 각각에 CRC64 속성이 있으면 객체의 CRC64 값이 반환됩니다. 하지만 일부 멀티파트에 CRC64 값이 없는 경우, 반환되지 않습니다.
Upload Part - Copy를 실행하면 이와 대응하는 CRC64 값이 반환됩니다.
PUT Object - Copy를 실행할 때 원본 객체에 CRC64 값이 있으면 CRC64가 반환되고, 그렇지 않으면 반환되지 않습니다.
HEAD ObjectGET Object를 실행할 때 객체에 CRC64가 있으면 반환됩니다. 사용자는 COS에서 반환된 CRC64 값과 로컬에서 계산된 CRC64 값을 비교 검증할 수 있습니다.

API 예시

멀티파트 업로드 응답

다음은 사용자가 Upload Part 요청을 한 뒤 얻은 응답 예시입니다. x-cos-hash-crc64ecma 헤더는 멀티파트의 CRC64 값을 나타냅니다. 해당 값과 로컬에서 계산한 CRC64 값을 비교하여 멀티파트의 무결성을 검사할 수 있습니다.
HTTP/1.1 200 OK
content-length: 0
connection: close
date: Thu, 05 Dec 2019 01:58:03 GMT
etag: "358e8c8b1bfa35ee3bd44cb3d2cc416b"
server: tencent-cos
x-cos-hash-crc64ecma: 15060521397700495958
x-cos-request-id: NWRlODY0MmJfMjBiNDU4NjRfNjkyZl80ZjZi****

멀티파트 업로드 완료 응답

다음은 사용자가 Complete Multipart Upload 요청을 한 뒤 얻은 응답 예시입니다. x-cos-hash-crc64ecma 헤더는 전체 객체의 CRC64 값을 나타냅니다. 해당 값과 로컬에서 계산한 CRC64 값을 비교하여 객체 무결성 검사를 할 수 있습니다.
HTTP/1.1 200 OK
content-type: application/xml
transfer-encoding: chunked
connection: close
date: Thu, 05 Dec 2019 02:01:17 GMT
server: tencent-cos
x-cos-hash-crc64ecma: 15060521397700495958
x-cos-request-id: NWRlODY0ZWRfMjNiMjU4NjRfOGQ4Ml81MDEw****

[Object Content]

SDK 예시

Python SDK

다음은 Python SDK를 사례로 한 객체 검사법으로, 전체 코드에 대한 예시는 다음과 같습니다.
설명:
코드는 Python 2.7을 기반으로 하였으며, Python SDK의 자세한 사용 방법은 Python SDK의 객체 작업 문서를 참고하십시오.

1. 초기화 설정

SecretId, SecretKey, Region을 포함한 사용자 속성을 설정하고, 클라이언트 객체를 생성합니다.
# -*- coding=utf-8
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
from qcloud_cos import CosServiceError
from qcloud_cos import CosClientError
import sys
import logging
import hashlib
import crcmod

logging.basicConfig(level=logging.INFO, stream=sys.stdout)

# SecretId, SecretKey, Region을 포함한 사용자 속성을 설정합니다.
# APPID는 설정에서 삭제되었으니 매개변수 Bucket에 APPID를 입력하십시오. Bucket은 BucketName-APPID로 구성됩니다.
secret_id = COS_SECRETID # 사용자 SecretId 정보로 대체
secret_key = COS_SECRETKEY # 사용자 SecretKey 정보로 대체
region = 'ap-beijing' # 사용자 Region으로 대체, 예시는 베이징 리전
token = None # 임시 키를 사용할 경우 Token 입력, 기본값이 null이면 입력하지 않음
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 설정 객체 획득
client = CosS3Client(config)

2. 객체의 검사 값 계산

객체의 멀티파트를 시뮬레이션하고, 전체 객체의 CRC64 검사 값을 계산합니다.
OBJECT_PART_SIZE = 1024 * 1024 #각 멀티파트 크기 시뮬레이션
OBJECT_TOTAL_SIZE = OBJECT_PART_SIZE * 1 + 123 #총 객체 크기
object_body = '1' * OBJECT_TOTAL_SIZE #객체 콘텐츠

#전체 객체의 crc64 검사 값 계산
c64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693L, initCrc=0L, xorOut=0xffffffffffffffffL, rev=True)
local_crc64 =str(c64(object_body))

3. 멀티파트 업로드 초기화

#멀티파트 업로드 초기화
response = client.create_multipart_upload(
Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.
Key='exampleobject', #업로드한 객체의 Key 값으로 대체
StorageClass='STANDARD', #객체의 스토리지 유형
)
#멀티파트 업로드한 UploadId 획득
upload_id = response['UploadId']

4. 객체 멀티파트 업로드

객체 멀티파트 업로드는 객체를 여러 파트로 분할하여 업로드하는 것을 뜻합니다. 최대 10000개 파트까지 분할할 수 있습니다. 각 파트의 크기는 1MB-5GB이며, 마지막 파트의 크기는 1MB 미만일 수 있습니다. 멀티파트를 업로드할 때 각 파트의 PartNumber(번호)를 설정하고, 각 파트의 CRC64 값을 계산해야 합니다. 멀티파트 업로드를 성공한 후 반환되는 CRC64 값과 로컬에서 계산한 값을 검사할 수 있습니다.
#객체를 멀티파트 업로드할 때, 각 파트의 크기는 OBJECT_PART_SIZE이며, 마지막 파트의 크기는 OBJECT_PART_SIZE보다 작을 수 있습니다.
part_list = list()
position = 0
left_size = OBJECT_TOTAL_SIZE
part_number = 0
while left_size > 0:
part_number += 1
if left_size >= OBJECT_PART_SIZE:
body = object_body[position:position+OBJECT_PART_SIZE]
else:
body = object_body[position:]
position += OBJECT_PART_SIZE
left_size -= OBJECT_PART_SIZE
local_part_crc64 = str(c64(body))\t#로컬에서 CRC64 계산

response = client.upload_part(
Bucket='examplebucket-1250000000',
Key='exampleobject',
Body=body,
PartNumber=part_number,
UploadId=upload_id,
)
part_crc_64 = response['x-cos-hash-crc64ecma']# 서버에서 반환된 CRC64
if local_part_crc64 != part_crc_64:\t\t# 데이터 검사
print 'crc64 check FAIL'
exit(-1)
etag = response['ETag']
part_list.append({'ETag' : etag, 'PartNumber' : part_number})

5. 멀티파트 업로드 완료

모든 멀티파트를 업로드한 뒤 멀티파트 업로드 작업을 완료해야 합니다. COS에서 반환된 CRC64와 로컬 객체의 CRC64를 비교 검증할 수 있습니다.
#멀티파트 업로드 완료
response = client.complete_multipart_upload(
Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.
Key='exampleobject', #객체의 Key 값
UploadId=upload_id,
MultipartUpload={ #모든 파트의 ETag와 PartNumber가 모두 대응되어야 함
'Part' : part_list
},
)
crc64ecma = response['x-cos-hash-crc64ecma']
if crc64ecma != local_crc64:\t\t\t# 데이터 검사
print 'check crc64 Failed'
exit(-1)

Java SDK

객체 업로드는 Java SDK의 고급 인터페이스 사용을 권장합니다. Java SDK 객체 작업을 참고하십시오.

로컬에서 파일의 crc64를 계산하는 방법

String calculateCrc64(File localFile) throws IOException {
CRC64 crc64 = new CRC64();

try (FileInputStream stream = new FileInputStream(localFile)) {
byte[] b = new byte[1024 * 1024];
while (true) {
final int read = stream.read(b);
if (read <= 0) {
break;
}
crc64.update(b, read);
}
}

return Long.toUnsignedString(crc64.getValue());
}

COS에서 파일의 crc64 값을 가져와서 로컬 파일과 검사하는 방법

// COSClient 생성 참고: [시작하기](https://www.tencentcloud.com/document/product/436/10199);
ObjectMetadata cosMeta = COSClient().getObjectMetadata(bucketName, cosFilePath);
String cosCrc64 = cosMeta.getCrc64Ecma();
String localCrc64 = calculateCrc64(localFile);

if (cosCrc64.equals(localCrc64)) {
System.out.println("ok");
} else {
System.out.println("fail");
}
","recentReleaseTime":"2024-06-24 16:53:18","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"클라이언트와 서버 간에 데이터가 전송되면서 데이터에 오류가 발생하기도 합니다. COS는 \"},{\"children\":[{\"text\":\"MD5 검증\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/32467\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/32467\"},\"type\":\"ref\"},{\"text\":\"으로 데이터 무결성을 검증하며, CRC64 검사 코드를 이용해 데이터 검사를 합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"COS는 새로 업로드되는 객체에 CRC64 계산을 실시하고, 그 결과를 객체의 속성으로 보관합니다. 이후 반환되는 응답 헤더에 x-cos-hash-crc64ecma가 포함되는데, 이 헤더는 업로드한 객체의 CRC64 값을 나타내며 ECMA-182 표준에 따라 계산하여 값을 얻습니다. CRC64의 특성상 런칭 이전 시점부터 COS의 객체에 존재하기 때문에 COS에서 객체의 CRC64 값을 계산하지 않습니다. 따라서 해당 유형의 객체를 획득할 때 CRC64 값이 반환되지 않습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"작업 설명\"}],\"nodeId\":\".EC.9E.91.EC.97.85-.EC.84.A4.EB.AA.85\",\"type\":\"h2\"},{\"children\":[{\"text\":\"현재 CRC64를 지원하는 API는 다음과 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"간편 업로드 인터페이스\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"PUT Object\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7749\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7749\"},\"type\":\"ref\"},{\"text\":\"와 \"},{\"children\":[{\"text\":\"POST Object\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/14690\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/14690\"},\"type\":\"ref\"},{\"text\":\": 반환된 응답 헤더에서 파일의 CRC64 검사 값을 획득할 수 있습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"멀티파트 업로드 인터페이스\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"Upload Part\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7750\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7750\"},\"type\":\"ref\"},{\"text\":\": COS에서 반환된 CRC64 값과 로컬에서 계산된 값을 비교 검증합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"Complete Multipart Upload\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7742\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7742\"},\"type\":\"ref\"},{\"text\":\": 멀티파트 각각에 CRC64 속성이 있으면 객체의 CRC64 값이 반환됩니다. 하지만 일부 멀티파트에 CRC64 값이 없는 경우, 반환되지 않습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"Upload Part - Copy\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/8287\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/8287\"},\"type\":\"ref\"},{\"text\":\"를 실행하면 이와 대응하는 CRC64 값이 반환됩니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"PUT Object - Copy\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/10881\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/10881\"},\"type\":\"ref\"},{\"text\":\"를 실행할 때 원본 객체에 CRC64 값이 있으면 CRC64가 반환되고, 그렇지 않으면 반환되지 않습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"HEAD Object\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7745\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7745\"},\"type\":\"ref\"},{\"text\":\"와 \"},{\"children\":[{\"text\":\"GET Object\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7753\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7753\"},\"type\":\"ref\"},{\"text\":\"를 실행할 때 객체에 CRC64가 있으면 반환됩니다. 사용자는 COS에서 반환된 CRC64 값과 로컬에서 계산된 CRC64 값을 비교 검증할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"API 예시\"}],\"nodeId\":\"api-.EC.98.88.EC.8B.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"멀티파트 업로드 응답\"}],\"nodeId\":\".EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EC.97.85.EB.A1.9C.EB.93.9C-.EC.9D.91.EB.8B.B5\",\"type\":\"h4\"},{\"children\":[{\"text\":\"다음은 사용자가 Upload Part 요청을 한 뒤 얻은 응답 예시입니다. x-cos-hash-crc64ecma 헤더는 멀티파트의 CRC64 값을 나타냅니다. 해당 값과 로컬에서 계산한 CRC64 값을 비교하여 멀티파트의 무결성을 검사할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"HTTP/1.1 200 OK\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"content-length: 0\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"connection: close\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"date: Thu, 05 Dec 2019 01:58:03 GMT\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"etag: \\\"358e8c8b1bfa35ee3bd44cb3d2cc416b\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"server: tencent-cos\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"x-cos-hash-crc64ecma: 15060521397700495958\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"x-cos-request-id: NWRlODY0MmJfMjBiNDU4NjRfNjkyZl80ZjZi****\"}],\"type\":\"code-line\"}],\"language\":\"shell\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"멀티파트 업로드 완료 응답\"}],\"nodeId\":\".EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EC.97.85.EB.A1.9C.EB.93.9C-.EC.99.84.EB.A3.8C-.EC.9D.91.EB.8B.B5\",\"type\":\"h4\"},{\"children\":[{\"text\":\"다음은 사용자가 Complete Multipart Upload 요청을 한 뒤 얻은 응답 예시입니다. x-cos-hash-crc64ecma 헤더는 전체 객체의 CRC64 값을 나타냅니다. 해당 값과 로컬에서 계산한 CRC64 값을 비교하여 객체 무결성 검사를 할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"HTTP/1.1 200 OK\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"content-type: application/xml\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"transfer-encoding: chunked\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"connection: close\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"date: Thu, 05 Dec 2019 02:01:17 GMT\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"server: tencent-cos\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"x-cos-hash-crc64ecma: 15060521397700495958\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"x-cos-request-id: NWRlODY0ZWRfMjNiMjU4NjRfOGQ4Ml81MDEw****\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"[Object Content]\"}],\"type\":\"code-line\"}],\"language\":\"shell\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"SDK 예시\"}],\"nodeId\":\"sdk-.EC.98.88.EC.8B.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"Python SDK\"}],\"nodeId\":\"python-sdk\",\"type\":\"h3\"},{\"children\":[{\"text\":\"다음은 Python SDK를 사례로 한 객체 검사법으로, 전체 코드에 대한 예시는 다음과 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"코드는 Python 2.7을 기반으로 하였으며, Python SDK의 자세한 사용 방법은 Python SDK의 \"},{\"children\":[{\"text\":\"객체 작업\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/31546\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/31546\"},\"type\":\"ref\"},{\"text\":\" 문서를 참고하십시오.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"1. 초기화 설정\"}],\"nodeId\":\"1.-.EC.B4.88.EA.B8.B0.ED.99.94-.EC.84.A4.EC.A0.95\",\"type\":\"h4\"},{\"children\":[{\"text\":\"SecretId, SecretKey, Region을 포함한 사용자 속성을 설정하고, 클라이언트 객체를 생성합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"# -*- coding=utf-8\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"from qcloud_cos import CosConfig\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"from qcloud_cos import CosS3Client\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"from qcloud_cos import CosServiceError\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"from qcloud_cos import CosClientError\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import sys\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import logging\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import hashlib\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"import crcmod\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"logging.basicConfig(level=logging.INFO, stream=sys.stdout)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"# SecretId, SecretKey, Region을 포함한 사용자 속성을 설정합니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"# APPID는 설정에서 삭제되었으니 매개변수 Bucket에 APPID를 입력하십시오. Bucket은 BucketName-APPID로 구성됩니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"secret_id = COS_SECRETID # 사용자 SecretId 정보로 대체\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"secret_key = COS_SECRETKEY # 사용자 SecretKey 정보로 대체\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"region = 'ap-beijing' # 사용자 Region으로 대체, 예시는 베이징 리전\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"token = None # 임시 키를 사용할 경우 Token 입력, 기본값이 null이면 입력하지 않음\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 설정 객체 획득\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"client = CosS3Client(config)\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"2. 객체의 검사 값 계산\"}],\"nodeId\":\"2.-.EA.B0.9D.EC.B2.B4.EC.9D.98-.EA.B2.80.EC.82.AC-.EA.B0.92-.EA.B3.84.EC.82.B0\",\"type\":\"h4\"},{\"children\":[{\"text\":\"객체의 멀티파트를 시뮬레이션하고, 전체 객체의 CRC64 검사 값을 계산합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"OBJECT_PART_SIZE = 1024 * 1024 #각 멀티파트 크기 시뮬레이션\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"OBJECT_TOTAL_SIZE = OBJECT_PART_SIZE * 1 + 123 #총 객체 크기\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"object_body = '1' * OBJECT_TOTAL_SIZE #객체 콘텐츠\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"#전체 객체의 crc64 검사 값 계산\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"c64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693L, initCrc=0L, xorOut=0xffffffffffffffffL, rev=True)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"local_crc64 =str(c64(object_body))\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"3. 멀티파트 업로드 초기화\"}],\"nodeId\":\"3.-.EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EC.97.85.EB.A1.9C.EB.93.9C-.EC.B4.88.EA.B8.B0.ED.99.94\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"#멀티파트 업로드 초기화\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"response = client.create_multipart_upload(\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Key='exampleobject', #업로드한 객체의 Key 값으로 대체\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" StorageClass='STANDARD', #객체의 스토리지 유형\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\")\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"#멀티파트 업로드한 UploadId 획득\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"upload_id = response['UploadId']\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"4. 객체 멀티파트 업로드\"}],\"nodeId\":\"4.-.EA.B0.9D.EC.B2.B4-.EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EC.97.85.EB.A1.9C.EB.93.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"객체 멀티파트 업로드는 객체를 여러 파트로 분할하여 업로드하는 것을 뜻합니다. 최대 10000개 파트까지 분할할 수 있습니다. 각 파트의 크기는 1MB-5GB이며, 마지막 파트의 크기는 1MB 미만일 수 있습니다. 멀티파트를 업로드할 때 각 파트의 PartNumber(번호)를 설정하고, 각 파트의 CRC64 값을 계산해야 합니다. 멀티파트 업로드를 성공한 후 반환되는 CRC64 값과 로컬에서 계산한 값을 검사할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"#객체를 멀티파트 업로드할 때, 각 파트의 크기는 OBJECT_PART_SIZE이며, 마지막 파트의 크기는 OBJECT_PART_SIZE보다 작을 수 있습니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"part_list = list()\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"position = 0 \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"left_size = OBJECT_TOTAL_SIZE\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"part_number = 0 \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"while left_size \\u003e 0:\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" part_number += 1\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" if left_size \\u003e= OBJECT_PART_SIZE:\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" body = object_body[position:position+OBJECT_PART_SIZE]\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" else:\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" body = object_body[position:]\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" position += OBJECT_PART_SIZE\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" left_size -= OBJECT_PART_SIZE\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" local_part_crc64 = str(c64(body))\\t#로컬에서 CRC64 계산\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" response = client.upload_part(\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Bucket='examplebucket-1250000000',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Key='exampleobject',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Body=body,\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" PartNumber=part_number,\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" UploadId=upload_id,\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" ) \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" part_crc_64 = response['x-cos-hash-crc64ecma']# 서버에서 반환된 CRC64\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" if local_part_crc64 != part_crc_64:\\t\\t# 데이터 검사\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" print 'crc64 check FAIL'\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" exit(-1)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" etag = response['ETag']\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" part_list.append({'ETag' : etag, 'PartNumber' : part_number})\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"5. 멀티파트 업로드 완료\"}],\"nodeId\":\"5.-.EB.A9.80.ED.8B.B0.ED.8C.8C.ED.8A.B8-.EC.97.85.EB.A1.9C.EB.93.9C-.EC.99.84.EB.A3.8C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"모든 멀티파트를 업로드한 뒤 멀티파트 업로드 작업을 완료해야 합니다. COS에서 반환된 CRC64와 로컬 객체의 CRC64를 비교 검증할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"#멀티파트 업로드 완료\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"response = client.complete_multipart_upload(\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" Key='exampleobject', #객체의 Key 값\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" UploadId=upload_id,\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" MultipartUpload={ #모든 파트의 ETag와 PartNumber가 모두 대응되어야 함\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Part' : part_list \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\")\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"crc64ecma = response['x-cos-hash-crc64ecma']\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"if crc64ecma != local_crc64:\\t\\t\\t# 데이터 검사\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" print 'check crc64 Failed'\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" exit(-1)\"}],\"type\":\"code-line\"}],\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"Java SDK\"}],\"nodeId\":\"java-sdk\",\"type\":\"h3\"},{\"children\":[{\"text\":\"객체 업로드는 Java SDK의 고급 인터페이스 사용을 권장합니다. Java SDK \"},{\"children\":[{\"text\":\"객체 작업\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/31534\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/31534\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"로컬에서 파일의 crc64를 계산하는 방법\"}],\"nodeId\":\".EB.A1.9C.EC.BB.AC.EC.97.90.EC.84.9C-.ED.8C.8C.EC.9D.BC.EC.9D.98-crc64.EB.A5.BC-.EA.B3.84.EC.82.B0.ED.95.98.EB.8A.94-.EB.B0.A9.EB.B2.95\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"String calculateCrc64(File localFile) throws IOException {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" CRC64 crc64 = new CRC64();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" try (FileInputStream stream = new FileInputStream(localFile)) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" byte[] b = new byte[1024 * 1024];\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" while (true) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" final int read = stream.read(b);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (read \\u003c= 0) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" break;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" crc64.update(b, read);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" return Long.toUnsignedString(crc64.getValue());\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\"}],\"language\":\"java\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"COS에서 파일의 crc64 값을 가져와서 로컬 파일과 검사하는 방법\"}],\"nodeId\":\"cos.EC.97.90.EC.84.9C-.ED.8C.8C.EC.9D.BC.EC.9D.98-crc64-.EA.B0.92.EC.9D.84-.EA.B0.80.EC.A0.B8.EC.99.80.EC.84.9C-.EB.A1.9C.EC.BB.AC-.ED.8C.8C.EC.9D.BC.EA.B3.BC-.EA.B2.80.EC.82.AC.ED.95.98.EB.8A.94-.EB.B0.A9.EB.B2.95\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"// COSClient 생성 참고: [시작하기](https://intl.cloud.tencent.com/document/product/436/10199);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"ObjectMetadata cosMeta = COSClient().getObjectMetadata(bucketName, cosFilePath); \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"String cosCrc64 = cosMeta.getCrc64Ecma();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"String localCrc64 = calculateCrc64(localFile);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"if (cosCrc64.equals(localCrc64)) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" System.out.println(\\\"ok\\\");\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"} else {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" System.out.println(\\\"fail\\\");\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\"}],\"language\":\"java\",\"type\":\"code-block\"}]"}},"34082":{"categoryId":436,"weight":50,"type":"page","extension":"","pid":34079,"id":34082,"lang":"ko","title":"COS에 WordPress 원격 첨부 파일 저장하기","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-03 23:09:07","recentReleaseTime":"2021-03-03 23:09:07","content":{"title":"COS에 WordPress 원격 첨부 파일 저장하기","body":"

소개

WordPress는 PHP 언어를 사용해 개발된 블로그 플랫폼입니다. 사용자는 PHP와 MySQL 데이터베이스를 지원하는 서버에 개인 웹 사이트를 구축할 수 있고, WordPress를 콘텐츠 관리 시스템(CMS)으로 사용할 수도 있습니다.
WordPress의 강력한 기능과 확장성은 플러그 인이 많아 기능 확충이 쉽기 때문입니다. 완전한 하나의 웹 사이트가 기본적으로 갖추어야 할 모든 기능은 3rd party 플러그 인을 통해 실행할 수 있습니다.
본 문서에서는 플러그 인을 사용한 원격 파일 첨부 기능을 통해 WordPress의 미디어 라이브러리 첨부 파일을 Tencent Cloud의 Cloud Object Storage(COS)에 저장하는 방법을 소개합니다.
COS는 고확장성, 저비용, 신뢰성, 보안과 같은 특징이 있습니다. 미디어 라이브러리 첨부 파일을 COS에 저장할 경우 장점은 다음과 같습니다.
첨부 파일의 신뢰성이 높아집니다.
서버에 첨부 파일을 위한 별도의 스토리지 용량을 마련하지 않아도 됩니다.
이미지 첨부 파일을 조회할 때 바로 COS 서버에 연결하면 서버의 다운스트림 대역폭/트래픽을 점유하지 않으며, 액세스 속도가 더 빨라집니다.
Tencent Cloud Content Delivery Network(CDN)와 함께 사용하면 사용자의 이미지 첨부 파일 확인 속도를 더욱 향상시키고 웹사이트 액세스 속도를 최적화할 수 있습니다.

전제 조건

1. 버킷을 생성 완료해야 하며, 그렇지 않은 경우 버킷 생성의 지침에 따라 버킷을 생성합니다.
2. Cloud Virtual Machine에 설명된 대로 CVM(Cloud Virtual Machine) 인스턴스와 같은 서버를 생성했습니다.

실행 순서

Wordpress 웹사이트 배포

CVM에서 WordPress 웹사이트를 빠르게 구축하려면. 비즈니스 웹 사이트의 확장성에 대한 요구 사항이 높은 경우 다음 문서의 지침에 따라 수동으로 배포할 수 있습니다.

COS 버킷 생성

1. 공개 읽기 및 개인 쓰기 버킷을 생성합니다. 버킷 리전은 WordPress 블로그 플랫폼을 실행하는 CVM과 동일한 리전을 권장합니다. 자세한 생성 방법은 버킷 생성 문서를 참고하십시오.
2. 버킷 리스트에서 방금 생성한 버킷을 찾아 이름을 클릭한 후 버킷 페이지로 이동합니다.
3. 왼쪽 메뉴에서 개요를 클릭하여 액세스 도메인을 조회하고 기록합니다.

플러그인 설치 및 구성

플러그인 라이브러리 또는 소스 코드를 통해 플러그인을 설치할 수 있습니다.

플러그인 라이브러리에 설치(권장)

WordPress 백엔드에서 플러그인을 클릭하고 tencentcloud-cos 플러그인을 직접 검색한 다음 지금 설치를 클릭합니다.

소스 코드를 통한 설치

플러그인 소스 코드를 다운로드하고 WordPress 플러그인 디렉터리 wp-content/plugins에 업로드하고 백엔드에서 실행합니다.
다음 단계에서는 Ubuntu를 예로 들어 플러그인을 설치하는 방법을 설명합니다.
1. wp-content의 상위 디렉터리로 이동:
cd /var/www/html
2. 권한 추가:
chmod -R 777 wp-content
3. 플러그인 디렉터리 생성:
cd wp-content/plugins/
mkdir tencent-cloud-cos
cd tencent-cloud-cos
4. 플러그인 디렉터리에 플러그인 다운로드:
wget https://cos5.cloud.tencent.com/cosbrowser/code/tencent-cloud-cos.zip
unzip tencent-cloud-cos.zip
rm tencent-cloud-cos.zip -f
5. 왼쪽 사이드바에서 ‘플러그인’을 클릭하면 플러그인을 볼 수 있습니다. 활성화를 클릭하여 활성화합니다.

플러그인 구성

tencent-cloud-cos 플러그인에서 COS 버킷 정보를 구성합니다.
1. ‘설정’을 클릭하여 tencent-cloud-cos 플러그인을 구성합니다.
2. 다음과 같이 COS 정보를 구성합니다.
구성 항목
구성 값
SecretId, SecretKey
키 정보에 액세스하려면 Tencent Cloud API 키로 이동하여 생성 및 가져오기
소속 리전
버킷 생성 시 선택한 리전
스페이스 이름
버킷 생성 시 사용자 지정된 버킷 이름, 예시: examplebucket-1250000000
액세스 도메인
COS의 기본 버킷 도메인을 말하며, 사용자가 버킷을 생성하면 시스템에서 버킷 이름과 리전에 따라 자동으로 생성합니다. 다른 리전의 버킷은 각각 다른 기본 도메인이 있습니다. COS 콘솔로 이동하여 버킷의 개요 > 도메인 정보에서 확인하실 수 있습니다.
자동 이름 변경
파일을 COS에 업로드한 후 동일한 이름의 기존 파일과 충돌을 피하기 위해 자동으로 지정된 형식에 따라 이름 변경
로컬에 저장하지 않음
이 옵션을 활성화 후에는 원본 파일이 로컬에 보관되지 않습니다
원격 파일 보관
이 옵션을 활성화한 후 파일이 삭제되면 로컬 파일 사본만 삭제되고 원격 COS 버킷의 파일 사본은 복구하려는 경우에 대비하여 계속 보관됩니다
썸네일 금지
이 옵션을 활성화하면 썸네일 파일이 업로드되지 않습니다
Cloud Infinite(CI)
CI 서비스가 활성화되면 이미지에 편집, 압축, 형식 변환, 워터마크 추가 등 이미지에 대한 다양한 작업을 수행할 수 있으며, 자세한 내용은 Cloud Infinite를 참고하십시오
파일 조정
파일 조정이 활성화되면 이미지, 비디오, 오디오, 텍스트, 파일 및 웹 페이지의 멀티미디어 콘텐츠를 지능적으로 조정합니다. 음란물, 저속, 불법, 혐오, 공격적인 정보와 같은 비준수 콘텐츠를 효과적으로 식별하여 운영상의 위험을 방지할 수 있습니다. 자세한 내용은 민감한 콘텐츠 조정 개요를 참고하십시오.
파일 미리보기
파일 미리보기가 활성화되면 파일을 이미지, PDF 파일 또는 HTML5 페이지로 변환하여 웹 페이지에 파일 콘텐츠를 표시합니다. 자세한 내용은 파일 미리보기 개요를 참고하십시오.
디버깅
이 기능은 오류, 예외 및 경고를 기록합니다

3. 구성이 완료되면 구성 저장을 클릭합니다.

COS에 대한 WordPress 첨부 파일 스토리지 확인

Wordpress에서 이미지로 게시물을 작성하고 이미지가 COS에 저장되어 있는지 확인할 수 있습니다.
1. WordPress 대시보드에서 왼쪽 사이드바의 ‘게시물’을 클릭하여 이미지가 포함된 게시물을 생성합니다.
2. ‘Hello world!’ 편집 기본적으로 WordPress에서 생성된 게시물입니다.
3. 오른쪽에서 ‘+’를 클릭합니다.
4. 이미지를 업로드합니다.
5. 그 다음 업로드된 이미지의 URL이 https://<BucketName-APPID>.cos.<Region>.myqcloud.com/<ObjectKey> 형식의 https://wd-125000000.cos.ap-nanjing.myqcloud.com/2022/10/입하-1200x675.jpeg와 같은 COS URL인지 확인하고 그렇다면 이미지가 COS 버킷에 업로드된 것입니다.
6. COS 콘솔에 로그인하면 버킷에서 새로 업로드된 이미지를 볼 수 있습니다.
설명:
상기 테스트에 성공하면 COSCMD 또는 COS Migration을 사용하여 이전 WordPress 리소스를 COS 버킷에 동기화합니다. 이 단계를 수행해야 합니다. 그렇지 않으면 COS에서 이러한 리소스를 볼 수 없습니다. 그 다음 아래의 Origin-pull 설정에 따라 Origin-pull을 선택적으로 활성화할 수 있습니다.

확장

1. CDN 가속을 사용하여 액세스합니다.\n버킷에 CDN 가속 설정이 필요한 경우 CDN 가속 구성 문서를 참고하십시오. 플러그 인 설정에서 URL 접두사의 기본값을 CDN 가속 도메인 또는 사용자 정의 가속 도메인으로 수정하면 됩니다.
2. 데이터베이스의 리소스 주소를 변경합니다.\n새로 생성한 사이트가 아니라면 데이터베이스에는 반드시 기존 리소스 링크 주소가 존재하며, 이 리소스 주소를 변경해야 합니다. 플러그 인에서 변경 기능을 제공하며, 최초 변경 전 반드시 백업해 두시기 바랍니다.
기존 도메인에 원본 리소스 도메인을 입력합니다. 예: https://example.com/
신규 도메인에 현재의 리소스 도메인을 입력합니다. 예: https://img.example.com/
3. 크로스 도메인 액세스를 설정합니다.\n본 문서의 상응하는 리소스 링크 인용 시 콘솔은 크로스 도메인 오류 No 'Access-Control-Allow-Origin' header is present on the requested resource를 표시합니다. 이는 header를 추가하지 않았기 때문입니다. 크로스 도메인 액세스 CORS 설정에서 HTTP Header 설정을 추가해야 하며, 다음 두 가지 방법으로 구성할 수 있습니다.
COS 콘솔에서 구성
설명:
크로스 도메인 설정 작업 순서는 CORS 설정 문서를 참고하십시오.
CDN 콘솔에서 구성
모든 도메인을 허용할 경우, 다음과 같이 구성합니다.
Access-Control-Allow-Origin: *
사용자 개인 도메인 액세스만 허용할 경우, 다음과 같이 구성합니다.
Access-Control-Allow-Origin: https://example.com
4. 
Origin-pull을 설정합니다.

5. COS 콘솔을 통해 WordPress 미디어 라이브러리에 리소스를 업로드하지 않는 경우 COS Origin-pull을 사용하는 것이 좋습니다. 자세한 내용은 Origin-pull 설정을 참고하십시오.\nOrigin-pull이 활성화되면 클라이언트가 처음으로 COS의 원본 객체에 액세스할 때 COS가 객체에 도달할 수 없는 경우 302 HTTP 상태 코드를 반환하고 자동으로 요청을 Origin-pull 주소로 리디렉션합니다. 그 다음 원본에서 액세스할 객체를 제공합니다. 한편 COS는 원본에서 이 객체를 복사하여 해당 COS 디렉터리에 저장하므로 COS는 후속 요청에서 객체를 클라이언트에 직접 반환할 수 있습니다.
","recentReleaseTime":"2025-11-19 15:33:39","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"_uQHIH0UOWqy7mh9cp8L2\"},{\"children\":[{\"children\":[{\"text\":\"WordPress\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://cn.wordpress.org/\",\"props\":{\"type\":\"link\",\"url\":\"https://cn.wordpress.org/\"},\"type\":\"ref\",\"id\":\"Aqqb-gKQGUmNw383rm49k\"},{\"text\":\"는 PHP 언어를 사용해 개발된 블로그 플랫폼입니다. 사용자는 PHP와 MySQL 데이터베이스를 지원하는 서버에 개인 웹 사이트를 구축할 수 있고, WordPress를 콘텐츠 관리 시스템(CMS)으로 사용할 수도 있습니다.\"}],\"type\":\"p\",\"id\":\"0dSKEDjCdSYSSqzrGWAYY\"},{\"children\":[{\"text\":\"WordPress의 강력한 기능과 확장성은 플러그 인이 많아 기능 확충이 쉽기 때문입니다. 완전한 하나의 웹 사이트가 기본적으로 갖추어야 할 모든 기능은 3rd party 플러그 인을 통해 실행할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"RwoCJk7x33r1fFWZjBVio\"},{\"children\":[{\"text\":\"본 문서에서는 플러그 인을 사용한 원격 파일 첨부 기능을 통해 WordPress의 미디어 라이브러리 첨부 파일을 Tencent Cloud의 \"},{\"children\":[{\"text\":\"Cloud Object Storage(COS)\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/products/cos\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/products/cos\"},\"type\":\"ref\",\"id\":\"vKKurgd-ve6nOcM4yz8Ne\"},{\"text\":\"에 저장하는 방법을 소개합니다.\"}],\"type\":\"p\",\"id\":\"zEPmVWAI7DiZhg5dAtOH6\"},{\"children\":[{\"text\":\"COS는 고확장성, 저비용, 신뢰성, 보안과 같은 특징이 있습니다. 미디어 라이브러리 첨부 파일을 COS에 저장할 경우 장점은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"lUBbq6xch6Yr2x7xX3qod\"},{\"children\":[{\"text\":\"첨부 파일의 신뢰성이 높아집니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"1rta35EWBY68ePc6lq6Gw\"},{\"children\":[{\"text\":\"서버에 첨부 파일을 위한 별도의 스토리지 용량을 마련하지 않아도 됩니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"Zs6HttxUp5H3UFe71Mofj\"},{\"children\":[{\"text\":\"이미지 첨부 파일을 조회할 때 바로 COS 서버에 연결하면 서버의 다운스트림 대역폭/트래픽을 점유하지 않으며, 액세스 속도가 더 빨라집니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"Z4pDEGxucLOMLX8tGaDTv\"},{\"children\":[{\"text\":\"Tencent Cloud \"},{\"children\":[{\"text\":\"Content Delivery Network(CDN)\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/products/cdn\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/products/cdn\"},\"type\":\"ref\",\"id\":\"gq0OzlYOW65i4oJc-r4Q8\"},{\"text\":\"와 함께 사용하면 사용자의 이미지 첨부 파일 확인 속도를 더욱 향상시키고 웹사이트 액세스 속도를 최적화할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"MfrPygOglPgjPvIGvWawS\"},{\"children\":[{\"text\":\"전제 조건\"}],\"nodeId\":\".EC.A0.84.EC.A0.9C-.EC.A1.B0.EA.B1.B4\",\"type\":\"h2\",\"id\":\"-NLb4IGi0RuXdaaf3UG_g\"},{\"children\":[{\"text\":\"버킷을 생성 완료해야 하며, 그렇지 않은 경우 \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13309\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13309\"},\"type\":\"ref\",\"id\":\"uRZwNgDKxtezmrlyyfode\"},{\"text\":\"의 지침에 따라 버킷을 생성합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"ESf4Te2Su0bkj-11O13fV\"},{\"children\":[{\"children\":[{\"text\":\"Cloud Virtual Machine\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/213\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/213\"},\"type\":\"ref\",\"id\":\"JB9c8T__MBQsaoSxJVmYK\"},{\"text\":\"에 설명된 대로 CVM(Cloud Virtual Machine) 인스턴스와 같은 서버를 생성했습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"f20ISGR0XW-uelrIOwFyK\"},{\"children\":[{\"text\":\"실행 순서\"}],\"nodeId\":\".EC.8B.A4.ED.96.89-.EC.88.9C.EC.84.9C\",\"type\":\"h2\",\"id\":\"njaW99k6qTcCeiQPIYfsM\"},{\"children\":[{\"text\":\"Wordpress 웹사이트 배포\"}],\"nodeId\":\"wordpress-.EC.9B.B9.EC.82.AC.EC.9D.B4.ED.8A.B8-.EB.B0.B0.ED.8F.AC\",\"type\":\"h3\",\"id\":\"ojJhF2M7pgg9y1LRHwxkx\"},{\"children\":[{\"text\":\"CVM에서 WordPress 웹사이트를 빠르게 구축하려면. 비즈니스 웹 사이트의 확장성에 대한 요구 사항이 높은 경우 다음 문서의 지침에 따라 수동으로 배포할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"f4subTjCx_8VC-T4SM53p\"},{\"children\":[{\"children\":[{\"text\":\"WordPress 웹사이트 구축(Linux)\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/213/8044\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/213/8044\"},\"type\":\"ref\",\"id\":\"HmXW0CLEIy3uM-EjvQWxD\"}],\"start\":false,\"type\":\"uli\",\"id\":\"tenyiPZhLaoQohRT0cBr-\"},{\"children\":[{\"children\":[{\"text\":\"WordPress 웹사이트 구축(Windows)\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/213/34806\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/213/34806\"},\"type\":\"ref\",\"id\":\"irGW9jR4PElFu9-uXiyjb\"}],\"start\":false,\"type\":\"uli\",\"id\":\"p4vQztmVWn6jrYvv8ejLc\"},{\"children\":[{\"text\":\"COS 버킷 생성\"}],\"nodeId\":\"cos-.EB.B2.84.ED.82.B7-.EC.83.9D.EC.84.B1\",\"type\":\"h3\",\"id\":\"Q4CYk-lXRdCuw5F_dcvbN\"},{\"children\":[{\"b\":1,\"text\":\"공개 읽기 및 개인 쓰기\"},{\"text\":\" 버킷을 생성합니다. 버킷 리전은 WordPress 블로그 플랫폼을 실행하는 CVM과 동일한 리전을 권장합니다. 자세한 생성 방법은 \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13309\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13309\"},\"type\":\"ref\",\"id\":\"z_rqY-Po3_1H4sXF8cw55\"},{\"text\":\" 문서를 참고하십시오.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"iuIrMEJQPo6Qa6kMuZYW5\"},{\"children\":[{\"b\":1,\"text\":\"버킷 리스트\"},{\"text\":\"에서 방금 생성한 버킷을 찾아 이름을 클릭한 후 버킷 페이지로 이동합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"bG7n-NfV4PjDAWIEsnexB\"},{\"children\":[{\"text\":\"왼쪽 메뉴에서 \"},{\"b\":1,\"text\":\"개요\"},{\"text\":\"를 클릭하여 액세스 도메인을 조회하고 기록합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"Bb5fY2r0mYrfiRlD7ayam\"},{\"children\":[{\"text\":\"플러그인 설치 및 구성\"}],\"nodeId\":\".ED.94.8C.EB.9F.AC.EA.B7.B8.EC.9D.B8-.EC.84.A4.EC.B9.98-.EB.B0.8F-.EA.B5.AC.EC.84.B1\",\"type\":\"h3\",\"id\":\"fJLy-0nujaV5ouS3OEhT7\"},{\"children\":[{\"text\":\"플러그인 라이브러리 또는 소스 코드를 통해 플러그인을 설치할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"WN7pRoakcXIQ2aCi3L3Eh\"},{\"children\":[{\"text\":\"플러그인 라이브러리에 설치(권장)\"}],\"nodeId\":\".ED.94.8C.EB.9F.AC.EA.B7.B8.EC.9D.B8-.EB.9D.BC.EC.9D.B4.EB.B8.8C.EB.9F.AC.EB.A6.AC.EC.97.90-.EC.84.A4.EC.B9.98(.EA.B6.8C.EC.9E.A5)\",\"type\":\"h4\",\"id\":\"Qtxtp_QXvi_VLsA5OIVvB\"},{\"children\":[{\"text\":\"WordPress 백엔드에서 \"},{\"b\":1,\"text\":\"플러그인\"},{\"text\":\"을 클릭하고 \"},{\"b\":1,\"text\":\"tencentcloud-cos\"},{\"text\":\" 플러그인을 직접 검색한 다음 \"},{\"b\":1,\"text\":\"지금 설치\"},{\"text\":\"를 클릭합니다.\"}],\"type\":\"p\",\"id\":\"4VSd_v-HtIt-Rrqp4HTfd\"},{\"children\":[{\"text\":\"소스 코드를 통한 설치\"}],\"nodeId\":\".EC.86.8C.EC.8A.A4-.EC.BD.94.EB.93.9C.EB.A5.BC-.ED.86.B5.ED.95.9C-.EC.84.A4.EC.B9.98\",\"type\":\"h4\",\"id\":\"a5ohLR0i0_8Kuo6KEec-A\"},{\"children\":[{\"text\":\"플러그인 소스 코드를 다운로드하고 WordPress 플러그인 디렉터리 \"},{\"code\":1,\"text\":\"wp-content/plugins\"},{\"text\":\"에 업로드하고 백엔드에서 실행합니다.\"}],\"type\":\"p\",\"id\":\"N72Ek-cShsRMsqR-bfUIf\"},{\"children\":[{\"text\":\"다음 단계에서는 Ubuntu를 예로 들어 플러그인을 설치하는 방법을 설명합니다.\"}],\"type\":\"p\",\"id\":\"k1ugin1ZQDFJfat7CSNRB\"},{\"children\":[{\"text\":\"wp-content의 상위 디렉터리로 이동: \"}],\"start\":true,\"type\":\"oli\",\"id\":\"299Hm6jd4bmXo_2YBbO10\"},{\"children\":[{\"children\":[{\"text\":\"cd /var/www/html \"}],\"type\":\"code-line\",\"id\":\"X-PSh8Wlm15S5TeNwVQ7R\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"vas3QWKOy4lO40hO6Xa0U\",\"autoWrap\":false},{\"children\":[{\"text\":\"권한 추가: \"}],\"start\":false,\"type\":\"oli\",\"id\":\"fjL4gXrwgt33dg-h8NvRh\"},{\"children\":[{\"children\":[{\"text\":\"chmod -R 777 wp-content \"}],\"type\":\"code-line\",\"id\":\"WeQr1fdC0SeQHhO0uSCFN\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"6fBDKF8yWP6kWFAOIXP-3\",\"autoWrap\":false},{\"children\":[{\"text\":\"플러그인 디렉터리 생성:\"}],\"start\":false,\"type\":\"oli\",\"id\":\"kn22phCHnTaznO06Lj1GJ\"},{\"children\":[{\"children\":[{\"text\":\"cd wp-content/plugins/\"}],\"type\":\"code-line\",\"id\":\"cwj5hH1HxXwQwJIMVrtUa\"},{\"children\":[{\"text\":\"mkdir tencent-cloud-cos\"}],\"type\":\"code-line\",\"id\":\"p6kEBG-RwpEjd1igfUuMz\"},{\"children\":[{\"text\":\"cd tencent-cloud-cos\"}],\"type\":\"code-line\",\"id\":\"q93VfQATxR7kxpa8QPOV1\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"g-rTVnIHPAJtACJ2yqgaj\",\"autoWrap\":false},{\"children\":[{\"text\":\"플러그인 디렉터리에 플러그인 다운로드:\"}],\"start\":false,\"type\":\"oli\",\"id\":\"oVFpZyUF_t41nI8zLfuox\"},{\"children\":[{\"children\":[{\"text\":\"wget https://cos5.cloud.tencent.com/cosbrowser/code/tencent-cloud-cos.zip\"}],\"type\":\"code-line\",\"id\":\"6Mv_6APIYb9v2aBS2gijV\"},{\"children\":[{\"text\":\"unzip tencent-cloud-cos.zip\"}],\"type\":\"code-line\",\"id\":\"ugY-vO-saMrgkmWdsQFZJ\"},{\"children\":[{\"text\":\"rm tencent-cloud-cos.zip -f\"}],\"type\":\"code-line\",\"id\":\"8elc_H1xyx33ChxqMUhIt\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"H0-yeDMQvZHARUJ4TCjsl\",\"autoWrap\":false},{\"children\":[{\"text\":\"왼쪽 사이드바에서 ‘플러그인’을 클릭하면 플러그인을 볼 수 있습니다. 활성화를 클릭하여 활성화합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"XJ9OU_LUYGd13QBEU46xO\"},{\"children\":[{\"b\":1,\"text\":\"플러그인 구성\"}],\"nodeId\":\"**.ED.94.8C.EB.9F.AC.EA.B7.B8.EC.9D.B8-.EA.B5.AC.EC.84.B1**\",\"type\":\"h4\",\"id\":\"xuGz4LK_naEHZ2vJaU_P4\"},{\"children\":[{\"text\":\"tencent-cloud-cos 플러그인에서 COS 버킷 정보를 구성합니다.\"}],\"type\":\"p\",\"id\":\"3LcsycN-uLKPgXZ7EMj2V\"},{\"children\":[{\"text\":\"‘설정’을 클릭하여 tencent-cloud-cos 플러그인을 구성합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"3iv_IVVQUTemHCHqXL0eE\"},{\"children\":[{\"text\":\"다음과 같이 COS 정보를 구성합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"zi6wSOqSyooZUunn4OTh4\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"구성 항목\"}],\"type\":\"p\",\"id\":\"f9OsRLwF3IH08NxK8rafw\"}],\"type\":\"cell\",\"id\":\"F-frCe_rjB1cyrk5GvjYg\"},{\"children\":[{\"children\":[{\"text\":\"구성 값\"}],\"type\":\"p\",\"id\":\"M4in4Jos91gIBh-K4hdMZ\"}],\"type\":\"cell\",\"id\":\"HamtJBwcEwSj21NWLuDQz\"}],\"type\":\"row\",\"id\":\"dsdKSZzKLUGUCdCfYrfae\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"SecretId, SecretKey\"}],\"type\":\"p\",\"id\":\"hIRUtpAzl1j4ELKgjOzLh\"}],\"type\":\"cell\",\"id\":\"sQS8vZRZuHSQwz4eoy2hG\"},{\"children\":[{\"children\":[{\"text\":\"키 정보에 액세스하려면 \"},{\"children\":[{\"text\":\"Tencent Cloud API 키\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/capi\"},\"type\":\"ref\",\"id\":\"GIU-Pe2tcNSrBKsizyzLW\"},{\"text\":\"로 이동하여 생성 및 가져오기\"}],\"type\":\"p\",\"id\":\"qNa2XfnTusX6JGO_hqEuu\"}],\"type\":\"cell\",\"id\":\"5yWMLl-AWIiB_n9NU0ICC\"}],\"type\":\"row\",\"id\":\"rhPL-AI9nmYkYgzeM4GZE\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"소속 리전\"}],\"type\":\"p\",\"id\":\"y9B5z3gFbcF3PJpVxqYA3\"}],\"type\":\"cell\",\"id\":\"DJA16X8LwYp-ucRKAS2Gn\"},{\"children\":[{\"children\":[{\"text\":\"버킷 생성 시 선택한 리전\"}],\"type\":\"p\",\"id\":\"Dvkjxlg8fSxySJNKEHGmd\"}],\"type\":\"cell\",\"id\":\"nyhaVJlOkgKtqBWkAm3oU\"}],\"type\":\"row\",\"id\":\"3_95d2UyJT9yn3ze6KHTU\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"스페이스 이름\"}],\"type\":\"p\",\"id\":\"PExLxapKVX3scnemZ5o13\"}],\"type\":\"cell\",\"id\":\"bfEIDSU3agWF8-iaUA3SD\"},{\"children\":[{\"children\":[{\"text\":\"버킷 생성 시 사용자 지정된 버킷 이름, 예시: examplebucket-1250000000\"}],\"type\":\"p\",\"id\":\"e6SxC1Iav_Eh58nY2Kx_6\"}],\"type\":\"cell\",\"id\":\"5cMIlQOpZVWHBH6YOfHgw\"}],\"type\":\"row\",\"id\":\"6vkkPOTu-keNovvd56PF1\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"액세스 도메인\"}],\"type\":\"p\",\"id\":\"OmeImmvLPReLMMSG4cxZ1\"}],\"type\":\"cell\",\"id\":\"Zn3dLYRPT1IR0hIpi7dEN\"},{\"children\":[{\"children\":[{\"text\":\"COS의 기본 버킷 도메인을 말하며, 사용자가 버킷을 생성하면 시스템에서 버킷 이름과 리전에 따라 자동으로 생성합니다. 다른 리전의 버킷은 각각 다른 기본 도메인이 있습니다. \"},{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\",\"id\":\"-SiTkNWKM0vpk6XpXKHNx\"},{\"text\":\"로 이동하여 버킷의 \"},{\"text\":\"개요 > 도메인 정보\"},{\"text\":\"에서 확인하실 수 있습니다.\"}],\"type\":\"p\",\"id\":\"uO4tzPg2H-2wz9jSIdOZa\"}],\"type\":\"cell\",\"id\":\"sRsqAPnlr-oRwFeQv0sN4\"}],\"type\":\"row\",\"id\":\"JmLHjQtZoohqfiFWW5hR1\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"자동 이름 변경\"}],\"type\":\"p\",\"id\":\"VLM8Xvj6ThKyziRILmEVs\"}],\"type\":\"cell\",\"id\":\"MY-6ZcqzGaZyv6KqmtSTO\"},{\"children\":[{\"children\":[{\"text\":\"파일을 COS에 업로드한 후 동일한 이름의 기존 파일과 충돌을 피하기 위해 자동으로 지정된 형식에 따라 이름 변경\"}],\"type\":\"p\",\"id\":\"K10cJuYeb3ANkGkTvXY_9\"}],\"type\":\"cell\",\"id\":\"1cNqh3hoFIjnUNbF5KIDE\"}],\"type\":\"row\",\"id\":\"bEI8PAa_h7hmjO3XWgkao\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"로컬에 저장하지 않음\"}],\"type\":\"p\",\"id\":\"MKbchrLnaZilz-Ua1Y_qw\"}],\"type\":\"cell\",\"id\":\"uZLBkpWuRZcCuW5XZgtvL\"},{\"children\":[{\"children\":[{\"text\":\"이 옵션을 활성화 후에는 원본 파일이 로컬에 보관되지 않습니다\"}],\"type\":\"p\",\"id\":\"01uc_ru98Bt3I7ph3tj2x\"}],\"type\":\"cell\",\"id\":\"Z7vW4ZiSKAhymgHkADY3B\"}],\"type\":\"row\",\"id\":\"cdGTXAYOoZF1fbVAgncwV\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"원격 파일 보관\"}],\"type\":\"p\",\"id\":\"fqL_5uh7kFmwegyk1ARzD\"}],\"type\":\"cell\",\"id\":\"Hk8IoA71XfA7cDbD61HA8\"},{\"children\":[{\"children\":[{\"text\":\"이 옵션을 활성화한 후 파일이 삭제되면 로컬 파일 사본만 삭제되고 원격 COS 버킷의 파일 사본은 복구하려는 경우에 대비하여 계속 보관됩니다\"}],\"type\":\"p\",\"id\":\"bAR0UTq3Lyw4Je50CsA4D\"}],\"type\":\"cell\",\"id\":\"5uqNYZh4ymWosJYrM-PF7\"}],\"type\":\"row\",\"id\":\"U9eIjLVyb6YmOiZnChev0\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"썸네일 금지\"}],\"type\":\"p\",\"id\":\"iCVltTOzuktFouvj-qz8t\"}],\"type\":\"cell\",\"id\":\"RZzDwVTA4TDvXV8mhWEdN\"},{\"children\":[{\"children\":[{\"text\":\"이 옵션을 활성화하면 썸네일 파일이 업로드되지 않습니다\"}],\"type\":\"p\",\"id\":\"LcQBT0weXD3hqMjhJ-NGW\"}],\"type\":\"cell\",\"id\":\"RjeCX87UBh9jFxjJB23cU\"}],\"type\":\"row\",\"id\":\"dwvD16TSTH7yRpsah7yJb\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Cloud Infinite(CI)\"}],\"type\":\"p\",\"id\":\"oEC_ax_5Cq5qydQ_XBZoR\"}],\"type\":\"cell\",\"id\":\"VYjcayqsd6zFIXIgBrrlA\"},{\"children\":[{\"children\":[{\"text\":\"CI 서비스가 활성화되면 이미지에 편집, 압축, 형식 변환, 워터마크 추가 등 이미지에 대한 다양한 작업을 수행할 수 있으며, 자세한 내용은 \"},{\"children\":[{\"text\":\"Cloud Infinite\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/products/ci\"},\"type\":\"ref\",\"id\":\"YfzxtBsapfUA--w9jC7pE\"},{\"text\":\"를 참고하십시오\"}],\"type\":\"p\",\"id\":\"DLNlsBpQJ-4VE2A5db0v9\"}],\"type\":\"cell\",\"id\":\"GJSpbrD9_YoVHnSPsaUXe\"}],\"type\":\"row\",\"id\":\"up9lcB-Eqydh5Zx74LFsG\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"파일 조정\"}],\"type\":\"p\",\"id\":\"pfhW_Ko7ZAw7MAV-w4rzq\"}],\"type\":\"cell\",\"id\":\"xQsom5yuEiMI6tpPiyn3W\"},{\"children\":[{\"children\":[{\"text\":\"파일 조정이 활성화되면 이미지, 비디오, 오디오, 텍스트, 파일 및 웹 페이지의 멀티미디어 콘텐츠를 지능적으로 조정합니다. 음란물, 저속, 불법, 혐오, 공격적인 정보와 같은 비준수 콘텐츠를 효과적으로 식별하여 운영상의 위험을 방지할 수 있습니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"민감한 콘텐츠 조정 개요\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/53946\"},\"type\":\"ref\",\"id\":\"h-fGe0Gth_7-MzNoKL_SZ\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"W-pmZQSQfYMV62j0p4vQ1\"}],\"type\":\"cell\",\"id\":\"d7a33s6Up1IkZ3752H3PV\"}],\"type\":\"row\",\"id\":\"g6icdu4bCl0q6peBKWgKJ\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"파일 미리보기\"}],\"type\":\"p\",\"id\":\"I5sP15Dx-qHjyQU59cQSE\"}],\"type\":\"cell\",\"id\":\"KDqz6YbKpwVaECPjZGQDS\"},{\"children\":[{\"children\":[{\"text\":\"파일 미리보기가 활성화되면 파일을 이미지, PDF 파일 또는 HTML5 페이지로 변환하여 웹 페이지에 파일 콘텐츠를 표시합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"파일 미리보기 개요\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/49159\"},\"type\":\"ref\",\"id\":\"76rEZ3n6a2I86YFXrO_sx\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"gCKDLPpWmZmd3kOG_VP-c\"}],\"type\":\"cell\",\"id\":\"I436Sd2fTxvwYkri4-VMW\"}],\"type\":\"row\",\"id\":\"86MPNGYrVpx2coBEHiq5B\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"디버깅\"}],\"type\":\"p\",\"id\":\"7dxet55D7FdH2CYEvjTN-\"}],\"type\":\"cell\",\"id\":\"DlEBnrDQrKEoAZGeOY3II\"},{\"children\":[{\"children\":[{\"text\":\"이 기능은 오류, 예외 및 경고를 기록합니다\"}],\"type\":\"p\",\"id\":\"Zw1FuU0s0A2my9Z7cIkLs\"}],\"type\":\"cell\",\"id\":\"Qsott9Xey32vni-QSazGQ\"}],\"type\":\"row\",\"id\":\"DHCv6NImgcFfcYEvzXJbS\"}],\"rowHeader\":true,\"type\":\"table\",\"widths\":[24,76],\"id\":\"oFOuxNNKjNHnWowg54o1e\",\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\",\"id\":\"Of4YPmMCDbG-jsytpOUMe\"},{\"children\":[{\"text\":\"구성이 완료되면 \"},{\"b\":1,\"text\":\"구성 저장\"},{\"text\":\"을 클릭합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"a3eKgmHinlcBBPeO9hCJs\"},{\"children\":[{\"b\":1,\"text\":\"COS에 대한 WordPress 첨부 파일 스토리지 확인\"}],\"nodeId\":\"**cos.EC.97.90-.EB.8C.80.ED.95.9C-wordpress-.EC.B2.A8.EB.B6.80-.ED.8C.8C.EC.9D.BC-.EC.8A.A4.ED.86.A0.EB.A6.AC.EC.A7.80-.ED.99.95.EC.9D.B8**\",\"type\":\"h2\",\"id\":\"hYL0A7yGBXXSBdMS0BLD-\"},{\"children\":[{\"text\":\"Wordpress에서 이미지로 게시물을 작성하고 이미지가 COS에 저장되어 있는지 확인할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"_-VpGxVFG-tCxqpVXEJco\"},{\"children\":[{\"text\":\"WordPress 대시보드에서 왼쪽 사이드바의 ‘게시물’을 클릭하여 이미지가 포함된 게시물을 생성합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"--GPPOgNlZQC62cxi96Hk\"},{\"children\":[{\"text\":\"‘Hello world!’ 편집 기본적으로 WordPress에서 생성된 게시물입니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"ftzsTkawgtC6Vcdn8n6tM\"},{\"children\":[{\"text\":\"오른쪽에서 ‘+’를 클릭합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"t1TWVlOTiGI88Xg_w017V\"},{\"children\":[{\"text\":\"이미지를 업로드합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"j3Bqe6VQRlPUbn5jMONkt\"},{\"children\":[{\"text\":\"그 다음 업로드된 이미지의 URL이 \"},{\"code\":1,\"text\":\"https://.cos..myqcloud.com/\"},{\"text\":\" 형식의 \"},{\"code\":1,\"text\":\"https://wd-125000000.cos.ap-nanjing.myqcloud.com/2022/10/입하-1200x675.jpeg\"},{\"text\":\"와 같은 COS URL인지 확인하고 그렇다면 이미지가 COS 버킷에 업로드된 것입니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"yMJaK8pwrH2u4NX8tLgTB\"},{\"children\":[{\"text\":\"COS 콘솔에 로그인하면 버킷에서 새로 업로드된 이미지를 볼 수 있습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"gizMYzNGpcnrHFymaiG-a\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"BpfqIFzmICWGZmEAwW9yB\"},{\"children\":[{\"text\":\" 상기 테스트에 성공하면 \"},{\"children\":[{\"text\":\"COSCMD\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/10976\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/10976\"},\"type\":\"ref\",\"id\":\"2b0XxId3IttUQ5pX0_gBG\"},{\"text\":\" 또는 \"},{\"children\":[{\"text\":\"COS Migration\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/15392\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/15392\"},\"type\":\"ref\",\"id\":\"ck6lnvR64hxp_QBUtqMSo\"},{\"text\":\"을 사용하여 이전 WordPress 리소스를 COS 버킷에 동기화합니다. \"},{\"b\":1,\"text\":\"이 단계를 수행해야 합니다. 그렇지 않으면 COS에서 이러한 리소스를 볼 수 없습니다\"},{\"text\":\". 그 다음 아래의 \"},{\"children\":[{\"text\":\"Origin-pull 설정\"}],\"linkTarget\":\"self\",\"linkTitle\":\"#1\",\"props\":{\"type\":\"link\",\"url\":\"#1\"},\"type\":\"ref\",\"id\":\"2tNJEFxpsx8rQNfFOrycd\"},{\"text\":\"에 따라 Origin-pull을 선택적으로 활성화할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"lL-7kvrtlBTjI3C4BimC9\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"O2_T3KIN7UkE9DGT1izoU\"},{\"children\":[{\"text\":\"확장\"}],\"nodeId\":\".ED.99.95.EC.9E.A5\",\"type\":\"h2\",\"id\":\"1J5VE5KPy-QbFYM672Gvd\"},{\"children\":[{\"text\":\"CDN 가속을 사용하여 액세스합니다.\\n버킷에 CDN 가속 설정이 필요한 경우 \"},{\"children\":[{\"text\":\"CDN 가속 구성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/18670\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/18670\"},\"type\":\"ref\",\"id\":\"8P8owXxiSQugZ8hHF4fZz\"},{\"text\":\" 문서를 참고하십시오. 플러그 인 설정에서 URL 접두사의 기본값을 CDN 가속 도메인 또는 사용자 정의 가속 도메인으로 수정하면 됩니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"Cqi-rdO1fTyobv4RvjiRg\"},{\"children\":[{\"text\":\"데이터베이스의 리소스 주소를 변경합니다.\\n새로 생성한 사이트가 아니라면 데이터베이스에는 반드시 기존 리소스 링크 주소가 존재하며, 이 리소스 주소를 변경해야 합니다. 플러그 인에서 변경 기능을 제공하며, 최초 변경 전 반드시 백업해 두시기 바랍니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"ERdDbCA9k9M6_DmXXrJ9D\"},{\"children\":[{\"text\":\"기존 도메인에 원본 리소스 도메인을 입력합니다. 예: \"},{\"code\":1,\"text\":\"https://example.com/\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"IjYlfiOG_BZUA8eLP9ZE_\"},{\"children\":[{\"text\":\"신규 도메인에 현재의 리소스 도메인을 입력합니다. 예: \"},{\"code\":1,\"text\":\"https://img.example.com/\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"5LSlGtjRX3mHxO7AUgYjP\"},{\"children\":[{\"text\":\"크로스 도메인 액세스를 설정합니다.\\n본 문서의 상응하는 리소스 링크 인용 시 콘솔은 크로스 도메인 오류 \"},{\"code\":1,\"text\":\"No 'Access-Control-Allow-Origin' header is present on the requested resource\"},{\"text\":\"를 표시합니다. 이는 header를 추가하지 않았기 때문입니다. 크로스 도메인 액세스 CORS 설정에서 HTTP Header 설정을 추가해야 하며, 다음 두 가지 방법으로 구성할 수 있습니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"p2Guk71P0cXYN0rZsMeZn\"},{\"children\":[{\"text\":\"COS 콘솔에서 구성\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"lJ0F-YB5kg4jaC1RN8hnR\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"7wqUYakHwq2y6AFJGRC57\"},{\"children\":[{\"text\":\"크로스 도메인 설정 작업 순서는 \"},{\"children\":[{\"text\":\"CORS 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13318\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13318\"},\"type\":\"ref\",\"id\":\"BevBnedetH970qySkGsuC\"},{\"text\":\" 문서를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"MsHUtY_45JSkBeVDSvCRM\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"9Xud6VynhsD6b1xMKs4-e\"},{\"children\":[{\"text\":\"CDN 콘솔에서 구성\"}],\"start\":false,\"type\":\"uli\",\"id\":\"ZF1-5MwetBfcqCRUNcxqJ\"},{\"children\":[{\"text\":\"모든 도메인을 허용할 경우, 다음과 같이 구성합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"saRWq8dQgy-8f5pGLi3YM\"},{\"children\":[{\"children\":[{\"text\":\"Access-Control-Allow-Origin: *\"}],\"type\":\"code-line\",\"id\":\"KLPYXgrQbx2266frZrEc5\"}],\"indent\":2,\"language\":\"plaintext\",\"type\":\"code-block\",\"id\":\"AWr-q5evCsqBEZCU-Rh5_\",\"autoWrap\":false},{\"children\":[{\"text\":\"사용자 개인 도메인 액세스만 허용할 경우, 다음과 같이 구성합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"2pZNI9Sijibqg7bviin-t\"},{\"children\":[{\"children\":[{\"text\":\"Access-Control-Allow-Origin: https://example.com\"}],\"type\":\"code-line\",\"id\":\"5oU1YAKPp0QTzIz3LP7xO\"}],\"indent\":2,\"language\":\"plaintext\",\"type\":\"code-block\",\"id\":\"MZMxpHGCg2dhmH_ANQMhf\",\"autoWrap\":false},{\"children\":[{\"text\":\"\"},{\"type\":\"inline-anchor\",\"nodeId\":\"1\",\"children\":[{\"text\":\"Origin-pull을 설정합니다.\"}],\"id\":\"uqUjfg4sOHFqjMdXGdMs3\"},{\"text\":\"\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"4dV9iFuvpckNTv_rgOvjE\"},{\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"XdPM1nmjNOobie8-I_R6k\",\"children\":[{\"text\":\"COS 콘솔을 통해 WordPress 미디어 라이브러리에 리소스를 업로드하지 않는 경우 COS Origin-pull을 사용하는 것이 좋습니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"Origin-pull 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/31508\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/31508\"},\"type\":\"ref\",\"id\":\"cJbWfsf4el9whksG1wFtk\"},{\"text\":\"을 참고하십시오.\\nOrigin-pull이 활성화되면 클라이언트가 처음으로 COS의 원본 객체에 액세스할 때 COS가 객체에 도달할 수 없는 경우 302 HTTP 상태 코드를 반환하고 자동으로 요청을 Origin-pull 주소로 리디렉션합니다. 그 다음 원본에서 액세스할 객체를 제공합니다. 한편 COS는 원본에서 이 객체를 복사하여 해당 COS 디렉터리에 저장하므로 COS는 후속 요청에서 객체를 클라이언트에 직접 반환할 수 있습니다.\"}]}]"}},"34688":{"categoryId":436,"weight":60,"type":"page","extension":"","pid":34079,"id":34688,"lang":"ko","title":"S3와 호환되는 타사 애플리케이션에서 COS의 일반 구성 사용","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-03 23:08:57","recentReleaseTime":"2021-03-03 23:08:57","content":{"title":"S3와 호환되는 타사 애플리케이션에서 COS의 일반 구성 사용","body":"
Amazon Simple Storage Service(Amazon S3, 이하 S3)는 AWS에서 출시한 최초의 클라우드 서비스 중 하나입니다. 수년간의 개발 끝에 S3 프로토콜은 객체 스토리지 분야에서 사실상의 표준이 되었습니다. Tencent COS(Cloud Object Storage)는 S3 호환 구현 방식을 제공하므로 대부분의 S3 호환 애플리케이션에서 COS 서비스를 직접 사용할 수 있습니다. 본 문서에서는 COS를 사용하도록 이러한 애플리케이션을 구성하는 방법을 설명합니다.

준비 작업

애플리케이션의 COS 서비스 사용 가능 여부 확인

설명에 S3 Compatible이 가능한 애플리케이션은 대부분의 경우 COS를 사용할 수 있습니다. 일부 기능이 제대로 작동하지 않는 경우 고객센터에 도움을 요청하십시오. 본 문서의 가이드를 따랐음을 표시하고 애플리케이션 이름 및 스크린샷과 같은 정보를 제공하십시오.
애플리케이션 설명에 Amazon S3가 지원된다는 내용만 있으면 애플리케이션이 S3 서비스를 사용할 수 있지만 COS를 사용할 수 있는지 여부는 아래에 설명된 대로 관련 구성에서 추가로 평가해야 합니다.

COS 서비스 준비

1단계: Tencent Cloud 계정 가입

(이미 Tencent Cloud 계정이 있는 경우 이 단계를 생략할 수 있습니다.)


2단계: 실명 인증

(이미 완료한 경우 이 단계를 생략할 수 있습니다.)

자세한 인증 과정은 실명 인증 가이드 를 참고하십시오.

3단계: COS 서비스 활성화



4단계: APPID 및 액세스 키 준비

CAM 콘솔의 API 키 관리 페이지에서 APPID, SecretId 및 SecretKey를 얻고 기록하세요. 자세한 내용은 주 계정 액세스 키 관리를 참조하세요.

5단계: 버킷 생성

버킷 생성의 지침에 따라 COS 버킷을 생성합니다.
일부 애플리케이션에는 버킷 생성 프로세스가 내장되어 있습니다. 이러한 애플리케이션이 버킷을 생성하도록 하려면 이 단계를 생략할 수 있습니다.

애플리케이션에서 COS 서비스 설정

기본 설정

대부분의 애플리케이션에는 스토리지 서비스를 사용하기 위한 유사한 구성 항목이 있습니다. 이러한 구성 항목의 일반 이름과 설명은 다음과 같습니다.
설명:
설정 과정에서 궁금한 점이 있으시면 고객센터로 문의하시기 바랍니다. 본 문서의 가이드를 따랐음을 표시하고 애플리케이션 이름 및 스크린샷과 같은 정보를 제공하십시오.
설정 항목에서 흔히 볼 수 있는 이름
관련 설명
공급자/서비스 공급자/스토리지 서비스 공급자/Service Provider/Storage Provider/Provider 등
애플리케이션이 사용해야 할 스토리지를 선택할 때 다음과 같은 상황이 있을 수 있습니다.

선택 항목에 S3 Compatible Storage/S3 Compatible과 같은 텍스트가 있는 경우 해당 옵션이 먼저 사용됩니다.
선택 항목에 amazon web services/AWS/Amazon S3와 같은 텍스트만 있는 경우 이를 사용하되 구성하는 동안 추가 지침에 주의하십시오.
비슷한 선택 항목이 없지만 애플리케이션 설명에 애플리케이션이 S3 서비스 또는 S3 호환 서비스를 지원한다고 언급하는 경우 아래 구성을 계속할 수 있지만 추가 지침에도 주의해야 합니다.
기타 다른 경우에는 애플리케이션이 COS를 사용하지 못할 수 있습니다.
서버/서버 주소/서비스 URL/Endpoint/Custom Endpoint/Server URL 등
여기에는 S3 호환 서비스의 서비스 주소를 입력합니다. COS 서비스를 사용할 경우, COS의 서비스 주소를 다음 형식으로 입력합니다:
cos.<Region>.myqcloud.com 또는 https://cos.<Region>.myqcloud.com입니다.
https://를 입력해야 할지 여부는 특정 애플리케이션에 따라 다르므로, 직접 시도해 보실 수 있습니다. 여기서 <Region>은 COS의 사용 가능 지역을 나타냅니다.
애플리케이션 내에서는 지정된 서비스 주소의 지역에서만 버킷을 생성하거나 선택할 수 있습니다.
예를 들어, 버킷이 광저우 지역에 있다면 서비스 주소는 cos.ap-guangzhou.myqcloud.com으로 설정해야 합니다. 다른 지역으로 설정하면 애플리케이션 내에서 광저우 지역의 버킷을 찾을 수 없습니다.
애플리케이션의 서비스 제공자에서 Amazon S3만 선택할 수 있고 서비스 엔드포인트가 구성 가능하다면, 앞서 언급한 cos.<Region>.myqcloud.com 또는 https://cos.<Region>.myqcloud.com으로 변경할 수 있습니다.
서비스 엔드포인트가 구성할 수 없거나 서비스 엔드포인트 구성 항목이 없다면, 애플리케이션은 COS 서비스를 사용할 수 없습니다.
Access Key/Access Key ID 등
4단계에서 기록된 SecretId를 입력하십시오.
Secret Key/Secret/Secret Access Key 등
4단계에서 기록된 SecretKey를 입력하십시오.
리전/Region 등
기본값, 자동, Auto 또는 Automatic을 선택합니다.
버킷/Bucket 등
기존의 버킷 이름을 선택 또는 입력합니다. 포맷은 <BucketName-APPID>입니다(예: examplebucket-1250000000). 이 중 BucketName5단계에서 버킷 생성 시 입력한 버킷 이름이며, APPID4단계에서 기록한 APPID입니다.위의 설명과 마찬가지로 이곳의 버킷은 서버 주소가 지정한 리전에 한정되어 있으며, 기타 리전의 버킷은 나열되지 않거나 정상적인 사용이 불가능합니다. 새로운 버킷을 생성해야 하는 경우 새로 생성된 버킷 이름도 위의 <BucketName-APPID> 포맷에 부합해야 합니다. 그렇지 않으면 정상적으로 버킷을 생성할 수 없습니다.


기타 항목 및 고급 설정 설명

일부 애플리케이션은 위의 기본 설정 외에도 기타 항목 및 고급 설정이 더 있습니다. 애플리케이션에서 COS 서비스를 원활하게 사용할 수 있도록 아래 일부 COS의 기능 설명을 추가합니다.
서버 포트와 프로토콜\nCOS 서비스가 지원하는 HTTP 프로토콜과 HTTPS 프로토콜은 모두 프로토콜의 기본 포트인 80과 443 포트를 사용합니다. 보안상의 이유로 HTTPS 프로토콜을 통한 COS 서비스 사용을 권장합니다.
COS는 Virtual Hosted-Style 스타일을 지원합니다.
주의:
2024년 1월 1일 이후에 생성된 버킷은 경로 스타일 도메인 이름을 지원하지 않으며, 가상 호스트 스타일 도메인 이름만 지원합니다. 이전에 생성된 버킷은 영향을 받지 않지만, 가상 호스트 스타일 도메인 이름을 우선적으로 사용하는 것이 좋습니다.
AWS V2 서명과 AWS V4 서명\nCOS는 두 종류의 서명 포맷을 모두 지원합니다.

결론

COS는 S3와의 완전한 호환성을 보장하지 않습니다. 애플리케이션에서 COS 사용 시 질문이 있는 경우 고객센터에 도움을 요청하십시오. 본 문서의 가이드를 따랐음을 표시하고 애플리케이션 이름 및 스크린샷과 같은 정보를 제공하십시오.
","recentReleaseTime":"2026-02-28 15:48:32","slate":"[{\"children\":[{\"text\":\"Amazon Simple Storage Service(Amazon S3, 이하 S3)는 AWS에서 출시한 최초의 클라우드 서비스 중 하나입니다. 수년간의 개발 끝에 S3 프로토콜은 객체 스토리지 분야에서 사실상의 표준이 되었습니다. Tencent COS(Cloud Object Storage)는 S3 호환 구현 방식을 제공하므로 대부분의 S3 호환 애플리케이션에서 COS 서비스를 직접 사용할 수 있습니다. 본 문서에서는 COS를 사용하도록 이러한 애플리케이션을 구성하는 방법을 설명합니다.\"}],\"type\":\"p\",\"id\":\"P_tQSR-F1wr7s3m5WuH5a\"},{\"children\":[{\"text\":\"준비 작업\"}],\"nodeId\":\".EC.A4.80.EB.B9.84-.EC.9E.91.EC.97.85\",\"type\":\"h2\",\"id\":\"y6iZgcpbiSWaNIWbsyRb5\"},{\"children\":[{\"text\":\"애플리케이션의 COS 서비스 사용 가능 여부 확인\"}],\"nodeId\":\".EC.95.A0.ED.94.8C.EB.A6.AC.EC.BC.80.EC.9D.B4.EC.85.98.EC.9D.98-cos-.EC.84.9C.EB.B9.84.EC.8A.A4-.EC.82.AC.EC.9A.A9-.EA.B0.80.EB.8A.A5-.EC.97.AC.EB.B6.80-.ED.99.95.EC.9D.B8\",\"type\":\"h3\",\"id\":\"_ZLjYSVW7vNAH3NGZ2YFL\"},{\"children\":[{\"text\":\"설명에 \"},{\"code\":1,\"text\":\"S3 Compatible\"},{\"text\":\"이 가능한 애플리케이션은 대부분의 경우 COS를 사용할 수 있습니다. 일부 기능이 제대로 작동하지 않는 경우 \"},{\"children\":[{\"text\":\"고객센터\"}],\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/contact-sales\"},\"type\":\"ref\",\"id\":\"lb77hzJRt5nlVLn2h4lUZ\"},{\"text\":\"에 도움을 요청하십시오. 본 문서의 가이드를 따랐음을 표시하고 애플리케이션 이름 및 스크린샷과 같은 정보를 제공하십시오.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"FHif6ioXN7TMeapyAyNii\"},{\"children\":[{\"text\":\"애플리케이션 설명에 \"},{\"code\":1,\"text\":\"Amazon S3\"},{\"text\":\"가 지원된다는 내용만 있으면 애플리케이션이 S3 서비스를 사용할 수 있지만 COS를 사용할 수 있는지 여부는 아래에 설명된 대로 관련 구성에서 추가로 평가해야 합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"-egii5hFy44v9oF54Nkwz\"},{\"children\":[{\"text\":\"COS 서비스 준비\"}],\"nodeId\":\"cos-.EC.84.9C.EB.B9.84.EC.8A.A4-.EC.A4.80.EB.B9.84\",\"type\":\"h3\",\"id\":\"aAObQ4tvaUyZdZtUkdKfA\"},{\"children\":[{\"text\":\"1단계: Tencent Cloud 계정 가입\"}],\"nodeId\":\"1.EB.8B.A8.EA.B3.84.3A-tencent-cloud-.EA.B3.84.EC.A0.95-.EA.B0.80.EC.9E.85\",\"type\":\"h4\",\"id\":\"lPi0ZmsNktYwpXKsIQ0x-\"},{\"children\":[{\"text\":\"(이미 Tencent Cloud 계정이 있는 경우 이 단계를 생략할 수 있습니다.)\"}],\"type\":\"p\",\"id\":\"EvjVrdaaHFz09k3fPbp8d\"},{\"type\":\"html-block\",\"content\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"XU_eKuEQlheGkuJYIFC5H\"},{\"children\":[{\"text\":\"2단계: 실명 인증\"}],\"nodeId\":\"2.EB.8B.A8.EA.B3.84.3A-.EC.8B.A4.EB.AA.85-.EC.9D.B8.EC.A6.9D\",\"type\":\"h4\",\"id\":\"y5-d4rAEZ22nSqN5IeCXI\"},{\"children\":[{\"text\":\"(이미 완료한 경우 이 단계를 생략할 수 있습니다.)\"}],\"type\":\"p\",\"id\":\"4PUWw0wVbzkIevFQzhG-e\"},{\"type\":\"html-block\",\"content\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"5z9ymLvBVdlVqeLklBJOh\"},{\"children\":[{\"text\":\"자세한 인증 과정은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product//378/3629\"},\"children\":[{\"text\":\"실명 인증 가이드 \"}],\"id\":\"EfKUhkGJcQlhdUab_ytEk\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"QFqztd7pCxNI6Bm01Fb-N\"},{\"children\":[{\"text\":\"3단계: COS 서비스 활성화\"}],\"nodeId\":\"3.EB.8B.A8.EA.B3.84.3A-cos-.EC.84.9C.EB.B9.84.EC.8A.A4-.ED.99.9C.EC.84.B1.ED.99.94\",\"type\":\"h4\",\"id\":\"U_QwypzgZVdr8nWV2cJw9\"},{\"type\":\"html-block\",\"content\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"qmdeRmdtf7WrbdU3bhadI\"},{\"nodeId\":\"step4\",\"type\":\"h4\",\"id\":\"AQDU1VEh3bINPsklSx8eW\",\"children\":[{\"text\":\"4단계: APPID 및 액세스 키 준비\"}]},{\"children\":[{\"text\":\"CAM 콘솔의 \"},{\"id\":\"czqIwQtBb2WftEAccAEoJ\",\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/capi\"},\"children\":[{\"text\":\"API 키 관리\"}]},{\"text\":\" 페이지에서 APPID, SecretId 및 SecretKey를 얻고 기록하세요. 자세한 내용은 \"},{\"id\":\"UfQeV07KDdONgFPDryFey\",\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://tencentcloud.com/document/product/598/34228\"},\"children\":[{\"text\":\"주 계정 액세스 키 관리\"}]},{\"text\":\"를 참조하세요.\"}],\"type\":\"p\",\"id\":\"vDYjFbQEKRvdrEgTHTa8j\"},{\"children\":[{\"text\":\"5단계: 버킷 생성\"}],\"nodeId\":\"step5\",\"type\":\"h4\",\"id\":\"Ut5ycaM_gZR4_YnQ-LMhm\"},{\"children\":[{\"children\":[{\"text\":\"버킷 생성\"}],\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product//436/13309\"},\"type\":\"ref\",\"id\":\"3547AEGfZekCY60ysx4vo\"},{\"text\":\"의 지침에 따라 COS 버킷을 생성합니다.\"}],\"type\":\"p\",\"id\":\"kNpGbiu09Ttiafj6ZYimz\"},{\"children\":[{\"text\":\"일부 애플리케이션에는 버킷 생성 프로세스가 내장되어 있습니다. 이러한 애플리케이션이 버킷을 생성하도록 하려면 이 단계를 생략할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"rmdmK-WfneI6TMFiYY_um\"},{\"children\":[{\"text\":\"애플리케이션에서 COS 서비스 설정\"}],\"nodeId\":\".EC.95.A0.ED.94.8C.EB.A6.AC.EC.BC.80.EC.9D.B4.EC.85.98.EC.97.90.EC.84.9C-cos-.EC.84.9C.EB.B9.84.EC.8A.A4-.EC.84.A4.EC.A0.95\",\"type\":\"h2\",\"id\":\"WVqmxzGt_kcyfWUp8Z91k\"},{\"children\":[{\"text\":\"기본 설정\"}],\"nodeId\":\".EA.B8.B0.EB.B3.B8-.EC.84.A4.EC.A0.95\",\"type\":\"h3\",\"id\":\"Am-iBzWHFrZD5Eovp3kHb\"},{\"children\":[{\"text\":\"대부분의 애플리케이션에는 스토리지 서비스를 사용하기 위한 유사한 구성 항목이 있습니다. 이러한 구성 항목의 일반 이름과 설명은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"6xSBoStmnc6goIhL8TE_A\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"dYr9dgbhrPA8iG0GqcFWN\"},{\"children\":[{\"text\":\"설정 과정에서 궁금한 점이 있으시면 \"},{\"children\":[{\"text\":\"고객센터\"}],\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/contact-sales\"},\"type\":\"ref\",\"id\":\"DtXVpgSGt8lEmekYlyXzN\"},{\"text\":\"로 문의하시기 바랍니다. 본 문서의 가이드를 따랐음을 표시하고 애플리케이션 이름 및 스크린샷과 같은 정보를 제공하십시오.\"}],\"type\":\"p\",\"id\":\"heknq5FBZZyKmKfrzgYQB\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"4rEeUyhP_WRrDfx1PWMSv\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설정 항목에서 흔히 볼 수 있는 이름\"}],\"type\":\"p\",\"id\":\"mFwj6j1xf3OkCg8oW6Siq\"}],\"type\":\"cell\",\"id\":\"863qmi7lRQGodlPt9SBkB\"},{\"children\":[{\"children\":[{\"text\":\"관련 설명\"}],\"type\":\"p\",\"id\":\"b_ghdRHaF51dFY8NpoRcs\"}],\"type\":\"cell\",\"id\":\"XL9ixphixgUVR0jLvDCkI\"}],\"type\":\"row\",\"id\":\"mdJ0lYGLQljs0-_KJ-ggj\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"공급자/서비스 공급자/\"},{\"text\":\"스토리지 서비스 공급자/\"},{\"text\":\"Service Provider/\"},{\"text\":\"Storage Provider/\"},{\"text\":\"Provider 등\"}],\"type\":\"p\",\"id\":\"K8wdnuIh3tmXRc7mlFX1s\"}],\"type\":\"cell\",\"id\":\"R4Yq3bSpSem_OKnt1XjDS\"},{\"children\":[{\"children\":[{\"text\":\"애플리케이션이 사용해야 할 스토리지를 선택할 때 다음과 같은 상황이 있을 수 있습니다.\"}],\"type\":\"p\",\"id\":\"34YpxjYbnVuH803k_fycL\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\",\"id\":\"EgF6vRprVAYfLyPk-4fUm\"},{\"children\":[{\"text\":\"선택 항목에 S3 Compatible Storage/S3 Compatible과 같은 텍스트가 있는 경우 해당 옵션이 먼저 사용됩니다.\"}],\"type\":\"p\",\"id\":\"W8NJc6uaYKsP-iy0sym12\"},{\"children\":[{\"text\":\"선택 항목에 amazon web services/AWS/Amazon S3와 같은 텍스트만 있는 경우 이를 사용하되 구성하는 동안 추가 지침에 주의하십시오.\"}],\"type\":\"p\",\"id\":\"v15hfU2unT8rrjZlgCMI_\"},{\"children\":[{\"text\":\"비슷한 선택 항목이 없지만 애플리케이션 설명에 애플리케이션이 S3 서비스 또는 S3 호환 서비스를 지원한다고 언급하는 경우 아래 구성을 계속할 수 있지만 추가 지침에도 주의해야 합니다.\"}],\"type\":\"p\",\"id\":\"sCGQICQwfVicsZP35WSqC\"},{\"children\":[{\"text\":\"기타 다른 경우에는 애플리케이션이 COS를 사용하지 못할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"4N86kymfuX2u3BXvEqFZw\"}],\"type\":\"cell\",\"id\":\"uuUs4qI9rjEuMmG7Cif47\"}],\"type\":\"row\",\"id\":\"mrBaqou57DgozI8GyO3mT\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"서버/서버 주소/서비스 URL/Endpoint/Custom Endpoint/Server URL 등\"}],\"type\":\"p\",\"id\":\"hEweoX1tn5a2b7vH9KXOg\"}],\"type\":\"cell\",\"id\":\"RxdOFUw9ZQJICII34dYdI\"},{\"children\":[{\"children\":[{\"text\":\"여기에는 S3 호환 서비스의 서비스 주소를 입력합니다. COS 서비스를 사용할 경우, COS의 서비스 주소를 다음 형식으로 입력합니다:\"}],\"type\":\"p\",\"id\":\"KFIDD_n9fVG9gxSvohGzh\"},{\"type\":\"p\",\"id\":\"cWwj5nVhrrwV7tXI6E1CL\",\"children\":[{\"text\":\"cos..myqcloud.com\",\"code\":1},{\"text\":\" 또는 \"},{\"text\":\"https://cos..myqcloud.com\",\"code\":1},{\"text\":\"입니다.\"}]},{\"type\":\"p\",\"id\":\"1Dw2QQ5L8QcU196Nt05IC\",\"children\":[{\"text\":\"https://\",\"code\":1},{\"text\":\"를 입력해야 할지 여부는 특정 애플리케이션에 따라 다르므로, 직접 시도해 보실 수 있습니다. 여기서 \"},{\"text\":\"\",\"code\":1},{\"text\":\"은 COS의 \"},{\"id\":\"QjbEfzCVidSZcckApuimq\",\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/6224\"},\"children\":[{\"text\":\"사용 가능 지역\"}]},{\"text\":\"을 나타냅니다.\"}]},{\"type\":\"p\",\"id\":\"e9O4Ee42Z_qCQgblSsy6p\",\"children\":[{\"text\":\"애플리케이션 내에서는 지정된 서비스 주소의 지역에서만 버킷을 생성하거나 선택할 수 있습니다.\"}]},{\"type\":\"uli\",\"id\":\"NXV0K4XuSKQIUYThrC4Fb\",\"children\":[{\"text\":\"예를 들어, 버킷이 광저우 지역에 있다면 서비스 주소는 \"},{\"text\":\"cos.ap-guangzhou.myqcloud.com\",\"code\":1},{\"text\":\"으로 설정해야 합니다. 다른 지역으로 설정하면 애플리케이션 내에서 광저우 지역의 버킷을 찾을 수 없습니다.\"}]},{\"type\":\"uli\",\"id\":\"XPUzdp2m8yFsBRJ_U7S4C\",\"children\":[{\"text\":\"애플리케이션의 서비스 제공자에서 Amazon S3만 선택할 수 있고 서비스 엔드포인트가 구성 가능하다면, 앞서 언급한 \"},{\"text\":\"cos..myqcloud.com\",\"code\":1},{\"text\":\" 또는 \"},{\"text\":\"https://cos..myqcloud.com\",\"code\":1},{\"text\":\"으로 변경할 수 있습니다.\"}]},{\"type\":\"uli\",\"id\":\"npjb33GSd9WDNg3pT49Qt\",\"children\":[{\"text\":\"서비스 엔드포인트가 구성할 수 없거나 서비스 엔드포인트 구성 항목이 없다면, 애플리케이션은 COS 서비스를 사용할 수 없습니다.\"}]}],\"type\":\"cell\",\"id\":\"mHncrhlG5UDMR126GL4iP\"}],\"type\":\"row\",\"id\":\"4zcX5y1tuLtjJ3BzaNWe1\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Access Key/Access Key ID 등\"}],\"type\":\"p\",\"id\":\"EAdkbuvCd9vAiRMVFxo_N\"}],\"type\":\"cell\",\"id\":\"xcuBCxVpiGCkzx34a63Oj\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"4단계\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"#step4\"},\"type\":\"ref\",\"id\":\"Txvru6hqiRiHKdVQY4gKr\"},{\"text\":\"에서 기록된 \"},{\"text\":\"SecretId\"},{\"text\":\"를 입력하십시오.\"}],\"type\":\"p\",\"id\":\"MXc4Yq6_lxytmh4N0ZOXl\"}],\"type\":\"cell\",\"id\":\"38BCrJHHd-85jY8Uj_7Sd\"}],\"type\":\"row\",\"id\":\"0cuQg5zZjUPigQ0v44IqS\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Secret Key/Secret/\"},{\"text\":\"Secret Access Key 등\"}],\"type\":\"p\",\"id\":\"DLx3lTlf6SKidmn772vuR\"}],\"type\":\"cell\",\"id\":\"-6tm7hhwG37s3N1QvwmaB\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"4단계\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"#step4\"},\"type\":\"ref\",\"id\":\"ih6a4WCkdF4YI9OjcxeVC\"},{\"text\":\"에서 기록된 \"},{\"text\":\"SecretKey\"},{\"text\":\"를 입력하십시오.\"}],\"type\":\"p\",\"id\":\"ARKFrSPn_UIdMYs5BGDTq\"}],\"type\":\"cell\",\"id\":\"SEJjSijc5W4UJ1Ursagm5\"}],\"type\":\"row\",\"id\":\"azUMxSWzLTPx0d4wi0q2O\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"리전/Region 등\"}],\"type\":\"p\",\"id\":\"CcLyxwuhltwGhNnoeCsIW\"}],\"type\":\"cell\",\"id\":\"OJ9gB-QbFvpTfcTMaibSg\"},{\"children\":[{\"children\":[{\"text\":\"기본값, 자동, Auto 또는 Automatic을 선택합니다.\"}],\"type\":\"p\",\"id\":\"b80Pmf53FmheTbx7XtQmI\"}],\"type\":\"cell\",\"id\":\"fBR1td9tAT-3nI7VBOt20\"}],\"type\":\"row\",\"id\":\"K0p0DxPGq8CU-6TrP_ax8\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"버킷/Bucket 등\"}],\"type\":\"p\",\"id\":\"2MFqczMHots7kRqLQcW-S\"}],\"type\":\"cell\",\"id\":\"G-0oOz_hWNTE7jN0Gd8Su\"},{\"children\":[{\"children\":[{\"text\":\"기존의 버킷 이름을 선택 또는 입력합니다. 포맷은 \"},{\"text\":\"\"},{\"text\":\"입니다(예: \"},{\"text\":\"examplebucket-1250000000\"},{\"text\":\"). 이 중 \"},{\"text\":\"BucketName\"},{\"text\":\"은 \"},{\"children\":[{\"text\":\"5단계\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"#step5\"},\"type\":\"ref\",\"id\":\"TrHWBR_WSk_ECJ40pB4BS\"},{\"text\":\"에서 버킷 생성 시 입력한 버킷 이름이며, \"},{\"text\":\"APPID\"},{\"text\":\"는 \"},{\"children\":[{\"text\":\"4단계\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"#step4\"},\"type\":\"ref\",\"id\":\"o9tE_jC0tAoakfXJQYi0g\"},{\"text\":\"에서 기록한 \"},{\"text\":\"APPID\"},{\"text\":\"입니다.\"},{\"text\":\"위의 설명과 마찬가지로 이곳의 버킷은 서버 주소가 지정한 리전에 한정되어 있으며, 기타 리전의 버킷은 나열되지 않거나 정상적인 사용이 불가능합니다. 새로운 버킷을 생성해야 하는 경우 새로 생성된 버킷 이름도 위의 \"},{\"text\":\"\"},{\"text\":\" 포맷에 부합해야 합니다. 그렇지 않으면 정상적으로 버킷을 생성할 수 없습니다.\"}],\"type\":\"p\",\"id\":\"16SDbqGrdS_GJQpaZ8VIX\"}],\"type\":\"cell\",\"id\":\"mC6-Xa63mginbLoaV-GJb\"}],\"type\":\"row\",\"id\":\"-FBzCkCFxcGSLf7ub9jPQ\"}],\"rowHeader\":true,\"type\":\"table\",\"widths\":[30,70],\"id\":\"3p9EV4CleDPxN-fDdDqXz\",\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\",\"id\":\"j20MXVfYBdz7wzeMVkjt8\"},{\"children\":[{\"text\":\"기타 항목 및 고급 설정 설명\"}],\"nodeId\":\".EA.B8.B0.ED.83.80-.ED.95.AD.EB.AA.A9-.EB.B0.8F-.EA.B3.A0.EA.B8.89-.EC.84.A4.EC.A0.95-.EC.84.A4.EB.AA.85\",\"type\":\"h3\",\"id\":\"w7-hAPnkTH58Aep1AjDag\"},{\"children\":[{\"text\":\"일부 애플리케이션은 위의 기본 설정 외에도 기타 항목 및 고급 설정이 더 있습니다. 애플리케이션에서 COS 서비스를 원활하게 사용할 수 있도록 아래 일부 COS의 기능 설명을 추가합니다.\"}],\"type\":\"p\",\"id\":\"RugwI5jUYFVJuvv7M65-f\"},{\"children\":[{\"text\":\"서버 포트와 프로토콜\\nCOS 서비스가 지원하는 HTTP 프로토콜과 HTTPS 프로토콜은 모두 프로토콜의 기본 포트인 80과 443 포트를 사용합니다. 보안상의 이유로 HTTPS 프로토콜을 통한 COS 서비스 사용을 권장합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"SWL3SlwiNp5sVQmXfLH_C\"},{\"children\":[{\"text\":\"COS는 Virtual Hosted-Style 스타일을 지원합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"hwtdPwDAVJyFo2NCwPD29\"},{\"type\":\"hint\",\"hintType\":\"alert\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"주의:\"}],\"id\":\"xyakj-UNB_wAD2tfjqmok\"},{\"type\":\"p\",\"children\":[{\"text\":\"2024년 1월 1일 이후에 생성된 버킷은 경로 스타일 도메인 이름을 지원하지 않으며, 가상 호스트 스타일 도메인 이름만 지원합니다. 이전에 생성된 버킷은 영향을 받지 않지만, 가상 호스트 스타일 도메인 이름을 우선적으로 사용하는 것이 좋습니다.\"}],\"id\":\"79-QXQ3zjrdiZhMYTzGgw\"}],\"id\":\"z_NUy0_Dwhfn6QzaxMmpW\"},{\"children\":[{\"text\":\"AWS V2 서명과 AWS V4 서명\\nCOS는 두 종류의 서명 포맷을 모두 지원합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"o1SbuySh2WRKS8qvrEGFQ\"},{\"children\":[{\"text\":\"결론\"}],\"nodeId\":\".EA.B2.B0.EB.A1.A0\",\"type\":\"h2\",\"id\":\"qV3fKBCrYZzDaxzSXHGGV\"},{\"children\":[{\"text\":\"COS는 S3와의 완전한 호환성을 보장하지 않습니다. 애플리케이션에서 COS 사용 시 질문이 있는 경우 \"},{\"children\":[{\"text\":\"고객센터\"}],\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/contact-sales\"},\"type\":\"ref\",\"id\":\"Ekb8McTeTc0C_qv7EYVsC\"},{\"text\":\"에 도움을 요청하십시오. 본 문서의 가이드를 따랐음을 표시하고 애플리케이션 이름 및 스크린샷과 같은 정보를 제공하십시오.\"}],\"type\":\"p\",\"id\":\"sIov-tHlbftORXX86Lpnu\"}]"}},"35263":{"categoryId":436,"weight":90,"type":"page","extension":"","pid":33125,"id":35263,"lang":"ko","title":"클라우드 데이터 백업","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-03 22:53:43","recentReleaseTime":"2021-03-03 22:53:43","content":{"title":"클라우드 데이터 백업","body":"

소개

본 문서에서는 클라우드에 보관된 데이터를 백업하는 방법을 개략적으로 소개합니다. Tencent Cloud COS는 사용자에게 COS에 보관된 데이터를 편리하게 백업할 수 있는 다음의 세 가지 방법을 제공합니다.
리전 간 복제 기반의 재해 복구 백업 솔루션
데이터 일괄 복제 솔루션(COS의 일괄 프로세스 기능)
데이터 마이그레이션 툴 MSP를 기반으로 한 마이그레이션 백업 솔루션

리전 간 복제 기반의 재해 복구 백업 솔루션

리전 간 복제 기능은 버킷의 설정 항목 중 하나로, 리전 간 복제 규칙을 설정하여 상이한 스토리지 리전에 있는 버킷에서 증분 객체를 비동기화하여 자동으로 복제합니다. 리전 간 복제를 활성화하면 COS에서 원본 버킷의 객체 콘텐츠(예: 객체 메타데이터 및 버전 ID 등)를 타깃 버킷으로 정확하게 복제하며, 복제한 객체의 복제본은 완전히 동일한 속성 정보를 지닙니다.

적용 시나리오

원격 재해 복구: COS는 객체 데이터에 99.999999999%의 가용성을 제공하지만 전쟁, 자연재해와 같은 불가항력적 요인으로 인해 데이터 유실이 발생할 수 있습니다. 데이터 유실로 인한 손해를 방지하려면 다른 리전에 데이터 복제본을 마련해 두는 것이 좋습니다. 리전 간 복제를 통해 데이터의 원격 재해 복구를 실행할 수 있으며, 특정 데이터센터가 불가항력적 요인으로 파손되어도 다른 리전의 데이터센터를 통해 사본 데이터를 제공받을 수 있습니다.
컴플라이언스 요건: COS는 기본적으로 물리적 디스크 안 데이터의 여러 복제본과 이레이저 코딩 등을 제공(기본값)하는 방법으로 데이터 가용성을 보장합니다. 일부 업종의 경우, 컴플라이언스 요건에 따라 타 버킷 리전에 데이터 복제본을 보관해야 합니다. 이런 경우, 리전 간 복제를 활성화함으로써 리전 간 데이터 복제를 실행하고, 컴플라이언스 요건을 충족할 수 있습니다.
액세스 딜레이 감소: 사용자의 계정이 타 지역에서 객체에 액세스하는 경우, 리전 간 복제를 통해 사용자의 위치와 가장 가깝고 사용 가능한 버킷 리전에 객체의 복제본을 마련할 수 있습니다. 이를 통해 액세스 딜레이를 최소화하고, 더 나은 사용자 환경을 제공할 수 있습니다.
작업적 요인: 두 개의 다른 리전에 모두 컴퓨팅 클러스터를 보유하고 있으며, 이 컴퓨팅 클러스터에서 동일한 데이터를 처리해야 할 경우, 리전 간 복제를 이용해 두 리전의 객체 복제본을 관리할 수 있습니다.
데이터 마이그레이션 및 백업: 비즈니스의 향후 상황에 따라 비즈니스 데이터를 가용 리전 간 복제를 통해 데이터 마이그레이션과 데이터 백업을 구현할 수 있습니다.

사용 방법

리전 간 복제 설정에 관한 콘솔 문서를 참조하십시오.

데이터 일괄 복제 솔루션

COS의 일괄 프로세스 기능으로 객체 레벨에 대한 대량 복제 작업을 일괄적으로 처리할 수 있습니다.

적용 시나리오

일부 비지니스 상의 이유로 데이터의 가용성과 신뢰성 확보를 위해 기존 버킷에 보관된 모든 데이터를 타 버킷에 백업해야 할 수도 있습니다.

사용 방법

일괄 프로세스에 관한 콘솔 문서를 참조하십시오.

사용 설명

객체를 일괄 복제하려면 리스트 기능을 함께 적용해야 합니다. 리스트에 관한 내용은 리스트 기능 개요를 참조하십시오. 객체를 지정하여 원본 버킷에서 타깃 버킷으로 일괄 복제할 수 있으며, 타깃 버킷이 속한 리전은 같거나 다를 수 있습니다. 객체를 일괄 복제할 때 복제본의 메타데이터 정보나 스토리지 유형과 같은 정보에 영향을 미치는 PUT Object - copy 관련 매개변수를 사용자 정의할 수 있습니다. PUT Object-copy에 관한 자세한 내용은 PUT Object - copy를 참조하십시오.
주의:
처리할 모든 객체는 동일한 버킷에 보관되어 있어야 합니다.
일괄 프로세스 1회 작업 시 한 개의 타깃 버킷을 설정할 수 있습니다.
원본 버킷에서 객체를 읽어오는 권한과 타깃 버킷으로 객체를 입력하는 권한이 있어야 합니다.
처리할 객체의 크기는 5GB를 초과할 수 없습니다.
ETags 검사 및 사용자 지정 키에 의한 서버 암호화를 지원하지 않습니다.
타깃 버킷에 버전 제어 기능이 활성화되지 않았으며, 동일한 이름의 객체 파일이 존재하는 경우, COS는 객체 파일 덮어쓰기 작업을 실행합니다.

데이터 마이그레이션 백업 솔루션

Tencent Cloud의 MSP는 보다 편리하고 신속한 리소스 마이그레이션 솔루션을 제공합니다. 사용자는 마이그레이션 작업을 실행한 뒤 마이그레이션 서비스 콘솔에서 마이그레이션 진도, 마이그레이션 보고서와 같은 정보를 확인할 수 있습니다. 자세한 이용 방법은 Tencent Cloud COS 간 마이그레이션을 참조하십시오.
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"doujNZkrxVwihUrGJv4-o\"},{\"children\":[{\"text\":\"본 문서에서는 클라우드에 보관된 데이터를 백업하는 방법을 개략적으로 소개합니다. Tencent Cloud COS는 사용자에게 COS에 보관된 데이터를 편리하게 백업할 수 있는 다음의 세 가지 방법을 제공합니다.\"}],\"type\":\"p\",\"id\":\"EXGL4SjHgMsaep7xhJOKC\"},{\"children\":[{\"text\":\"리전 간 복제 기반의 재해 복구 백업 솔루션\"}],\"start\":false,\"type\":\"uli\",\"id\":\"7rbr6TnSlahwBdmafkuLT\"},{\"children\":[{\"text\":\"데이터 일괄 복제 솔루션(COS의 일괄 프로세스 기능)\"}],\"start\":false,\"type\":\"uli\",\"id\":\"dwj1dzNQXMrarIUSuZ5Pk\"},{\"children\":[{\"text\":\"데이터 마이그레이션 툴 MSP를 기반으로 한 마이그레이션 백업 솔루션\"}],\"start\":false,\"type\":\"uli\",\"id\":\"IMdkyKjy2puv966mHdLgx\"},{\"children\":[{\"text\":\"리전 간 복제 기반의 재해 복구 백업 솔루션\"}],\"nodeId\":\".EB.A6.AC.EC.A0.84-.EA.B0.84-.EB.B3.B5.EC.A0.9C-.EA.B8.B0.EB.B0.98.EC.9D.98-.EC.9E.AC.ED.95.B4-.EB.B3.B5.EA.B5.AC-.EB.B0.B1.EC.97.85-.EC.86.94.EB.A3.A8.EC.85.98\",\"type\":\"h2\",\"id\":\"rokSM3lmCReAk_oFkykJB\"},{\"children\":[{\"text\":\"리전 간 복제 기능은 버킷의 설정 항목 중 하나로, 리전 간 복제 규칙을 설정하여 상이한 스토리지 리전에 있는 버킷에서 \"},{\"b\":1,\"text\":\"증분 객체\"},{\"text\":\"를 비동기화하여 자동으로 복제합니다. 리전 간 복제를 활성화하면 COS에서 원본 버킷의 객체 콘텐츠(예: 객체 메타데이터 및 버전 ID 등)를 타깃 버킷으로 정확하게 복제하며, 복제한 객체의 복제본은 완전히 동일한 속성 정보를 지닙니다.\"}],\"type\":\"p\",\"id\":\"vtmvP3M6Dge4PpkHve2rK\"},{\"children\":[{\"text\":\"자세한 내용은 \"},{\"children\":[{\"text\":\"리전 간 복제 기반의 재해 복구 고가용성 아키텍처\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/32535\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/32535\"},\"type\":\"ref\",\"id\":\"w0pfLE2ghThE-ZHRj9GkB\"},{\"text\":\"를 참조하십시오.\"}],\"type\":\"p\",\"id\":\"bxS-V3e7cEQIdWq64E5M2\"},{\"children\":[{\"text\":\"적용 시나리오\"}],\"nodeId\":\".EC.A0.81.EC.9A.A9-.EC.8B.9C.EB.82.98.EB.A6.AC.EC.98.A4\",\"type\":\"h4\",\"id\":\"F2MDu-Lq01rLXuiCAHkR-\"},{\"children\":[{\"b\":1,\"text\":\"원격 재해 복구:\"},{\"text\":\" COS는 객체 데이터에 99.999999999%의 가용성을 제공하지만 전쟁, 자연재해와 같은 불가항력적 요인으로 인해 데이터 유실이 발생할 수 있습니다. 데이터 유실로 인한 손해를 방지하려면 다른 리전에 데이터 복제본을 마련해 두는 것이 좋습니다. 리전 간 복제를 통해 데이터의 원격 재해 복구를 실행할 수 있으며, 특정 데이터센터가 불가항력적 요인으로 파손되어도 다른 리전의 데이터센터를 통해 사본 데이터를 제공받을 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"ni-skuAQ3K7cRgUNFxI76\"},{\"children\":[{\"b\":1,\"text\":\"컴플라이언스 요건:\"},{\"text\":\" COS는 기본적으로 물리적 디스크 안 데이터의 여러 복제본과 이레이저 코딩 등을 제공(기본값)하는 방법으로 데이터 가용성을 보장합니다. 일부 업종의 경우, 컴플라이언스 요건에 따라 타 버킷 리전에 데이터 복제본을 보관해야 합니다. 이런 경우, 리전 간 복제를 활성화함으로써 리전 간 데이터 복제를 실행하고, 컴플라이언스 요건을 충족할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"vZ1F1utKCMNUMTmwgKRM3\"},{\"children\":[{\"b\":1,\"text\":\"액세스 딜레이 감소:\"},{\"text\":\" 사용자의 계정이 타 지역에서 객체에 액세스하는 경우, 리전 간 복제를 통해 사용자의 위치와 가장 가깝고 사용 가능한 버킷 리전에 객체의 복제본을 마련할 수 있습니다. 이를 통해 액세스 딜레이를 최소화하고, 더 나은 사용자 환경을 제공할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"KiYA5kWTT1JsgNuxdMRCD\"},{\"children\":[{\"b\":1,\"text\":\"작업적 요인:\"},{\"text\":\" 두 개의 다른 리전에 모두 컴퓨팅 클러스터를 보유하고 있으며, 이 컴퓨팅 클러스터에서 동일한 데이터를 처리해야 할 경우, 리전 간 복제를 이용해 두 리전의 객체 복제본을 관리할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"rHg_JymuNNlz9LWfMdCMA\"},{\"children\":[{\"b\":1,\"text\":\"데이터 마이그레이션 및 백업:\"},{\"text\":\" 비즈니스의 향후 상황에 따라 비즈니스 데이터를 가용 리전 간 복제를 통해 데이터 마이그레이션과 데이터 백업을 구현할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"7yzTg93uGGfuyM9gHai_z\"},{\"children\":[{\"text\":\"사용 방법\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9-.EB.B0.A9.EB.B2.95\",\"type\":\"h4\",\"id\":\"kPsSnhKps4uWoGMphPFUL\"},{\"children\":[{\"children\":[{\"text\":\"리전 간 복제 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/19235\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/19235\"},\"type\":\"ref\",\"id\":\"2o7yYKvKQ9sZKZI23ImLg\"},{\"text\":\"에 관한 콘솔 문서를 참조하십시오.\"}],\"type\":\"p\",\"id\":\"d2KOM1iasskkcEZKwj3JX\"},{\"children\":[{\"text\":\"데이터 일괄 복제 솔루션\"}],\"nodeId\":\".EB.8D.B0.EC.9D.B4.ED.84.B0-.EC.9D.BC.EA.B4.84-.EB.B3.B5.EC.A0.9C-.EC.86.94.EB.A3.A8.EC.85.98\",\"type\":\"h2\",\"id\":\"X-dM4BTIcOU6IOTKlAW1G\"},{\"children\":[{\"text\":\"COS의 일괄 프로세스 기능으로 객체 레벨에 대한 대량 복제 작업을 일괄적으로 처리할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"DfM6sgQiy52fNrFTrbmIj\"},{\"children\":[{\"text\":\"적용 시나리오\"}],\"nodeId\":\".EC.A0.81.EC.9A.A9-.EC.8B.9C.EB.82.98.EB.A6.AC.EC.98.A42\",\"type\":\"h4\",\"id\":\"I6AVEr3RpqC1Fps0cCw-B\"},{\"children\":[{\"text\":\"일부 비지니스 상의 이유로 데이터의 가용성과 신뢰성 확보를 위해 기존 버킷에 보관된 모든 데이터를 타 버킷에 백업해야 할 수도 있습니다.\"}],\"type\":\"p\",\"id\":\"9pqOQKx165Pw3itgES5Op\"},{\"children\":[{\"text\":\"사용 방법\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9-.EB.B0.A9.EB.B2.952\",\"type\":\"h4\",\"id\":\"5OKa22Nkz4E7BsUozS5dB\"},{\"children\":[{\"children\":[{\"text\":\"일괄 프로세스\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/32956\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/32956\"},\"type\":\"ref\",\"id\":\"aH7ciYsmr4OpcbapAR4a7\"},{\"text\":\"에 관한 콘솔 문서를 참조하십시오.\"}],\"type\":\"p\",\"id\":\"ZED5aROdMUlScXNa55hAI\"},{\"children\":[{\"text\":\"사용 설명\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9-.EC.84.A4.EB.AA.85\",\"type\":\"h4\",\"id\":\"rNuzN_J4o6VQ_OYwgTdi8\"},{\"children\":[{\"text\":\"객체를 일괄 복제하려면 리스트 기능을 함께 적용해야 합니다. 리스트에 관한 내용은 \"},{\"children\":[{\"text\":\"리스트 기능 개요\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/30622\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/30622\"},\"type\":\"ref\",\"id\":\"9TQ2GDsAoJGS0zxCVu6Ev\"},{\"text\":\"를 참조하십시오. 객체를 지정하여 원본 버킷에서 타깃 버킷으로 일괄 복제할 수 있으며, 타깃 버킷이 속한 리전은 같거나 다를 수 있습니다. 객체를 일괄 복제할 때 복제본의 메타데이터 정보나 스토리지 유형과 같은 정보에 영향을 미치는 PUT Object - copy 관련 매개변수를 사용자 정의할 수 있습니다. PUT Object-copy에 관한 자세한 내용은 \"},{\"children\":[{\"text\":\"PUT Object - copy\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/10881\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/10881\"},\"type\":\"ref\",\"id\":\"yAYBgkPBZ8QCZEb5oHicq\"},{\"text\":\"를 참조하십시오.\"}],\"type\":\"p\",\"id\":\"WmzJ-plVSwHPIUxQB6MHl\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\",\"id\":\"CaCwiXOh95kpYn73UFlpf\"}],\"type\":\"p\",\"id\":\"XgqhSHMFjZQmTHcf5Y1QC\"},{\"type\":\"uli\",\"id\":\"fJABYgcO9ayuikuf-Bc-S\",\"children\":[{\"text\":\"처리할 모든 객체는 동일한 버킷에 보관되어 있어야 합니다.\"}]},{\"type\":\"uli\",\"children\":[{\"text\":\"일괄 프로세스 1회 작업 시 한 개의 타깃 버킷을 설정할 수 있습니다.\"}],\"id\":\"rXPOy46rqybNGCNB0OXGv\"},{\"type\":\"uli\",\"children\":[{\"text\":\"원본 버킷에서 객체를 읽어오는 권한과 타깃 버킷으로 객체를 입력하는 권한이 있어야 합니다.\"}],\"id\":\"jH7J5LUC0CN_y4wuAtUil\"},{\"type\":\"uli\",\"children\":[{\"text\":\"처리할 객체의 크기는 5GB를 초과할 수 없습니다.\"}],\"id\":\"TTA5Yf81VsQJN4C2Levpx\"},{\"type\":\"uli\",\"children\":[{\"text\":\"ETags 검사 및 사용자 지정 키에 의한 서버 암호화를 지원하지 않습니다.\"}],\"id\":\"AfbreaIoV9B2XllRC8wUe\"},{\"type\":\"uli\",\"children\":[{\"text\":\"타깃 버킷에 버전 제어 기능이 활성화되지 않았으며, 동일한 이름의 객체 파일이 존재하는 경우, COS는 객체 파일 덮어쓰기 작업을 실행합니다.\"}],\"id\":\"sa7Gkl6fARZUvYXCMemBA\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"NpJ2bxsMWtQp_vJNg_-Ce\"},{\"children\":[{\"text\":\"데이터 마이그레이션 백업 솔루션\"}],\"nodeId\":\".EB.8D.B0.EC.9D.B4.ED.84.B0-.EB.A7.88.EC.9D.B4.EA.B7.B8.EB.A0.88.EC.9D.B4.EC.85.98-.EB.B0.B1.EC.97.85-.EC.86.94.EB.A3.A8.EC.85.98\",\"type\":\"h2\",\"id\":\"txD0KUjDDeTeyz-FAhmiV\"},{\"children\":[{\"text\":\"Tencent Cloud의 MSP는 보다 편리하고 신속한 리소스 마이그레이션 솔루션을 제공합니다. 사용자는 마이그레이션 작업을 실행한 뒤 마이그레이션 서비스 콘솔에서 마이그레이션 진도, 마이그레이션 보고서와 같은 정보를 확인할 수 있습니다. 자세한 이용 방법은 \"},{\"children\":[{\"text\":\"Tencent Cloud COS 간 마이그레이션\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1036/33184\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1036/33184\"},\"type\":\"ref\",\"id\":\"THfjwBWtq-X8DZZiOIv2c\"},{\"text\":\"을 참조하십시오.\"}],\"type\":\"p\",\"id\":\"qHCifGt_rhGXDrcJI9iLY\"}]"}},"35264":{"categoryId":436,"weight":55,"type":"page","extension":"","pid":33125,"id":35264,"lang":"ko","title":"로컬 데이터 백업","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-03 22:53:53","recentReleaseTime":"2021-03-03 22:53:53","content":{"title":"로컬 데이터 백업","body":"

소개

본 문서에서는 로컬 데이터를 클라우드에 업로드하여 백업하는 방법을 개략적으로 소개합니다. Tencent Cloud COS는 로컬 데이터를 COS 버킷으로 편리하게 백업할 수 있는 다음과 같은 방법을 지원합니다.
COSBrowser 파일 동기화 백업
COS Migration 온라인 마이그레이션 백업

파일 동기화 백업

COSBrowser는 Tencent Cloud COS가 출시한 클라우드 파일 관리용 시각화 인터페이스 툴로, COS 리소스 조회, 전송, 관리를 간편하고 인터랙티브하게 실현할 수 있습니다. 현재 COSBrowser는 데스크톱 버전 및 모바일 버전의 두 버전을 제공하며, 자세한 내용은 COSBrowser 소개를 참조하십시오.
COSBrowser의 데스크톱 버전은 파일 동기화 기능을 통합하여 로컬 폴더와 버킷을 연결함으로써 로컬 파일을 클라우드로 동기화하여 실시간 업로드할 수 있습니다.

\"\"



사용 방법

파일 동기화 사용 설명을 참조하십시오.

온라인 마이그레이션 방안

COS Migration은 COS의 데이터 마이그레이션 기능을 결합한 통합형 툴입니다. 간단한 설정만으로도 데이터를 COS로 빠르게 마이그레이션할 수 있습니다.

적용 시나리오

로컬 IDC를 보유한 사용자는 COS Migration을 통해 로컬 IDC의 대용량 데이터를 빠르게 COS로 마이그레이션할 수 있습니다.

사용 방법

COS 마이그레이션을 참조하십시오.

","recentReleaseTime":"2025-12-09 15:01:03","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"9UFwxb6jTOMXnyxCnjzpU\"},{\"children\":[{\"text\":\"본 문서에서는 로컬 데이터를 클라우드에 업로드하여 백업하는 방법을 개략적으로 소개합니다. Tencent Cloud COS는 로컬 데이터를 COS 버킷으로 편리하게 백업할 수 있는 다음과 같은 방법을 지원합니다.\"}],\"type\":\"p\",\"id\":\"RpnXZg_Rkak9e2L77UTwK\"},{\"children\":[{\"text\":\"COSBrowser 파일 동기화 백업\"}],\"start\":false,\"type\":\"uli\",\"id\":\"fsYtZjAnGwBZiWTagU1Ba\"},{\"children\":[{\"text\":\"COS Migration 온라인 마이그레이션 백업\"}],\"start\":false,\"type\":\"uli\",\"id\":\"HMG0IuFDJOGxwo9ABrx4o\"},{\"children\":[{\"text\":\"파일 동기화 백업\"}],\"nodeId\":\".ED.8C.8C.EC.9D.BC-.EB.8F.99.EA.B8.B0.ED.99.94-.EB.B0.B1.EC.97.85\",\"type\":\"h2\",\"id\":\"iRBQfiisQHW7YSTGEAZRD\"},{\"children\":[{\"text\":\"COSBrowser는 Tencent Cloud COS가 출시한 클라우드 파일 관리용 시각화 인터페이스 툴로, COS 리소스 조회, 전송, 관리를 간편하고 인터랙티브하게 실현할 수 있습니다. 현재 COSBrowser는 데스크톱 버전 및 모바일 버전의 두 버전을 제공하며, 자세한 내용은 \"},{\"children\":[{\"text\":\"COSBrowser 소개\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/11366\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/11366\"},\"type\":\"ref\",\"id\":\"P_Xe52gB71vrCF4QRfsrW\"},{\"text\":\"를 참조하십시오.\"}],\"type\":\"p\",\"id\":\"c_ihwmH_qiAi3DNIA6hXZ\"},{\"children\":[{\"text\":\"COSBrowser의 데스크톱 버전은 파일 동기화 기능을 통합하여 로컬 폴더와 버킷을 연결함으로써 로컬 파일을 클라우드로 동기화하여 실시간 업로드할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"fqHxwdkz9uX7ETGY0Zjo4\"},{\"children\":[{\"text\":\"\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/cc215b55d4b211f09f555254007c27c5.png\",\"id\":\"bIw-_y5bJfR_pjGki8BWz\",\"naturalSize\":[690,428],\"size\":[690,428]},{\"text\":\"\"}],\"type\":\"p\",\"id\":\"s23-mGuKdspfkCa6a3QdG\"},{\"children\":[{\"text\":\"사용 방법\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9-.EB.B0.A9.EB.B2.95\",\"type\":\"h4\",\"id\":\"4tZzRMKwJxPQeFcUFR3Gg\"},{\"children\":[{\"children\":[{\"text\":\"파일 동기화 사용 설명\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/32565#synchronization\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/32565#synchronization\"},\"type\":\"ref\",\"id\":\"6a2bNn6ao2e_L3kYy5biz\"},{\"text\":\"을 참조하십시오.\"}],\"type\":\"p\",\"id\":\"s9qwJklMZipV_heWG-Wb-\"},{\"children\":[{\"text\":\"온라인 마이그레이션 방안\"}],\"nodeId\":\".EC.98.A8.EB.9D.BC.EC.9D.B8-.EB.A7.88.EC.9D.B4.EA.B7.B8.EB.A0.88.EC.9D.B4.EC.85.98-.EB.B0.A9.EC.95.88\",\"type\":\"h2\",\"id\":\"n9DrdQ90LOmdxM9sPJuK2\"},{\"children\":[{\"text\":\"COS Migration은 COS의 데이터 마이그레이션 기능을 결합한 통합형 툴입니다. 간단한 설정만으로도 데이터를 COS로 빠르게 마이그레이션할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"ZrkIJGfchB_gv5d6eQ6PI\"},{\"children\":[{\"text\":\"적용 시나리오\"}],\"nodeId\":\".EC.A0.81.EC.9A.A9-.EC.8B.9C.EB.82.98.EB.A6.AC.EC.98.A4\",\"type\":\"h4\",\"id\":\"TsOBneuV_-LYcRGReOI1I\"},{\"children\":[{\"text\":\"로컬 IDC를 보유한 사용자는 COS Migration을 통해 로컬 IDC의 대용량 데이터를 빠르게 COS로 마이그레이션할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"T9aqJTzrDkioZpVbsWt_D\"},{\"children\":[{\"text\":\"사용 방법\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9-.EB.B0.A9.EB.B2.952\",\"type\":\"h4\",\"id\":\"kOZUyHtpWjSkMn3dzWr2F\"},{\"children\":[{\"children\":[{\"text\":\"COS 마이그레이션\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/32974#cos\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/32974#cos\"},\"type\":\"ref\",\"id\":\"6HXNB6mraHhhvXbU-faqX\"},{\"text\":\"을 참조하십시오.\"}],\"type\":\"p\",\"id\":\"hI6SH4sfyRJ0pNReWi8QC\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\",\"id\":\"hQLGMSEZfndrkvEIhghEQ\"}]"}},"35265":{"categoryId":436,"weight":58,"type":"page","extension":"","pid":12473,"id":35265,"lang":"ko","title":"프런트엔드에서 COS로 다이렉트 업로드 시 임시 자격 증명 사용 보안 가이드","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-03 22:24:55","recentReleaseTime":"2021-03-03 22:24:55","content":{"title":"프런트엔드에서 COS로 다이렉트 업로드 시 임시 자격 증명 사용 보안 가이드","body":"

소개

모바일 애플리케이션 및 Web에서 iOS/Android/JavaScript SDK를 통해 프런트 엔드에서 직접 Cloud Object Storage(COS)에 요청을 전달할 수 있습니다. 이 때 데이터의 업로드 및 다운로드는 사용자의 백엔드 서버를 통하지 않아 백엔드 서버 대역폭 및 부하를 절감할 수 있으며, COS 대역폭과 글로벌 가속 등의 능력을 충분히 이용할 수 있어 사용자의 애플리케이션 경험을 향상시켜 줍니다.
실제 애플리케이션에서 임시 키를 프런트 엔드의 COS 요청 서명으로 사용하여 영구 키 노출 및 권한 없는 액세스 등의 문제를 방지할 수 있습니다. 그러나 임시 키를 사용한다 하더라도 임시 키 생성 시 너무 많은 권한 또는 경로를 지정하는 경우 마찬가지로 권한 없는 액세스 등의 문제가 발생할 수 있습니다. 이는 사용자의 애플리케이션에 일정의 리스크를 야기하며, 본 문서에서는 일부 리스크 사례에 대해 중점적으로 소개합니다. 사용자는 반드시 보안 규범을 준수하여 애플리케이션에서 안전하게 COS를 사용할 수 있도록 보장하십시오.

전제 조건

본 문서에서는 사용자가 임시 키와 관련한 개념을 충분히 이해하여 임시 키를 생성 및 사용할 수 있다는 전제하에 COS에 요청하는 방법을 설명합니다. 임시 키 생성 및 사용 가이드에 대한 자세한 내용은 임시 키 생성 및 사용 가이드 문서를 참고하십시오.
주의:
임시 키를 사용해 액세스 권한을 부여하는 경우, 반드시 업무 수요에 따라 최소 권한 부여를 원칙으로 권한을 부여해야 합니다. 직접 모든 리소스(resource:*) 또는 모든 작업(action:*)에 대한 권한을 부여하는 경우 권한 범위가 너무 커 데이터 보안에 대한 리스크가 발생할 수 있습니다.

참고 사례 및 보안 규범

참고 사례1: 리소스(resource)의 범위 제한 초과

애플리케이션 A에서 가입 사용자가 업로드하는 프로필 사진에 COS를 사용하고 있으며, 모든 가입 사용자의 프로필 사진이 고정된 객체 키 app/avatar/<Username>.jpg를 가지고 있고 동시에 서로 다른 크기의 프로필 사진이 포함되어 있습니다. 여기에서 백그라운드에서 사용하기 편리하도록 해당 객체 키를 각각 app/avatar/<Username>_m.jpgapp/avatar/<Username>_s.jpg로 나누고, 임시 키 생성 시 직접 resource를 qcs::cos:<Region>:uid/<APPID>:<BucketName-APPID>/app/avatar/*로 설정했습니다. 이때 악성 사용자가 네트워크 패킷 캡쳐 등의 수단을 사용하여 생성된 임시 키를 획득하면 업로드된 임의의 사용자 프로필 사진을 덮어쓸 수 있으며 권한을 초과한 액세스가 발생해 사용자의 합법적 프로필 사진 데이터가 덮어쓰기 되어 손실될 수 있습니다.

보안 규범

resource 는 임시 키가 액세스를 허용하는 리소스 경로를 대표하며, 이때 해당 경로에서 커버하는 최종 사용자를 고려해야 합니다. 원칙적으로 resource에서 지정하는 리소스는 단일 사용자만 사용할 수 있도록 요구합니다. 해당 사례에서 지정한 qcs::cos:<Region>:uid/<APPID>:<BucketName-APPID>/app/avatar/*는 명백하게 모든 사용자를 커버하고 있어 보안 취약점이 존재하게 됩니다.
해당 사례의 경우 사용자의 프로필 사진 경로를 app/avatar/<Username>/<size>.jpg로 수정하고, 이때 resource를 qcs::cos:<Region>:uid/<APPID>:<BucketName-APPID>/app/avatar/<Username>/*로 지정한다면 규범 요구를 만족할 수 있습니다. 이외에도 resource 필드는 숫자 조합 형식으로 여러 값을 전송할 수 있습니다. 따라서 명시적으로 여러 resource 값을 지정해 사용자가 액세스 권한을 가진 최종 리소스 경로를 완벽하게 한정할 수 있습니다. 예시는 다음과 같습니다.
"resource": [
"qcs::cos:<Region>:uid/<APPID>:<BucketName-APPID>/app/avatar/<Username>.jpg",
"qcs::cos:<Region>:uid/<APPID>:<BucketName-APPID>/app/avatar/<Username>_m.jpg",
"qcs::cos:<Region>:uid/<APPID>:<BucketName-APPID>/app/avatar/<Username>_s.jpg"
]

참고 사례2: 작업(action)의 범위 제한 초과

애플리케이션 B는 공유 포토월 기능을 제공하고 있으며, 모든 이미지는 app/photos/*에 저장됩니다. 클라이언트에서는 객체 조회(GET Bucket)와 객체 다운로드(GET Object) 작업이 동시에 필요하며, 백그라운드에서는 사용 편의를 위해 임시 키 생성 시 직접 action을 name/cos:*로 지정하였습니다. 이때 악성 사용자가 네트워크 패킷 캡쳐 등의 수단을 사용하여 생성된 임시 키를 획득하면 해당 리소스 경로 하의 모든 객체에 대해 모든 객체 작업(예: 업로드 및 삭제 등의 작업)을 실행할 수 있으며, 권한을 초과한 액세스가 발생해 데이터가 손실되고 온라인 비즈니스에 영향을 미칠 수 있습니다.

보안 규범

action은 임시 키가 요청을 허용하는 작업을 대표하며, 원칙적으로 name/cos:* 등을 사용한 모든 작업의 임시 키를 프런트 엔드에 전달하는 행위를 허용하지 않습니다. 반드시 모든 필요한 작업을 명확하게 나열해야 하며, 각 작업에 필요한 리소스 경로가 서로 다른 경우 병합 처리가 아닌 작업리소스 경로를 단독으로 매칭해야 합니다.
해당 사례에서는 "action": [ "name/cos:GetBucket", "name/cos:GetObject" ]를 사용하여 구체적인 작업을 명확하게 지정해야 합니다. 권한 부여 작업 가이드에 대한 사항은 COS API 권한 부여 정책 사용 가이드를 참고하십시오.

참고 사례3: 리소스와 작업의 범위 제한 초과

애플리케이션 C는 관리 툴을 제공하고 있으며, 사용자에게 모든 사용자들의 파일(app/files/*)을 조회하고 다운로드할 수 있도록 허용하고, 업로드 및 삭제는 개인 디렉터리의 파일(app/files/<Username>/*)만 작업할 수 있도록 제공합니다. 백그라운드에서의 사용 편의를 위해 임시 키 생성 시 해당 두 권한에 대해 4가지 작업(action)을 함께 혼합하여 사용합니다. 두 권한의 해당 리소스 경로 또한 혼합하여 함께 사용하며, 이때의 임시 키는 리소스 경로에서 지정한 권한보다 더 큰 권한을 가지게 됩니다. 즉, 모든 사용자들의 파일에 대한 조회, 다운로드, 업로드, 삭제 권한을 가지게 됩니다. 악성 사용자가 이에 따라 타인의 파일을 조작하거나 삭제할 수 있으며 권한을 초과한 액세스가 발생하여 사용자의 합법적 데이터가 유출될 리스크가 있습니다.

보안 규범

여러 action과 resource의 조합은 간단하게 이들을 각각 병합하는 방법을 사용해서는 안 되며, 여러 statement 형식으로 조합해야 합니다. 간단하게 각각 병합하는 경우 권한이 커질 수 있습니다.
해당 사례에서는 반드시 아래와 같이 사용해야 합니다.
"statement": [
{
"effect": "allow",
"action": [
"name/cos:GetBucket",
"name/cos:GetObject"
],
"resource": "qcs::cos:<Region>:uid/<APPID>:<BucketName-APPID>/app/files/*"
},
{
"effect": "allow",
"action": [
"name/cos:PutObject",
"name/cos:DeleteObject"
],
"resource": "qcs::cos:<Region>:uid/<APPID>:<BucketName-APPID>/app/files/<Username>/*"
}
]

참고 사례4: 권한을 초과한 임시 키 획득

애플리케이션 D는 포럼 애플리케이션을 제공하고 있으며, 포럼의 포스팅 첨부파일이 COS에 저장됩니다. 해당 포럼 애플리케이션은 각 사용자 레벨별로 포스팅 수가 일정 임계값에 도달하여 활성화된 사용자만 특정 페이지 내의 포스팅과 첨부파일을 볼 수 있도록 제공하고, 일부 공개 페이지는 모든 사용자가 해당 페이지 내의 포스팅과 첨부 파일을 볼 수 있습니다.\nCOS 사용 시, 백그라운드의 임시 키 생성 인터페이스는 프런트 엔드가 전송하는 페이지 ID에 따라 해당 페이지의 첨부파일에 대한 다운로드를 허용하는 임시 키를 생성합니다. 그러나 실현 과정에서 백그라운드에서 요청 사용자가 지정 페이지 ID 액세스 권한을 보유하고 있는지 여부를 판단할 수 없어 모든 사람이 해당 인터페이스를 요청하면 개인 페이지의 첨부파일에 대한 액세스 임시 키를 획득할 수 있게 됩니다. 이때 권한을 초과하는 액세스가 발생해 액세스를 제한하는 리소스에 대해 효과적으로 제한할 수 없게 되며 의도치 않은 데이터 유출 문제가 발생할 수 있습니다.

보안 규범

임시 키를 획득하는 인터페이스는 획득하는 임시 키 자체의 권한이 사전 설정된 범위 내여야 하며, 권한이 낮은 사용자가 높은 권한의 임시 키를 획득하지 못하도록 실제 업무 시나리오, 즉 권한이 정확한 사용자에 의해 요청되었는지 여부를 정확하게 판단해야 합니다.
본 사례에서는 백그라운드 인터페이스에서 반드시 현재 요청하는 사용자가 특정 페이지에 액세스할 수 있는 권한이 있는지 여부를 판단하여 액세스 권한이 없는 사용자에게 임시 키 반환을 허용하지 않아야 합니다.

결론

이상의 사례로 예상 외로 임시 키의 권한이 확대되어 발생할 수 있는 보안 리스크를 설명하였습니다. 프런트 엔드에서 직접 COS에 전송하는 경우, 악성 사용자가 비교적 쉽게 임시 키 내용을 획득할 수 있습니다. 따라서 개발자는 해당 시나리오의 경우 백그라운드를 통한 COS 액세스에 비해 권한 제어에 대해 더욱 유의해야 합니다.
본 문서에서의 보안 규범은 최소한의 권한 원칙으로, 실제 사용에서는 action과 resource에 따라 모든 가능한 권한을 나열할 수 있습니다. 예를 들어 action 3개, resource 2개가 있다면 액세스가 허용되는 리소스와 해당 작업을 3x2=6개로 산출할 수 있으며, 이에 따라 각 상황별로 예상에 부합하는지 여부를 평가하여 예상 권한 범위를 초과하는 경우 여러 statement를 나열하는 방식으로 권한을 분할하는 방법을 고려해야 합니다.
이외에도 임시 키 생성에 사용하는 인터페이스는 자체적으로 자격 인증과 인증 처리를 충분히 고려해야 합니다. 임시 키를 획득하는 행위가 안전하다면, 해당 방법으로 획득한 임시 키에 대해 진정한 보안이 실현되는 것입니다. 보안이라는 연결 고리에는 어떠한 소홀함도 있어서는 안 됩니다!
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"모바일 애플리케이션 및 Web에서 iOS/Android/JavaScript SDK를 통해 프런트 엔드에서 직접 Cloud Object Storage(COS)에 요청을 전달할 수 있습니다. 이 때 데이터의 업로드 및 다운로드는 사용자의 백엔드 서버를 통하지 않아 백엔드 서버 대역폭 및 부하를 절감할 수 있으며, COS 대역폭과 글로벌 가속 등의 능력을 충분히 이용할 수 있어 사용자의 애플리케이션 경험을 향상시켜 줍니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"실제 애플리케이션에서 임시 키를 프런트 엔드의 COS 요청 서명으로 사용하여 영구 키 노출 및 권한 없는 액세스 등의 문제를 방지할 수 있습니다. 그러나 임시 키를 사용한다 하더라도 임시 키 생성 시 너무 많은 권한 또는 경로를 지정하는 경우 마찬가지로 권한 없는 액세스 등의 문제가 발생할 수 있습니다. 이는 사용자의 애플리케이션에 일정의 리스크를 야기하며, 본 문서에서는 일부 리스크 사례에 대해 중점적으로 소개합니다. 사용자는 반드시 보안 규범을 준수하여 애플리케이션에서 안전하게 COS를 사용할 수 있도록 보장하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"전제 조건\"}],\"nodeId\":\".EC.A0.84.EC.A0.9C-.EC.A1.B0.EA.B1.B4\",\"type\":\"h2\"},{\"children\":[{\"text\":\"본 문서에서는 사용자가 임시 키와 관련한 개념을 충분히 이해하여 임시 키를 생성 및 사용할 수 있다는 전제하에 COS에 요청하는 방법을 설명합니다. 임시 키 생성 및 사용 가이드에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"임시 키 생성 및 사용 가이드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/14048\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/14048\"},\"type\":\"ref\"},{\"text\":\" 문서를 참고하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 임시 키를 사용해 액세스 권한을 부여하는 경우, 반드시 업무 수요에 따라 최소 권한 부여를 원칙으로 권한을 부여해야 합니다. 직접 모든 리소스(\"},{\"code\":1,\"text\":\"resource:*\"},{\"text\":\") 또는 모든 작업(\"},{\"code\":1,\"text\":\"action:*\"},{\"text\":\")에 대한 권한을 부여하는 경우 권한 범위가 너무 커 데이터 보안에 대한 리스크가 발생할 수 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"type\":\"hint\"},{\"children\":[{\"text\":\"참고 사례 및 보안 규범\"}],\"nodeId\":\".EC.B0.B8.EA.B3.A0-.EC.82.AC.EB.A1.80-.EB.B0.8F-.EB.B3.B4.EC.95.88-.EA.B7.9C.EB.B2.94\",\"type\":\"h2\"},{\"children\":[{\"text\":\"참고 사례1: 리소스(resource)의 범위 제한 초과\"}],\"nodeId\":\".EC.B0.B8.EA.B3.A0-.EC.82.AC.EB.A1.801.3A-.EB.A6.AC.EC.86.8C.EC.8A.A4(resource).EC.9D.98-.EB.B2.94.EC.9C.84-.EC.A0.9C.ED.95.9C-.EC.B4.88.EA.B3.BC\",\"type\":\"h3\"},{\"children\":[{\"text\":\"애플리케이션 A에서 가입 사용자가 업로드하는 프로필 사진에 COS를 사용하고 있으며, 모든 가입 사용자의 프로필 사진이 고정된 객체 키 \"},{\"code\":1,\"text\":\"app/avatar/\\u003cUsername\\u003e.jpg\"},{\"text\":\"를 가지고 있고 동시에 서로 다른 크기의 프로필 사진이 포함되어 있습니다. 여기에서 백그라운드에서 사용하기 편리하도록 해당 객체 키를 각각 \"},{\"code\":1,\"text\":\"app/avatar/\\u003cUsername\\u003e_m.jpg\"},{\"text\":\"와 \"},{\"code\":1,\"text\":\"app/avatar/\\u003cUsername\\u003e_s.jpg\"},{\"text\":\"로 나누고, 임시 키 생성 시 직접 resource를 \"},{\"code\":1,\"text\":\"qcs::cos:\\u003cRegion\\u003e:uid/\\u003cAPPID\\u003e:\\u003cBucketName-APPID\\u003e/app/avatar/*\"},{\"text\":\"로 설정했습니다. 이때 악성 사용자가 네트워크 패킷 캡쳐 등의 수단을 사용하여 생성된 임시 키를 획득하면 업로드된 임의의 사용자 프로필 사진을 덮어쓸 수 있으며 권한을 초과한 액세스가 발생해 사용자의 합법적 프로필 사진 데이터가 덮어쓰기 되어 손실될 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"보안 규범\"}],\"nodeId\":\".EB.B3.B4.EC.95.88-.EA.B7.9C.EB.B2.94\",\"type\":\"h4\"},{\"children\":[{\"text\":\"resource 는 임시 키가 액세스를 허용하는 리소스 경로를 대표하며, 이때 해당 경로에서 커버하는 최종 사용자를 고려해야 합니다. 원칙적으로 resource에서 지정하는 리소스는 단일 사용자만 사용할 수 있도록 요구합니다. 해당 사례에서 지정한 \"},{\"code\":1,\"text\":\"qcs::cos:\\u003cRegion\\u003e:uid/\\u003cAPPID\\u003e:\\u003cBucketName-APPID\\u003e/app/avatar/*\"},{\"text\":\"는 명백하게 모든 사용자를 커버하고 있어 보안 취약점이 존재하게 됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"해당 사례의 경우 사용자의 프로필 사진 경로를 \"},{\"code\":1,\"text\":\"app/avatar/\\u003cUsername\\u003e/\\u003csize\\u003e.jpg\"},{\"text\":\"로 수정하고, 이때 resource를 \"},{\"code\":1,\"text\":\"qcs::cos:\\u003cRegion\\u003e:uid/\\u003cAPPID\\u003e:\\u003cBucketName-APPID\\u003e/app/avatar/\\u003cUsername\\u003e/*\"},{\"text\":\"로 지정한다면 규범 요구를 만족할 수 있습니다. 이외에도 resource 필드는 숫자 조합 형식으로 여러 값을 전송할 수 있습니다. 따라서 명시적으로 여러 resource 값을 지정해 사용자가 액세스 권한을 가진 최종 리소스 경로를 완벽하게 한정할 수 있습니다. 예시는 다음과 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"\\\"resource\\\": [\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:\\u003cRegion\\u003e:uid/\\u003cAPPID\\u003e:\\u003cBucketName-APPID\\u003e/app/avatar/\\u003cUsername\\u003e.jpg\\\",\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:\\u003cRegion\\u003e:uid/\\u003cAPPID\\u003e:\\u003cBucketName-APPID\\u003e/app/avatar/\\u003cUsername\\u003e_m.jpg\\\",\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:\\u003cRegion\\u003e:uid/\\u003cAPPID\\u003e:\\u003cBucketName-APPID\\u003e/app/avatar/\\u003cUsername\\u003e_s.jpg\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"]\"}],\"type\":\"code-line\"}],\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"참고 사례2: 작업(action)의 범위 제한 초과\"}],\"nodeId\":\".EC.B0.B8.EA.B3.A0-.EC.82.AC.EB.A1.802.3A-.EC.9E.91.EC.97.85(action).EC.9D.98-.EB.B2.94.EC.9C.84-.EC.A0.9C.ED.95.9C-.EC.B4.88.EA.B3.BC\",\"type\":\"h3\"},{\"children\":[{\"text\":\"애플리케이션 B는 공유 포토월 기능을 제공하고 있으며, 모든 이미지는 \"},{\"code\":1,\"text\":\"app/photos/*\"},{\"text\":\"에 저장됩니다. 클라이언트에서는 객체 조회(GET Bucket)와 객체 다운로드(GET Object) 작업이 동시에 필요하며, 백그라운드에서는 사용 편의를 위해 임시 키 생성 시 직접 action을 \"},{\"code\":1,\"text\":\"name/cos:*\"},{\"text\":\"로 지정하였습니다. 이때 악성 사용자가 네트워크 패킷 캡쳐 등의 수단을 사용하여 생성된 임시 키를 획득하면 해당 리소스 경로 하의 모든 객체에 대해 모든 객체 작업(예: 업로드 및 삭제 등의 작업)을 실행할 수 있으며, 권한을 초과한 액세스가 발생해 데이터가 손실되고 온라인 비즈니스에 영향을 미칠 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"보안 규범\"}],\"nodeId\":\".EB.B3.B4.EC.95.88-.EA.B7.9C.EB.B2.942\",\"type\":\"h4\"},{\"children\":[{\"text\":\"action은 임시 키가 요청을 허용하는 작업을 대표하며, 원칙적으로 \"},{\"code\":1,\"text\":\"name/cos:*\"},{\"text\":\" 등을 사용한 모든 작업의 임시 키를 프런트 엔드에 전달하는 행위를 허용하지 않습니다. 반드시 모든 필요한 작업을 명확하게 나열해야 하며, 각 작업에 필요한 리소스 경로가 서로 다른 경우 병합 처리가 아닌 \"},{\"b\":1,\"text\":\"작업\"},{\"text\":\"과 \"},{\"b\":1,\"text\":\"리소스\"},{\"text\":\" 경로를 단독으로 매칭해야 합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"해당 사례에서는 \"},{\"code\":1,\"text\":\"\\\"action\\\": [ \\\"name/cos:GetBucket\\\", \\\"name/cos:GetObject\\\" ]\"},{\"text\":\"를 사용하여 구체적인 작업을 명확하게 지정해야 합니다. 권한 부여 작업 가이드에 대한 사항은 \"},{\"children\":[{\"text\":\"COS API 권한 부여 정책 사용 가이드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/30580\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/30580\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"참고 사례3: 리소스와 작업의 범위 제한 초과\"}],\"nodeId\":\".EC.B0.B8.EA.B3.A0-.EC.82.AC.EB.A1.803.3A-.EB.A6.AC.EC.86.8C.EC.8A.A4.EC.99.80-.EC.9E.91.EC.97.85.EC.9D.98-.EB.B2.94.EC.9C.84-.EC.A0.9C.ED.95.9C-.EC.B4.88.EA.B3.BC\",\"type\":\"h3\"},{\"children\":[{\"text\":\"애플리케이션 C는 관리 툴을 제공하고 있으며, 사용자에게 모든 사용자들의 파일(\"},{\"code\":1,\"text\":\"app/files/*\"},{\"text\":\")을 조회하고 다운로드할 수 있도록 허용하고, 업로드 및 삭제는 개인 디렉터리의 파일(\"},{\"code\":1,\"text\":\"app/files/\\u003cUsername\\u003e/*\"},{\"text\":\")만 작업할 수 있도록 제공합니다. 백그라운드에서의 사용 편의를 위해 임시 키 생성 시 해당 두 권한에 대해 4가지 작업(action)을 함께 혼합하여 사용합니다. 두 권한의 해당 리소스 경로 또한 혼합하여 함께 사용하며, 이때의 임시 키는 리소스 경로에서 지정한 권한보다 더 큰 권한을 가지게 됩니다. 즉, 모든 사용자들의 파일에 대한 조회, 다운로드, 업로드, 삭제 권한을 가지게 됩니다. 악성 사용자가 이에 따라 타인의 파일을 조작하거나 삭제할 수 있으며 권한을 초과한 액세스가 발생하여 사용자의 합법적 데이터가 유출될 리스크가 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"보안 규범\"}],\"nodeId\":\".EB.B3.B4.EC.95.88-.EA.B7.9C.EB.B2.943\",\"type\":\"h4\"},{\"children\":[{\"text\":\"여러 action과 resource의 조합은 간단하게 이들을 각각 병합하는 방법을 사용해서는 안 되며, 여러 statement 형식으로 조합해야 합니다. 간단하게 각각 병합하는 경우 권한이 커질 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"해당 사례에서는 반드시 아래와 같이 사용해야 합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"\\\"statement\\\": [\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetBucket\\\", \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" ], \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": \\\"qcs::cos:\\u003cRegion\\u003e:uid/\\u003cAPPID\\u003e:\\u003cBucketName-APPID\\u003e/app/files/*\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\", \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:DeleteObject\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": \\\"qcs::cos:\\u003cRegion\\u003e:uid/\\u003cAPPID\\u003e:\\u003cBucketName-APPID\\u003e/app/files/\\u003cUsername\\u003e/*\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"]\"}],\"type\":\"code-line\"}],\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"참고 사례4: 권한을 초과한 임시 키 획득\"}],\"nodeId\":\".EC.B0.B8.EA.B3.A0-.EC.82.AC.EB.A1.804.3A-.EA.B6.8C.ED.95.9C.EC.9D.84-.EC.B4.88.EA.B3.BC.ED.95.9C-.EC.9E.84.EC.8B.9C-.ED.82.A4-.ED.9A.8D.EB.93.9D\",\"type\":\"h3\"},{\"children\":[{\"text\":\"애플리케이션 D는 포럼 애플리케이션을 제공하고 있으며, 포럼의 포스팅 첨부파일이 COS에 저장됩니다. 해당 포럼 애플리케이션은 각 사용자 레벨별로 포스팅 수가 일정 임계값에 도달하여 활성화된 사용자만 특정 페이지 내의 포스팅과 첨부파일을 볼 수 있도록 제공하고, 일부 공개 페이지는 모든 사용자가 해당 페이지 내의 포스팅과 첨부 파일을 볼 수 있습니다.\\nCOS 사용 시, 백그라운드의 임시 키 생성 인터페이스는 프런트 엔드가 전송하는 페이지 ID에 따라 해당 페이지의 첨부파일에 대한 다운로드를 허용하는 임시 키를 생성합니다. 그러나 실현 과정에서 백그라운드에서 요청 사용자가 지정 페이지 ID 액세스 권한을 보유하고 있는지 여부를 판단할 수 없어 모든 사람이 해당 인터페이스를 요청하면 개인 페이지의 첨부파일에 대한 액세스 임시 키를 획득할 수 있게 됩니다. 이때 권한을 초과하는 액세스가 발생해 액세스를 제한하는 리소스에 대해 효과적으로 제한할 수 없게 되며 의도치 않은 데이터 유출 문제가 발생할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"보안 규범\"}],\"nodeId\":\".EB.B3.B4.EC.95.88-.EA.B7.9C.EB.B2.944\",\"type\":\"h4\"},{\"children\":[{\"text\":\"임시 키를 획득하는 인터페이스는 획득하는 임시 키 자체의 권한이 사전 설정된 범위 내여야 하며, 권한이 낮은 사용자가 높은 권한의 임시 키를 획득하지 못하도록 실제 업무 시나리오, 즉 권한이 정확한 사용자에 의해 요청되었는지 여부를 정확하게 판단해야 합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"본 사례에서는 백그라운드 인터페이스에서 반드시 현재 요청하는 사용자가 특정 페이지에 액세스할 수 있는 권한이 있는지 여부를 판단하여 액세스 권한이 없는 사용자에게 임시 키 반환을 허용하지 않아야 합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"결론\"}],\"nodeId\":\".EA.B2.B0.EB.A1.A0\",\"type\":\"h2\"},{\"children\":[{\"text\":\"이상의 사례로 예상 외로 임시 키의 권한이 확대되어 발생할 수 있는 보안 리스크를 설명하였습니다. 프런트 엔드에서 직접 COS에 전송하는 경우, 악성 사용자가 비교적 쉽게 임시 키 내용을 획득할 수 있습니다. 따라서 개발자는 해당 시나리오의 경우 백그라운드를 통한 COS 액세스에 비해 권한 제어에 대해 더욱 유의해야 합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"본 문서에서의 보안 규범은 최소한의 권한 원칙으로, 실제 사용에서는 action과 resource에 따라 모든 가능한 권한을 나열할 수 있습니다. 예를 들어 action 3개, resource 2개가 있다면 액세스가 허용되는 리소스와 해당 작업을 3x2=6개로 산출할 수 있으며, 이에 따라 각 상황별로 예상에 부합하는지 여부를 평가하여 예상 권한 범위를 초과하는 경우 여러 statement를 나열하는 방식으로 권한을 분할하는 방법을 고려해야 합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"이외에도 임시 키 생성에 사용하는 인터페이스는 자체적으로 자격 인증과 인증 처리를 충분히 고려해야 합니다. 임시 키를 획득하는 행위가 안전하다면, 해당 방법으로 획득한 임시 키에 대해 진정한 보안이 실현되는 것입니다. 보안이라는 연결 고리에는 어떠한 소홀함도 있어서는 안 됩니다!\"}],\"type\":\"p\"}]"}},"36008":{"categoryId":436,"weight":12,"type":"page","extension":"","pid":32969,"id":36008,"lang":"ko","title":"DataX로 COS 가져오기 또는 내보내기","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-03 22:15:20","recentReleaseTime":"2021-03-03 22:15:20","content":{"title":"DataX로 COS 가져오기 또는 내보내기","body":"

환경 종속

HADOOP-COS 및 해당 버전의 cos_api-bundle.
DataX 버전: DataX-3.0.

다운로드 및 설치

HADOOP-COS 다운로드

공식 Github에서 HADOOP-COS 및 해당 버전의 cos_api-bundle을 다운로드하십시오.

DataX 소프트웨어 패키지 다운로드

운영사 Github에서 DataX를 다운로드하십시오.

HADOOP-COS 설치

HADOOP-COS 다운로드 후 hadoop-cos-2.x.x-${version}.jarcos_api-bundle-${version}.jar를 Datax 압축 해제 경로 plugin/reader/hdfsreader/libs/plugin/writer/hdfswriter/libs/에 복사하십시오.

사용 방법

DataX 설정

datax.py 스크립트 수정

DataX의 압축 해제 디렉터리에 속한 bin/datax.py 스크립트를 열어 스크립트의 CLASS_PATH 변수를 아래와 같이 수정하십시오.
CLASS_PATH = ("%s/lib/*:%s/plugin/reader/hdfsreader/libs/*:%s/plugin/writer/hdfswriter/libs/*:.") % (DATAX_HOME, DATAX_HOME, DATAX_HOME)

JSON 설정 파일에 hdfsreader 및 hdfswriter 설정

JSON 파일 예시는 아래와 같습니다.
{
"job": {
"setting": {
"speed": {
"byte": 10485760
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [{
"reader": {
"name": "hdfsreader",
"parameter": {
"path": "testfile",
"defaultFS": "cosn://examplebucket-1250000000/",
"column": ["*"],
"fileType": "text",
"encoding": "UTF-8",
"hadoopConfig": {
"fs.cosn.impl": "org.apache.hadoop.fs.CosFileSystem",
"fs.cosn.userinfo.region": "ap-beijing",
"fs.cosn.tmp.dir": "/tmp/hadoop_cos",
"fs.cosn.userinfo.secretId": "COS_SECRETID",
"fs.cosn.userinfo.secretKey": "COS_SECRETKEY"
},
"fieldDelimiter": ","
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"path": "/user/hadoop/",
"fileName": "testfile1",
"defaultFS": "cosn://examplebucket-1250000000/",
"column": [{
"name": "col",
"type": "string"
},
{
"name": "col1",
"type": "string"
},
{
"name": "col2",
"type": "string"
}
],
"fileType": "text",
"encoding": "UTF-8",
"hadoopConfig": {
"fs.cosn.impl": "org.apache.hadoop.fs.CosFileSystem",
"fs.cosn.userinfo.region": "ap-beijing",
"fs.cosn.tmp.dir": "/tmp/hadoop_cos",
"fs.cosn.userinfo.secretId": "COS_SECRETID",
"fs.cosn.userinfo.secretKey": "COS_SECRETKEY"
},
"fieldDelimiter": ":",
"writeMode": "append"
}
}
}]
}
}
설정은 다음 내용을 참조하십시오.
hadoopConfig 설정은 cosn에서 필요한 설정입니다.
defaultFS는 cosn 경로로 작성합니다. 예를 들어 cosn://examplebucket-1250000000/와 같이 쓸 수 있습니다.
fs.cosn.userinfo.region을 버킷이 속한 리전(ap-beijing 등)으로 변경합니다. 자세한 내용은 리전과 액세스 도메인을 참조하십시오.
COS_SECRETID와 COS_SECRETKEY를 COS 키로 변경합니다.
다른 항목은 hdfs 설정 항목과 동일하게 설정합니다.

데이터 마이그레이션 실행

구성 파일 이름을 hdfs_job.json으로 설정하고 job 디렉터리에 저장해 아래와 같이 명령 라인을 실행합니다.
bin/datax.py job/hdfs_job.json
스크린에서 보이는 정상적인 결과 출력은 아래와 같습니다.
2020-03-09 16:49:59.543 [job-0] INFO JobContainer -
[total cpu info] =>
averageCpu | maxDeltaCpu | minDeltaCpu
-1.00% | -1.00% | -1.00%


[total gc info] =>
NAME | totalGCCount | maxDeltaGCCount | minDeltaGCCount | totalGCTime | maxDeltaGCTime | minDeltaGCTime
PS MarkSweep | 1 | 1 | 1 | 0.024s | 0.024s | 0.024s
PS Scavenge | 1 | 1 | 1 | 0.014s | 0.014s | 0.014s

2020-03-09 16:49:59.543 [job-0] INFO JobContainer - PerfTrace not enable!
2020-03-09 16:49:59.543 [job-0] INFO StandAloneJobContainerCommunicator - Total 2 records, 33 bytes | Speed 3B/s, 0 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.033s | Percentage 100.00%
2020-03-09 16:49:59.544 [job-0] INFO JobContainer -
작업 활성화 시간 : 2020-03-09 16:49:48
작업 종료 시간 : 2020-03-09 16:49:59
작업 총 소요 시간 : 11s
작업 평균 트래픽 : 3B/s
기록 입력 속도 : 0rec/s
읽은 기록 총 횟수 : 2
읽기/쓰기 실패 총 횟수 : 0

","recentReleaseTime":"2025-09-26 10:13:03","slate":"[{\"children\":[{\"text\":\"환경 종속\"}],\"nodeId\":\".ED.99.98.EA.B2.BD-.EC.A2.85.EC.86.8D\",\"type\":\"h2\",\"id\":\"woaoXaMeMqKJP2wYpXkm6\"},{\"children\":[{\"children\":[{\"text\":\"HADOOP-COS\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/hadoop-cos/releases\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/hadoop-cos/releases\"},\"type\":\"ref\",\"id\":\"mHR_u0LSlCD84QtyP9FJT\"},{\"text\":\" 및 해당 버전의 \"},{\"children\":[{\"text\":\"cos_api-bundle\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/hadoop-cos/releases\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/hadoop-cos/releases\"},\"type\":\"ref\",\"id\":\"JmaqlkDdRn42lk6zye2Qg\"},{\"text\":\".\"}],\"start\":false,\"type\":\"uli\",\"id\":\"UtonGTux7Z5JZ_LLyNQCo\"},{\"children\":[{\"text\":\"DataX 버전: DataX-3.0.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"zDWlUWjqU-7LjA43ciPKd\"},{\"children\":[{\"text\":\"다운로드 및 설치\"}],\"nodeId\":\".EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C-.EB.B0.8F-.EC.84.A4.EC.B9.98\",\"type\":\"h2\",\"id\":\"6-2s7GMeei0kxsTq4xYcy\"},{\"children\":[{\"text\":\"HADOOP-COS 다운로드\"}],\"nodeId\":\"hadoop-cos-.EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C\",\"type\":\"h4\",\"id\":\"-EfcMghkIK6OJEvFWuSSu\"},{\"children\":[{\"text\":\"공식 Github에서 \"},{\"children\":[{\"text\":\"HADOOP-COS\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/hadoop-cos/releases\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/hadoop-cos/releases\"},\"type\":\"ref\",\"id\":\"LJpm5vCxWlrLth52mPMIX\"},{\"text\":\" 및 해당 버전의 \"},{\"children\":[{\"text\":\"cos_api-bundle\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/hadoop-cos/releases\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/hadoop-cos/releases\"},\"type\":\"ref\",\"id\":\"mRhuGGGlfH8XxnYdhV8U9\"},{\"text\":\"을 다운로드하십시오.\"}],\"type\":\"p\",\"id\":\"vNKNUYqrHxCoLyzCoLjKh\"},{\"children\":[{\"text\":\"DataX 소프트웨어 패키지 다운로드\"}],\"nodeId\":\"datax-.EC.86.8C.ED.94.84.ED.8A.B8.EC.9B.A8.EC.96.B4-.ED.8C.A8.ED.82.A4.EC.A7.80-.EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C\",\"type\":\"h4\",\"id\":\"dqGF1rGk-GwdLOcngY44E\"},{\"children\":[{\"text\":\"운영사 Github에서 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/alibaba/DataX\"},\"children\":[{\"text\":\"DataX\"}],\"id\":\"1L4jduRWJYwPcNDC_C13R\"},{\"text\":\"를 다운로드하십시오. \"}],\"type\":\"p\",\"id\":\"fvEJdDqyjNuOp0CCoBVTn\"},{\"children\":[{\"text\":\"HADOOP-COS 설치\"}],\"nodeId\":\"hadoop-cos-.EC.84.A4.EC.B9.98\",\"type\":\"h4\",\"id\":\"OUPZtBm0olCQwysCkJzId\"},{\"children\":[{\"text\":\"HADOOP-COS 다운로드 후 \"},{\"code\":1,\"text\":\"hadoop-cos-2.x.x-${version}.jar\"},{\"text\":\" 및 \"},{\"code\":1,\"text\":\"cos_api-bundle-${version}.jar\"},{\"text\":\"를 Datax 압축 해제 경로 \"},{\"code\":1,\"text\":\"plugin/reader/hdfsreader/libs/\"},{\"text\":\" 및\"},{\"code\":1,\"text\":\"plugin/writer/hdfswriter/libs/\"},{\"text\":\"에 복사하십시오.\"}],\"type\":\"p\",\"id\":\"ZuF-9Z_cdWyXHTx5gdc74\"},{\"children\":[{\"text\":\"사용 방법\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9-.EB.B0.A9.EB.B2.95\",\"type\":\"h2\",\"id\":\"Jl7ZYMpohO2_yyoNZcF_M\"},{\"children\":[{\"text\":\"DataX 설정\"}],\"nodeId\":\"datax-.EC.84.A4.EC.A0.95\",\"type\":\"h3\",\"id\":\"jcvwSg18wl0hmbbLlAfLE\"},{\"children\":[{\"text\":\"datax.py 스크립트 수정\"}],\"nodeId\":\"datax.py-.EC.8A.A4.ED.81.AC.EB.A6.BD.ED.8A.B8-.EC.88.98.EC.A0.95\",\"type\":\"h4\",\"id\":\"dLon3kXBJdxi3dcpo0wR0\"},{\"children\":[{\"text\":\"DataX의 압축 해제 디렉터리에 속한 bin/datax.py 스크립트를 열어 스크립트의 CLASS_PATH 변수를 아래와 같이 수정하십시오.\"}],\"type\":\"p\",\"id\":\"8P4cGw84r-SQ20T4jK6v4\"},{\"children\":[{\"children\":[{\"text\":\"CLASS_PATH = (\\\"%s/lib/*:%s/plugin/reader/hdfsreader/libs/*:%s/plugin/writer/hdfswriter/libs/*:.\\\") % (DATAX_HOME, DATAX_HOME, DATAX_HOME)\"}],\"type\":\"code-line\",\"id\":\"hFSaB35PJmd2We1nHhnfK\"}],\"language\":\"plaintext\",\"type\":\"code-block\",\"id\":\"ogDZNivNKvzozNks2TiZ5\",\"autoWrap\":false},{\"children\":[{\"text\":\"JSON 설정 파일에 hdfsreader 및 hdfswriter 설정\"}],\"nodeId\":\"json-.EC.84.A4.EC.A0.95-.ED.8C.8C.EC.9D.BC.EC.97.90-hdfsreader-.EB.B0.8F-hdfswriter-.EC.84.A4.EC.A0.95\",\"type\":\"h4\",\"id\":\"KppmUNtbbRijGKXcKtJU-\"},{\"children\":[{\"text\":\"JSON 파일 예시는 아래와 같습니다.\"}],\"type\":\"p\",\"id\":\"s9MpuPE82TKHdLwPq0CfO\"},{\"children\":[{\"children\":[{\"text\":\"{\"}],\"type\":\"code-line\",\"id\":\"wtFPiUUYzrg-tqQNn4DxU\"},{\"children\":[{\"text\":\" \\\"job\\\": {\"}],\"type\":\"code-line\",\"id\":\"C1G1xY07zPMBEH4ymUhCh\"},{\"children\":[{\"text\":\" \\\"setting\\\": {\"}],\"type\":\"code-line\",\"id\":\"uKarMTTp8OEaYjIeBahvU\"},{\"children\":[{\"text\":\" \\\"speed\\\": {\"}],\"type\":\"code-line\",\"id\":\"0EFI49nLmM6D8DnI0FduK\"},{\"children\":[{\"text\":\" \\\"byte\\\": 10485760\"}],\"type\":\"code-line\",\"id\":\"HEX1XRuzqdy4ZKMIWsHDM\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\",\"id\":\"GJ7cuvs8hC-FUv7nuR2JR\"},{\"children\":[{\"text\":\" \\\"errorLimit\\\": {\"}],\"type\":\"code-line\",\"id\":\"4ErI5d_RUzM-T63T-4d2a\"},{\"children\":[{\"text\":\" \\\"record\\\": 0,\"}],\"type\":\"code-line\",\"id\":\"QJG1el_5LV0ZMX2E2NuCA\"},{\"children\":[{\"text\":\" \\\"percentage\\\": 0.02\"}],\"type\":\"code-line\",\"id\":\"-msfrYy-JEElvBxpZ4Omf\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"ZnflCHLRfryDZJBAEmkTD\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\",\"id\":\"mOkc4AzCPIcFlXwWjN4au\"},{\"children\":[{\"text\":\" \\\"content\\\": [{\"}],\"type\":\"code-line\",\"id\":\"wvtW7EZaCeniCPda7T0Hc\"},{\"children\":[{\"text\":\" \\\"reader\\\": {\"}],\"type\":\"code-line\",\"id\":\"bY7g16574661GI-1zQoxC\"},{\"children\":[{\"text\":\" \\\"name\\\": \\\"hdfsreader\\\",\"}],\"type\":\"code-line\",\"id\":\"BafeYgEC_byaMMKuWcKwF\"},{\"children\":[{\"text\":\" \\\"parameter\\\": {\"}],\"type\":\"code-line\",\"id\":\"0Y4w2mMykRoKwb1DvB10v\"},{\"children\":[{\"text\":\" \\\"path\\\": \\\"testfile\\\",\"}],\"type\":\"code-line\",\"id\":\"pTt1D2O0qtp0T7_SzQPyB\"},{\"children\":[{\"text\":\" \\\"defaultFS\\\": \\\"cosn://examplebucket-1250000000/\\\",\"}],\"type\":\"code-line\",\"id\":\"GTi5253sAwh7-lhCr0n-K\"},{\"children\":[{\"text\":\" \\\"column\\\": [\\\"*\\\"],\"}],\"type\":\"code-line\",\"id\":\"764qi0hkAxfIZ5RCCQYEK\"},{\"children\":[{\"text\":\" \\\"fileType\\\": \\\"text\\\",\"}],\"type\":\"code-line\",\"id\":\"bw76X3_hesY9dLVn-rgfE\"},{\"children\":[{\"text\":\" \\\"encoding\\\": \\\"UTF-8\\\",\"}],\"type\":\"code-line\",\"id\":\"eFzCO9ZYXeBOMlfV3Nj_L\"},{\"children\":[{\"text\":\" \\\"hadoopConfig\\\": {\"}],\"type\":\"code-line\",\"id\":\"P_27t3EyARTouwyFERp4Q\"},{\"children\":[{\"text\":\" \\\"fs.cosn.impl\\\": \\\"org.apache.hadoop.fs.CosFileSystem\\\",\"}],\"type\":\"code-line\",\"id\":\"RxvZdP-YfNoZ8AgqtmlVQ\"},{\"children\":[{\"text\":\" \\\"fs.cosn.userinfo.region\\\": \\\"ap-beijing\\\",\"}],\"type\":\"code-line\",\"id\":\"-ygGSS7Imlo4BJtcIgLMP\"},{\"children\":[{\"text\":\" \\\"fs.cosn.tmp.dir\\\": \\\"/tmp/hadoop_cos\\\",\"}],\"type\":\"code-line\",\"id\":\"ZIq8DBlpnG_GO4fImmukE\"},{\"children\":[{\"text\":\" \\\"fs.cosn.userinfo.secretId\\\": \\\"COS_SECRETID\\\",\"}],\"type\":\"code-line\",\"id\":\"_WNelJrYC5UPMD1YYdnF1\"},{\"children\":[{\"text\":\" \\\"fs.cosn.userinfo.secretKey\\\": \\\"COS_SECRETKEY\\\"\"}],\"type\":\"code-line\",\"id\":\"YVCEaVmfLOzzzyf_vcq9z\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\",\"id\":\"bqcIT2UaPWw12m3EEJuy0\"},{\"children\":[{\"text\":\" \\\"fieldDelimiter\\\": \\\",\\\"\"}],\"type\":\"code-line\",\"id\":\"Zj8GViDBBdofLg-tE7c1D\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"WrOi6wHHnmhw5DUeRBTey\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\",\"id\":\"ep1slDp2SBFYzMEWxcjKG\"},{\"children\":[{\"text\":\" \\\"writer\\\": {\"}],\"type\":\"code-line\",\"id\":\"rkDiv2tMpMaMTWsrqgiga\"},{\"children\":[{\"text\":\" \\\"name\\\": \\\"hdfswriter\\\",\"}],\"type\":\"code-line\",\"id\":\"yhA5IFczb_o0glHt5Egbc\"},{\"children\":[{\"text\":\" \\\"parameter\\\": {\"}],\"type\":\"code-line\",\"id\":\"COBFYq_9WUTGZXreQE4oc\"},{\"children\":[{\"text\":\" \\\"path\\\": \\\"/user/hadoop/\\\",\"}],\"type\":\"code-line\",\"id\":\"v4gxcySi0QLfdFfxS3hYf\"},{\"children\":[{\"text\":\" \\\"fileName\\\": \\\"testfile1\\\",\"}],\"type\":\"code-line\",\"id\":\"t47m2i0BTkv9N4Q8xD21k\"},{\"children\":[{\"text\":\" \\\"defaultFS\\\": \\\"cosn://examplebucket-1250000000/\\\",\"}],\"type\":\"code-line\",\"id\":\"03BEsP4aNtJm5TWq_278J\"},{\"children\":[{\"text\":\" \\\"column\\\": [{\"}],\"type\":\"code-line\",\"id\":\"28KydXLwK0Q7wFNMgUjcv\"},{\"children\":[{\"text\":\" \\\"name\\\": \\\"col\\\",\"}],\"type\":\"code-line\",\"id\":\"-v85JG3UcR9uYxTZewprX\"},{\"children\":[{\"text\":\" \\\"type\\\": \\\"string\\\"\"}],\"type\":\"code-line\",\"id\":\"j11QE2hqxS5mwL5uq7JK_\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\",\"id\":\"ev_X5U-aCzPAxyt910MHL\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"fQE7OdvfEgmUEEyJ3lIWD\"},{\"children\":[{\"text\":\" \\\"name\\\": \\\"col1\\\",\"}],\"type\":\"code-line\",\"id\":\"dEl-XokVHVdnDCNpb1F2U\"},{\"children\":[{\"text\":\" \\\"type\\\": \\\"string\\\"\"}],\"type\":\"code-line\",\"id\":\"c2YN6f8UZN3Sqjxsb4tDN\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\",\"id\":\"fbatBHidDq9yfY7tJDSnT\"},{\"children\":[{\"text\":\" {\"}],\"type\":\"code-line\",\"id\":\"zm2uxuJO8ZzZ5JEaYr9aQ\"},{\"children\":[{\"text\":\" \\\"name\\\": \\\"col2\\\",\"}],\"type\":\"code-line\",\"id\":\"J3GuCPURcoxDaojyoM5FW\"},{\"children\":[{\"text\":\" \\\"type\\\": \\\"string\\\"\"}],\"type\":\"code-line\",\"id\":\"V7B3pNDZt4aKq4j5MUanL\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"ztd67U9IRZXLf4fwcfXty\"},{\"children\":[{\"text\":\" ],\"}],\"type\":\"code-line\",\"id\":\"hj9DvcM7yCkE93IMCudOa\"},{\"children\":[{\"text\":\" \\\"fileType\\\": \\\"text\\\",\"}],\"type\":\"code-line\",\"id\":\"2vl0kL6I4uY6lkDdwdepC\"},{\"children\":[{\"text\":\" \\\"encoding\\\": \\\"UTF-8\\\",\"}],\"type\":\"code-line\",\"id\":\"5LHP4xXLipRZwhWFN_5v4\"},{\"children\":[{\"text\":\" \\\"hadoopConfig\\\": {\"}],\"type\":\"code-line\",\"id\":\"aJ1yW6qGhlq1dJGYWfj4w\"},{\"children\":[{\"text\":\" \\\"fs.cosn.impl\\\": \\\"org.apache.hadoop.fs.CosFileSystem\\\",\"}],\"type\":\"code-line\",\"id\":\"AhASBZ5i-TudPfCagL12Y\"},{\"children\":[{\"text\":\" \\\"fs.cosn.userinfo.region\\\": \\\"ap-beijing\\\",\"}],\"type\":\"code-line\",\"id\":\"uNIzLSwy5O6cZTwO8E172\"},{\"children\":[{\"text\":\" \\\"fs.cosn.tmp.dir\\\": \\\"/tmp/hadoop_cos\\\",\"}],\"type\":\"code-line\",\"id\":\"-G4gizuoclkQhTwzuAXVR\"},{\"children\":[{\"text\":\" \\\"fs.cosn.userinfo.secretId\\\": \\\"COS_SECRETID\\\",\"}],\"type\":\"code-line\",\"id\":\"PO6fQPdh2xiVZBFpqfLcz\"},{\"children\":[{\"text\":\" \\\"fs.cosn.userinfo.secretKey\\\": \\\"COS_SECRETKEY\\\"\"}],\"type\":\"code-line\",\"id\":\"ClRZkjWi5jca4LG0s6hjU\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\",\"id\":\"mh-teTIRCD3-_84w0gY3y\"},{\"children\":[{\"text\":\" \\\"fieldDelimiter\\\": \\\":\\\",\"}],\"type\":\"code-line\",\"id\":\"3xLSW6Y_pjSSUafjIwFXb\"},{\"children\":[{\"text\":\" \\\"writeMode\\\": \\\"append\\\"\"}],\"type\":\"code-line\",\"id\":\"H94WOpd-40_2wRo-YwQMo\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"BAD7MexFdiLqwgRgXr1vz\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"YIsmy_Ni82N2Bktm90bkk\"},{\"children\":[{\"text\":\" }]\"}],\"type\":\"code-line\",\"id\":\"wMpwKWZDO-uzhAtWIx863\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"h6wBohjoRg8UqKfboDTlp\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"cXv0VHwm0HpBivhAil903\"}],\"language\":\"json\",\"type\":\"code-block\",\"id\":\"puk6gZ8S1MLrDaZTDVoUf\",\"autoWrap\":false},{\"children\":[{\"text\":\"설정은 다음 내용을 참조하십시오.\"}],\"type\":\"p\",\"id\":\"6r8yU08yeGh5bl831rleR\"},{\"children\":[{\"text\":\"hadoopConfig 설정은 cosn에서 필요한 설정입니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"CfVZyFoYKeoGOLau-gJ_K\"},{\"children\":[{\"text\":\"defaultFS는 cosn 경로로 작성합니다. 예를 들어 \"},{\"code\":1,\"text\":\"cosn://examplebucket-1250000000/\"},{\"text\":\"와 같이 쓸 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"0G7Lv7mL-E4_Q5TVKNevj\"},{\"children\":[{\"text\":\"fs.cosn.userinfo.region을 버킷이 속한 리전(\"},{\"code\":1,\"text\":\"ap-beijing\"},{\"text\":\" 등)으로 변경합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"리전과 액세스 도메인\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/6224\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/6224\"},\"type\":\"ref\",\"id\":\"DowMnYvmkMEshGAi_vwq_\"},{\"text\":\"을 참조하십시오.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"HmnFccTiXMlBEB9T--Ti8\"},{\"children\":[{\"text\":\"COS_SECRETID와 COS_SECRETKEY를 COS 키로 변경합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"nCTcotssdeELIMr-5cyn_\"},{\"children\":[{\"text\":\"다른 항목은 hdfs 설정 항목과 동일하게 설정합니다.\"}],\"type\":\"p\",\"id\":\"bynU7xRZnfztFownmeMpP\"},{\"children\":[{\"text\":\"데이터 마이그레이션 실행\"}],\"nodeId\":\".EB.8D.B0.EC.9D.B4.ED.84.B0-.EB.A7.88.EC.9D.B4.EA.B7.B8.EB.A0.88.EC.9D.B4.EC.85.98-.EC.8B.A4.ED.96.89\",\"type\":\"h3\",\"id\":\"aEgfufUsGRbcqZPHiBr49\"},{\"children\":[{\"text\":\"구성 파일 이름을 hdfs_job.json으로 설정하고 job 디렉터리에 저장해 아래와 같이 명령 라인을 실행합니다.\"}],\"type\":\"p\",\"id\":\"xoRGgeV1kYNjty6R9evYc\"},{\"children\":[{\"children\":[{\"text\":\"bin/datax.py job/hdfs_job.json\"}],\"type\":\"code-line\",\"id\":\"BX14WWBSeiGlzljZhqQ2L\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"rEDE7pGYwBSgrgb-hSwbO\",\"autoWrap\":false},{\"children\":[{\"text\":\"스크린에서 보이는 정상적인 결과 출력은 아래와 같습니다.\"}],\"type\":\"p\",\"id\":\"AAuyX0zAD5EkIZqYJmzjt\"},{\"children\":[{\"children\":[{\"text\":\"2020-03-09 16:49:59.543 [job-0] INFO JobContainer - \"}],\"type\":\"code-line\",\"id\":\"DxcQGIxDMX2JjNm-IDB1P\"},{\"children\":[{\"text\":\" [total cpu info] => \"}],\"type\":\"code-line\",\"id\":\"fDqrMJvhi2CdKh7sNMK9C\"},{\"children\":[{\"text\":\" averageCpu | maxDeltaCpu | minDeltaCpu \"}],\"type\":\"code-line\",\"id\":\"PnLFaIEKWSc1AqyL9fXfu\"},{\"children\":[{\"text\":\" -1.00% | -1.00% | -1.00%\"}],\"type\":\"code-line\",\"id\":\"ccljQpKZku96-292BdcZs\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"nSudpGhIa8HP4OsT5KX_m\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"0cGyunbs1Hiq6adg23Tyf\"},{\"children\":[{\"text\":\" [total gc info] => \"}],\"type\":\"code-line\",\"id\":\"er73pCD8gQnyza3eXiEH0\"},{\"children\":[{\"text\":\" NAME | totalGCCount | maxDeltaGCCount | minDeltaGCCount | totalGCTime | maxDeltaGCTime | minDeltaGCTime \"}],\"type\":\"code-line\",\"id\":\"jECOqPRp_wfQlayi_7Fkw\"},{\"children\":[{\"text\":\" PS MarkSweep | 1 | 1 | 1 | 0.024s | 0.024s | 0.024s \"}],\"type\":\"code-line\",\"id\":\"9uxdcE07UKCKGDAvFPij3\"},{\"children\":[{\"text\":\" PS Scavenge | 1 | 1 | 1 | 0.014s | 0.014s | 0.014s \"}],\"type\":\"code-line\",\"id\":\"xZcLmkN5ne1ctDZOB9-Qv\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"IgBZAIBBgmJk3t48wsp9Z\"},{\"children\":[{\"text\":\"2020-03-09 16:49:59.543 [job-0] INFO JobContainer - PerfTrace not enable!\"}],\"type\":\"code-line\",\"id\":\"rIBhn8EukXWcn1YCyaTzG\"},{\"children\":[{\"text\":\"2020-03-09 16:49:59.543 [job-0] INFO StandAloneJobContainerCommunicator - Total 2 records, 33 bytes | Speed 3B/s, 0 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.033s | Percentage 100.00%\"}],\"type\":\"code-line\",\"id\":\"qZsevrs6p06ZhreXtUpGS\"},{\"children\":[{\"text\":\"2020-03-09 16:49:59.544 [job-0] INFO JobContainer - \"}],\"type\":\"code-line\",\"id\":\"oV83_ZnNFiaNz0QgTD8by\"},{\"children\":[{\"text\":\"작업 활성화 시간 : 2020-03-09 16:49:48\"}],\"type\":\"code-line\",\"id\":\"IejBFd29OqoOG8vRacaUT\"},{\"children\":[{\"text\":\"작업 종료 시간 : 2020-03-09 16:49:59\"}],\"type\":\"code-line\",\"id\":\"k9GKtWqUlAbbvhrGrjSS6\"},{\"children\":[{\"text\":\"작업 총 소요 시간 : 11s\"}],\"type\":\"code-line\",\"id\":\"cwVtcy9a7Peqkmd5V7MbZ\"},{\"children\":[{\"text\":\"작업 평균 트래픽 : 3B/s\"}],\"type\":\"code-line\",\"id\":\"2Q-Nq_kElUwnu_SoiS77o\"},{\"children\":[{\"text\":\"기록 입력 속도 : 0rec/s\"}],\"type\":\"code-line\",\"id\":\"z3BLKCuXB8goT_doPc_Q6\"},{\"children\":[{\"text\":\"읽은 기록 총 횟수 : 2\"}],\"type\":\"code-line\",\"id\":\"5dG59eFUkJ5EqrQLTFcxn\"},{\"children\":[{\"text\":\"읽기/쓰기 실패 총 횟수 : 0\"}],\"type\":\"code-line\",\"id\":\"H9kTEduWmfTIxa1pZC7T5\"}],\"language\":\"plaintext\",\"type\":\"code-block\",\"id\":\"Oafsxq7kW-DzqvtiZnT5a\",\"autoWrap\":false},{\"type\":\"p\",\"children\":[{\"text\":\"\"}],\"id\":\"hUzlQiCd9cDCOOJoeqVfP\"}]"}},"36104":{"categoryId":436,"weight":40,"type":"page","extension":"","pid":34079,"id":36104,"lang":"ko","title":"PC 파일 COS에 백업","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-03 23:09:20","recentReleaseTime":"2021-03-03 23:09:20","content":{"title":"PC 파일 COS에 백업","body":"

서문

데이터의 가치가 무한하다는 데에는 누구도 이견이 없을 것입니다. 디지털 사진, 전자 문서, 업무 자료, 게임 아카이브 등 잃어버렸을 때 곤란하지 않을 데이터는 없습니다. 디스크 장애로 인한 파일 손실뿐 아니라 조작 오류, 컴퓨터 다운 또는 소프트웨어 크래쉬로 인한 파일 손실, '버전 롤백'이 필요할 때 저장된 이전 버전이 없다면 매우 당황스럽습니다. 그러니 백업의 중요성은 두말할 필요도 없지요.
백업이라고 하면 외장 하드 또는 LAN에 구축한 NAS 스토리지에 파일을 업로드하면 그만이라고 생각하는 사람이 많습니다. 정말 실제로도 이렇게 간단할까요?
백업은 사실 하나의 시스템 프로세스입니다. 파일을 백업 매체에 복사하는 것뿐만 아니라 백업 내용의 정확성도 검증해야 합니다. 복사와 검증은 파일 손실 시의 피해를 최소화할 수 있도록 정기적으로 실시해야 합니다. 또한 백업 매체도 점검이 필요하며, 손상된 디스크는 즉시 교체해야 합니다.
그렇다면 파일의 안전을 보장할 수 있는 간단한 방법은 없을까요? 답은 '있습니다'.
클라우드 서비스가 발전함에 따라 신뢰할 만한 기업급 클라우드 스토리지 서비스가 생겨났고, Tencent Cloud COS 객체 스토리지가 바로 이런 서비스입니다. 속도를 높이고 비용을 절감하고자 하는 정부의 노력에 부응하여 더욱 빠르고 저렴한 광대역이 등장함으로써 클라우드 파일 백업은 이미 상용화되었습니다. 이제는 컴퓨터의 파일과 클라우드 스토리지를 연결하여 파일을 정기적으로 클라우드에 자동 백업하고 백업 파일의 정확성을 검증하는 소프트웨어가 필요합니다.

소프트웨어 소개

Arq® Backup은 Windows와 macOS 시스템을 지원하는 비즈니스 백업 소프트웨어입니다. 시스템 백그라운드에서 실행되며 설정에 따라 일정 시간마다 지정 디렉터리를 자동 백업하고, 매시간 파일을 백업해 두기 때문에 파일의 이전 버전을 쉽게 찾을 수 있습니다. 또한 시간마다 실행되는 백업은 변경 사항이 있는 파일만 백업하고 경로가 다른 중복 파일은 한 번만 백업함으로써 백업 용량을 최대한 작게, 백업 속도는 최대한 빠르게 합니다. 백업 파일을 네트워크로 전송하기 전, 소프트웨어는 네트워크 전송 과정 또는 클라우드 스토리지에서 도용되는 일이 없도록 사용자가 입력한 비밀번호를 바탕으로 백업 파일을 암호화하여 중요 데이터의 보안성을 보장합니다.
Arq® Backup 비즈니스 라이선스는 사용자 1명당 49.99USD입니다. 사용자는 구매 후 한 대의 컴퓨터에서 사용할 수 있습니다. 소프트웨어는 30일 무료 사용이 가능하므로 직접 사용해본 후 구매할 수도 있습니다.
설명:
Arq® Backup 소프트웨어는 현재 중국어 간체 버전이 없습니다. 소프트웨어의 다운로드, 구매 및 관련 설명은 해당 소프트웨어의 공식 홈페이지에서 확인할 수 있습니다.

Tencent Cloud COS 준비

설명:
현재 COS를 사용 중인 경우 1-2단계는 생략합니다.
1. Tencent Cloud 계정 생성실명 인증을 완료합니다. 실명 인증을 하지 않은 사용자는 중국 내 리소스를 구매할 수 없습니다.
2. COS 콘솔에 로그인하여 지시에 따라 COS를 활성화합니다.
3. COS 콘솔에서 왼쪽 메뉴의 버킷 리스트 클릭 후 버킷 생성을 클릭하여 버킷 생성을 시작합니다.
이름: 버킷 이름입니다(예: “backups”).
소속 리전: 귀하의 소재지와 가까운 곳을 선택할 수 있으나 금융 클라우드 리전은 선택하지 마십시오. 현재 서남 리전에 가격 할인 혜택이 있으므로 '청두' 또는 '충칭'을 선택하면 가격 할인 혜택을 받을 수 있습니다.\n
\"\"

\n 기타 설정 항목은 기본값을 유지합니다. 도메인 요청 주소를 복사 및 저장한 후 확인을 클릭하여 생성을 완료합니다.
설명:
자세한 버킷 생성 순서는 버킷 생성을 참조하십시오.
4. API Keys 콘솔에 로그인하여 키 정보 SecretId와 SecretKey를 생성 및 기록합니다.\n
\"\"


Arq® Backup 설치 및 설정

설명:
본 문서는 Windows의 Arq Backup 6.2.11 버전을 예시로 사용하였습니다.
1. Arq® Backup 공식 홈페이지에서 소프트웨어를 다운로드합니다.
2. 지시에 따라 소프트웨어 설치를 완료하면 소프트웨어가 자동으로 실행됩니다. 최초 실행 시 로그인 알림이 뜹니다. 이때 이메일 주소를 입력하고 [Start Trial]을 클릭합니다.\n
\"\"

\n3.Backup 인터페이스에서Create a new backup plan 을 클릭하고 백업 플랜을 추가합니다.\n
\"\"

3. 리디렉션 인터페이스에서 백업할 디렉터리를 선택합니다. 전체 디스크 또는 지정 디렉터리를 선택할 수 있습니다.\n
\"\"

\n5.Add storage location 을 클릭하고 아래 이미지와 같이 백업 스토리지 위치를 추가합니다.\n
\"\"

\n6.S3-Compatible Server 를 클릭합니다.\n
\"\"

4. 리디렉션 인터페이스에서 다음 설명에 따라 설정합니다. 설정 완료 후Continue 를 클릭합니다.
Server URL: 위에 기록된 도메인 요청 중 cos로 시작하면서 앞에 https://가 있는 주소를 입력합니다(예: https://cos.ap-chengdu.myqcloud.com). 버킷 이름은 포함되어 있지 않다는 것에 주의하십시오.
Access Key ID: 위에 기록된 키 정보 중 SecretId입니다.
Secret Access Key: 위에 기록된 키 정보 중 SecretKey입니다.\n
\"\"

5. 다음 인터페이스에서Use an existing bucket 을 선택한 후 위에서 생성한 버킷(예: backups-1250000000)을 선택하고Save 를 클릭합니다.\n
\"\"

6. (옵션) 백업 데이터 암호화 여부를 선택합니다. 활성화 버튼을 선택합니다.\n
\"\"

7. 팝업 창에서 암호화에 사용되는 비밀번호를 설정합니다. 백업 파일 암호화에 사용되는 비밀번호를 두 번 입력하고OK 를 클릭합니다. 주의: 백업 비밀번호를 기억하지 않으면 백업에서 파일을 복구할 수 없습니다!
\"\"

8. (옵션) 백업 주기를 설정합니다.\n
\"\"

\n12.Save 를 클릭하여 설정을 저장한 후Back Up Now 를 클릭하여 백업을 시작합니다.\n
\"\"


백업에서 파일 복구

1. 메인 인터페이스 왼쪽 Backup 리스트에서Restore 를 클릭합니다.\n
\"\"

2. 위의 9단계에서 백업 데이터 암호화를 설정한 경우 비밀번호를 입력해야 합니다.\n
\"\"

3. 복구할 디렉터리 또는 파일 및 복구한 디렉터리 또는 파일의 저장 위치를 선택한 후 Restore 를 클릭하여 복구를 시작합니다.\n
\"\"

4. 복구 작업은 기본적으로 최신 백업에서 복구됩니다. 필요에 따라 스냅샷에서 이전 버전 백업을 찾아 이전 버전 백업에서 복구를 진행할 수도 있습니다.Snapshots 를 클릭하여 이전 스냅샷을 조회합니다.\n
\"\"

5. 이전 스냅샷을 선택합니다.\n
\"\"

6. 복구할 디렉터리 또는 파일 및 복구한 디렉터리 또는 파일의 저장 위치를 선택한 후 Restore 를 클릭하여 복구를 시작합니다.
7. 복구가 완료되었다는 인터페이스 안내가 뜨면 조금 전 지정한 디렉터리에서 복구된 파일을 확인할 수 있습니다.
","recentReleaseTime":"2024-06-24 16:53:18","slate":"[{\"children\":[{\"text\":\"서문\"}],\"nodeId\":\".EC.84.9C.EB.AC.B8\",\"type\":\"h2\"},{\"children\":[{\"text\":\"데이터의 가치가 무한하다는 데에는 누구도 이견이 없을 것입니다. 디지털 사진, 전자 문서, 업무 자료, 게임 아카이브 등 잃어버렸을 때 곤란하지 않을 데이터는 없습니다. 디스크 장애로 인한 파일 손실뿐 아니라 조작 오류, 컴퓨터 다운 또는 소프트웨어 크래쉬로 인한 파일 손실, '버전 롤백'이 필요할 때 저장된 이전 버전이 없다면 매우 당황스럽습니다. 그러니 백업의 중요성은 두말할 필요도 없지요.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"백업이라고 하면 외장 하드 또는 LAN에 구축한 NAS 스토리지에 파일을 업로드하면 그만이라고 생각하는 사람이 많습니다. 정말 실제로도 이렇게 간단할까요?\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"백업은 사실 하나의 시스템 프로세스입니다. 파일을 백업 매체에 복사하는 것뿐만 아니라 백업 내용의 정확성도 검증해야 합니다. 복사와 검증은 파일 손실 시의 피해를 최소화할 수 있도록 정기적으로 실시해야 합니다. 또한 백업 매체도 점검이 필요하며, 손상된 디스크는 즉시 교체해야 합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"그렇다면 파일의 안전을 보장할 수 있는 간단한 방법은 없을까요? 답은 '있습니다'.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"클라우드 서비스가 발전함에 따라 신뢰할 만한 기업급 클라우드 스토리지 서비스가 생겨났고, Tencent Cloud COS 객체 스토리지가 바로 이런 서비스입니다. 속도를 높이고 비용을 절감하고자 하는 정부의 노력에 부응하여 더욱 빠르고 저렴한 광대역이 등장함으로써 클라우드 파일 백업은 이미 상용화되었습니다. 이제는 컴퓨터의 파일과 클라우드 스토리지를 연결하여 파일을 정기적으로 클라우드에 자동 백업하고 백업 파일의 정확성을 검증하는 소프트웨어가 필요합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"소프트웨어 소개\"}],\"nodeId\":\".EC.86.8C.ED.94.84.ED.8A.B8.EC.9B.A8.EC.96.B4-.EC.86.8C.EA.B0.9C\",\"type\":\"h2\"},{\"children\":[{\"children\":[{\"text\":\"Arq® Backup\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.arqbackup.com/\",\"props\":{\"type\":\"link\",\"url\":\"https://www.arqbackup.com/\"},\"type\":\"ref\"},{\"text\":\"은 Windows와 macOS 시스템을 지원하는 비즈니스 백업 소프트웨어입니다. 시스템 백그라운드에서 실행되며 설정에 따라 일정 시간마다 지정 디렉터리를 자동 백업하고, 매시간 파일을 백업해 두기 때문에 파일의 이전 버전을 쉽게 찾을 수 있습니다. 또한 시간마다 실행되는 백업은 변경 사항이 있는 파일만 백업하고 경로가 다른 중복 파일은 한 번만 백업함으로써 백업 용량을 최대한 작게, 백업 속도는 최대한 빠르게 합니다. 백업 파일을 네트워크로 전송하기 전, 소프트웨어는 네트워크 전송 과정 또는 클라우드 스토리지에서 도용되는 일이 없도록 사용자가 입력한 비밀번호를 바탕으로 백업 파일을 암호화하여 중요 데이터의 보안성을 보장합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"Arq® Backup 비즈니스 라이선스는 사용자 1명당 49.99USD입니다. 사용자는 구매 후 한 대의 컴퓨터에서 사용할 수 있습니다. 소프트웨어는 30일 무료 사용이 가능하므로 직접 사용해본 후 구매할 수도 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"Arq® Backup 소프트웨어는 현재 중국어 간체 버전이 없습니다. 소프트웨어의 다운로드, 구매 및 관련 설명은 해당 소프트웨어의 \"},{\"children\":[{\"text\":\"공식 홈페이지\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.arqbackup.com/\",\"props\":{\"type\":\"link\",\"url\":\"https://www.arqbackup.com/\"},\"type\":\"ref\"},{\"text\":\"에서 확인할 수 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"Tencent Cloud COS 준비\"}],\"nodeId\":\"tencent-cloud-cos-.EC.A4.80.EB.B9.84\",\"type\":\"h2\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"현재 COS를 사용 중인 경우 1-2단계는 생략합니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"children\":[{\"text\":\"Tencent Cloud 계정 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/378/17985\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/378/17985\"},\"type\":\"ref\"},{\"text\":\" 및 \"},{\"children\":[{\"text\":\"실명 인증\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/378/3629\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/378/3629\"},\"type\":\"ref\"},{\"text\":\"을 완료합니다. 실명 인증을 하지 않은 사용자는 중국 내 리소스를 구매할 수 없습니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\"},{\"text\":\"에 로그인하여 지시에 따라 COS를 활성화합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"COS 콘솔에서 왼쪽 메뉴의 \"},{\"b\":1,\"text\":\"버킷 리스트\"},{\"text\":\" 클릭 후 \"},{\"b\":1,\"text\":\"버킷 생성\"},{\"text\":\"을 클릭하여 버킷 생성을 시작합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"이름: 버킷 이름입니다(예: “backups”).\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"소속 리전: 귀하의 소재지와 가까운 곳을 선택할 수 있으나 금융 클라우드 리전은 선택하지 마십시오. 현재 서남 리전에 가격 할인 혜택이 있으므로 '청두' 또는 '충칭'을 선택하면 가격 할인 혜택을 받을 수 있습니다.\\n \"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/d9caa38d7216c4270ff2a0fc096405fa.png\"},{\"text\":\"\\n 기타 설정 항목은 기본값을 유지합니다. \"},{\"b\":1,\"text\":\"도메인 요청\"},{\"text\":\" 주소를 복사 및 저장한 후 \"},{\"b\":1,\"text\":\"확인\"},{\"text\":\"을 클릭하여 생성을 완료합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"자세한 버킷 생성 순서는 \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13309\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13309\"},\"type\":\"ref\"},{\"text\":\"을 참조하십시오.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"indent\":2,\"type\":\"hint\"},{\"children\":[{\"children\":[{\"text\":\"API Keys 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cam/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/capi\"},\"type\":\"ref\"},{\"text\":\"에 로그인하여 키 정보 SecretId와 SecretKey를 생성 및 기록합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/5a78bab4cb211503b5c3ff54e5551eb3.png\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"Arq® Backup 설치 및 설정\"}],\"nodeId\":\"arq.C2.AE-backup-.EC.84.A4.EC.B9.98-.EB.B0.8F-.EC.84.A4.EC.A0.95\",\"type\":\"h2\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"본 문서는 Windows의 Arq Backup 6.2.11 버전을 예시로 사용하였습니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"children\":[{\"text\":\"Arq® Backup 공식 홈페이지\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.arqbackup.com/\",\"props\":{\"type\":\"link\",\"url\":\"https://www.arqbackup.com/\"},\"type\":\"ref\"},{\"text\":\"에서 소프트웨어를 다운로드합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"지시에 따라 소프트웨어 설치를 완료하면 소프트웨어가 자동으로 실행됩니다. 최초 실행 시 로그인 알림이 뜹니다. 이때 이메일 주소를 입력하고 [Start Trial]을 클릭합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/b9ea1e5cebb30c96fe5894bb5adb7214.png\"},{\"text\":\"\\n3.\"},{\"b\":1,\"text\":\"Backup\"},{\"text\":\" 인터페이스에서\"},{\"b\":1,\"text\":\"Create a new backup plan\"},{\"text\":\" 을 클릭하고 백업 플랜을 추가합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/397c1b77f1a3871644ef9eec63ebda7e.png\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"리디렉션 인터페이스에서 백업할 디렉터리를 선택합니다. 전체 디스크 또는 지정 디렉터리를 선택할 수 있습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/410a0f1728cda892f375c89103b46531.png\"},{\"text\":\"\\n5.\"},{\"b\":1,\"text\":\"Add storage location\"},{\"text\":\" 을 클릭하고 아래 이미지와 같이 백업 스토리지 위치를 추가합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/a8d33f582c5600eec6c67893f2ee3c46.png\"},{\"text\":\"\\n6.\"},{\"b\":1,\"text\":\"S3-Compatible Server\"},{\"text\":\" 를 클릭합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/9d515b8ef332dc00a4f7a9277b70eef1.png\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"리디렉션 인터페이스에서 다음 설명에 따라 설정합니다. 설정 완료 후\"},{\"b\":1,\"text\":\"Continue\"},{\"text\":\" 를 클릭합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"Server URL: 위에 기록된 도메인 요청 중 \"},{\"code\":1,\"text\":\"cos\"},{\"text\":\"로 시작하면서 앞에 \"},{\"code\":1,\"text\":\"https://\"},{\"text\":\"가 있는 주소를 입력합니다(예: \"},{\"code\":1,\"text\":\"https://cos.ap-chengdu.myqcloud.com\"},{\"text\":\"). 버킷 이름은 포함되어 있지 않다는 것에 주의하십시오.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"Access Key ID: 위에 기록된 키 정보 중 SecretId입니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"Secret Access Key: 위에 기록된 키 정보 중 SecretKey입니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/bfe1454b37d756068a61050d4585e451.png\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"다음 인터페이스에서\"},{\"b\":1,\"text\":\"Use an existing bucket\"},{\"text\":\" 을 선택한 후 위에서 생성한 버킷(예: backups-1250000000)을 선택하고\"},{\"b\":1,\"text\":\"Save\"},{\"text\":\" 를 클릭합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/bcb5223dad1ac34ce642c0ecdff184b1.png\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"(옵션) 백업 데이터 암호화 여부를 선택합니다. \"},{\"b\":1,\"text\":\"활성화\"},{\"text\":\" 버튼을 선택합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/8744311c148e6ebbc2a35c230de76002.png\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"팝업 창에서 암호화에 사용되는 비밀번호를 설정합니다. 백업 파일 암호화에 사용되는 비밀번호를 두 번 입력하고\"},{\"b\":1,\"text\":\"OK\"},{\"text\":\" 를 클릭합니다. \"},{\"b\":1,\"text\":\"주의: 백업 비밀번호를 기억하지 않으면 백업에서 파일을 복구할 수 없습니다!\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/43213532f56da02450b1ea52321457c6.png\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"(옵션) 백업 주기를 설정합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/92a00ca49471007336c34471bec8fa6d.png\"},{\"text\":\"\\n12.\"},{\"b\":1,\"text\":\"Save\"},{\"text\":\" 를 클릭하여 설정을 저장한 후\"},{\"b\":1,\"text\":\"Back Up Now\"},{\"text\":\" 를 클릭하여 백업을 시작합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/65093effc29b66385f8ee20f293cde01.png\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"백업에서 파일 복구\"}],\"nodeId\":\".EB.B0.B1.EC.97.85.EC.97.90.EC.84.9C-.ED.8C.8C.EC.9D.BC-.EB.B3.B5.EA.B5.AC\",\"type\":\"h2\"},{\"children\":[{\"text\":\"메인 인터페이스 왼쪽 \"},{\"b\":1,\"text\":\"Backup\"},{\"text\":\" 리스트에서\"},{\"b\":1,\"text\":\"Restore\"},{\"text\":\" 를 클릭합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/844349292e7fd2d89441fe37c789349e.png\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"위의 9단계에서 백업 데이터 암호화를 설정한 경우 비밀번호를 입력해야 합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/41360bd0dbaa4b131a42d56d43d1eae5.png\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"복구할 디렉터리 또는 파일 및 복구한 디렉터리 또는 파일의 저장 위치를 선택한 후 \"},{\"b\":1,\"text\":\"Restore\"},{\"text\":\" 를 클릭하여 복구를 시작합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/513d4c1f317834a55d7ad1f1f93a3d80.png\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"복구 작업은 기본적으로 최신 백업에서 복구됩니다. 필요에 따라 스냅샷에서 이전 버전 백업을 찾아 이전 버전 백업에서 복구를 진행할 수도 있습니다.\"},{\"b\":1,\"text\":\"Snapshots\"},{\"text\":\" 를 클릭하여 이전 스냅샷을 조회합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/6c37ee6a7450dbf8ad1a7198b43ec247.png\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"이전 스냅샷을 선택합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/b1e02efe3b3e018a8cadd1a1203a6efa.png\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"복구할 디렉터리 또는 파일 및 복구한 디렉터리 또는 파일의 저장 위치를 선택한 후 \"},{\"b\":1,\"text\":\"Restore\"},{\"text\":\" 를 클릭하여 복구를 시작합니다. \"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"복구가 완료되었다는 인터페이스 안내가 뜨면 조금 전 지정한 디렉터리에서 복구된 파일을 확인할 수 있습니다.\"}],\"start\":false,\"type\":\"oli\"}]"}},"37881":{"categoryId":436,"weight":10,"type":"page","extension":"","pid":32969,"id":37881,"lang":"ko","title":"CDH용 COSN 구성","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-03 22:15:34","recentReleaseTime":"2021-03-03 22:15:34","content":{"title":"CDH용 COSN 구성","body":"

소개

CDH(Cloudera's Distribution, including Apache Hadoop)는 업계에서 각광받는 Hadoop의 릴리스 버전입니다. 본 문서에서는 CDH 환경에서의 COSN 스토리지 서비스 사용 방법을 안내합니다. 이를 통해 빅 데이터 연산 및 스토리지 분산을 구현함으로써 효율적인 저비용 빅 데이터 솔루션을 제공합니다.
설명:
본 문서에서 COSN은 COSN을 기반으로 구축된 파일 시스템인 Hadoop-COS를 의미합니다.
COSN 빅 데이터 모듈 지원 현황은 다음과 같습니다.
모듈 이름
COSN 빅 데이터 모듈 지원 현황
서비스 모듈 재시작 필요 여부
Yarn
지원
NodeManager 재시작
Hive
지원
HiveServer 및 HiveMetastore 재시작
Spark
지원
NodeManager 재시작
Sqoop
지원
NodeManager 재시작
Presto
지원
HiveServer, HiveMetastore, Presto 재시작
Flink
지원
필요 없음
Impala
지원
필요 없음
EMR
지원
필요 없음
자체구축 모듈
향후 지원
필요 없음
HBase
권장하지 않음
필요 없음

버전 종속

본 문서에 종속된 모듈 버전은 다음과 같습니다.
CDH 5.16.1
Hadoop 2.6.0

사용 방법

스토리지 환경 설정

1. CDH 관리 페이지에 로그인합니다.
2. 시스템 메인 페이지에서 설정>서비스 범위>고급을 선택하여 코드 스니펫 고급 설정 페이지로 이동하면 다음 그림과 같이 표시됩니다.\n
\"\"


3. Cluster-wide Advanced Configuration Snippet(Safety Valve) for core-site.xml 코드 창에 COSN 설정을 입력합니다.
<property>
<name>fs.cosn.userinfo.secretId</name>
<value>AK***</value>
</property>
<property>
<name>fs.cosn.userinfo.secretKey</name>
<value></value>
</property>
<property>
<name>fs.cosn.impl</name>
<value>org.apache.hadoop.fs.CosFileSystem</value>
</property>
<property>
<name>fs.AbstractFileSystem.cosn.impl</name>
<value>org.apache.hadoop.fs.CosN</value>
</property>
<property>
<name>fs.cosn.bucket.region</name>
<value>ap-shanghai</value>
</property>
다음은 COSN 필수 설정 항목(core-site.xml에 추가 필요)입니다. COSN의 기타 설정 항목은 Hadoop 툴 문서를 참고하십시오.
COSN 매개변수
설명
fs.cosn.userinfo.secretId
AKxxxx
Tencent Cloud 계정의 API 키 정보
fs.cosn.userinfo.secretKey
Wpxxxx
Tencent Cloud 계정의 API 키 정보
fs.cosn.bucket.region
ap-shanghai
COS 버킷이 있는 리전
fs.cosn.impl
org.apache.hadoop.fs.CosFileSystem
FileSystem용 cosn 구현 클래스. org.apache.hadoop.fs.CosFileSystem으로 고정
fs.AbstractFileSystem.cosn.impl
org.apache.hadoop.fs.CosN
AbstractFileSystem에 대한 cosn 구현 클래스. org.apache.hadoop.fs.CosN으로 고정
4. HDFS 서비스 작업을 진행하기 위해 클라이언트 배포 설정을 클릭하면 core-site.xml 설정이 클러스터 기기에 업데이트됩니다.
5. COSN 최신 SDK 패키지를 CDH HDFS 서비스의 jar 패키지 경로에 설치합니다. 다음 예시와 같이 실제 값에 따라 변경해 주십시오.
cp hadoop-cos-2.7.3-shaded.jar /opt/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hadoop-hdfs/
주의:
클러스터의 기기마다 동일한 위치에 SDK 패키지를 설치해야 합니다.

데이터 마이그레이션

Hadoop Distcp 툴을 사용해 CDH HDFS 데이터를 COSN에 마이그레이션합니다. 자세한 내용은 Hadoop 파일 시스템과 COS 간 데이터 마이그레이션을 참고하십시오.

빅 데이터 세트에서 COSN 사용하기

1. MapReduce

작업 단계
(1) 데이터 마이그레이션 섹션에 따라 HDFS 관련 설정을 완료하고, COSN의 SDK jar 패키지를 HDFS의 해당 디렉터리에 넣습니다.\n(2) CDH 시스템 메인 페이지에서 YARN을 찾아 NodeManager 서비스를 재시작합니다. TeraGen 명령어는 재시작할 필요가 없으나 TeraSort는 비즈니스 내부 로직으로 인해 NodeManger를 재시작해야 하므로, NodeManager 서비스를 일괄 재시작할 것을 권장합니다.
예시
Hadoop 표준 테스트의 TeraGen 및 TeraSort입니다.
hadoop jar ./hadoop-mapreduce-examples-2.7.3.jar teragen -Dmapred.job.maps=500 -Dfs.cosn.upload.buffer=mapped_disk -Dfs.cosn.upload.buffer.size=-1 1099 cosn://examplebucket-1250000000/terasortv1/1k-input

hadoop jar ./hadoop-mapreduce-examples-2.7.3.jar terasort -Dmapred.max.split.size=134217728 -Dmapred.min.split.size=134217728 -Dfs.cosn.read.ahead.block.size=4194304 -Dfs.cosn.read.ahead.queue.size=32 cosn://examplebucket-1250000000/terasortv1/1k-input cosn://examplebucket-1250000000/terasortv1/1k-output
설명:
cosn://schema 뒷부분을 사용자 빅 데이터 비즈니스의 버킷 경로로 변경하십시오.

2. Hive

2.1 MR 엔진
작업 단계
(1) 데이터 마이그레이션 섹션에 따라 HDFS 관련 설정을 완료하고, COSN의 SDK jar 패키지를 HDFS의 해당 디렉터리에 넣습니다.\n(2) CDH 메인 페이지에서 HIVE 서비스를 찾아 Hiveserver2와 HiverMetastore 역할을 재시작합니다.
예시
사용자의 실제 작업 쿼리입니다. Hive 명령 라인을 실행하여 Location을 생성하고, 이를 CHDFS의 파티션 테이블로 사용하는 경우입니다.
CREATE TABLE `report.report_o2o_pid_credit_detail_grant_daily`(
`cal_dt` string,
`change_time` string,
`merchant_id` bigint,
`store_id` bigint,
`store_name` string,
`wid` string,
`member_id` bigint,
`meber_card` string,
`nickname` string,
`name` string,
`gender` string,
`birthday` string,
`city` string,
`mobile` string,
`credit_grant` bigint,
`change_reason` string,
`available_point` bigint,
`date_time` string,
`channel_type` bigint,
`point_flow_id` bigint)
PARTITIONED BY (
`topicdate` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
'cosn://examplebucket-1250000000/user/hive/warehouse/report.db/report_o2o_pid_credit_detail_grant_daily'
TBLPROPERTIES (
'last_modified_by'='work',
'last_modified_time'='1589310646',
'transient_lastDdlTime'='1589310646')
sql 쿼리 실행:
select count(1) from report.report_o2o_pid_credit_detail_grant_daily;
모니터링 결과는 다음과 같습니다.\n
\"\"


2.2 Tez 엔진
Tez 엔진은 COSN의 jar 패키지를 Tez의 압축 패키지 내로 가져와야 합니다. 다음은 apache-tez.0.8.5를 예시로 한 설명입니다.
작업 단계
(1) CDH 클러스터에 설치한 tez 패키지를 찾은 후 압축을 해제합니다. /usr/local/service/tez/tez-0.8.5.tar.gz를 예로 들 수 있습니다.\n(2) COSN의 jar 패키지를 압축 해제한 디렉터리에 넣고 다시 하나의 압축 패키지로 만듭니다.\n(3) 새로 생성한 압축 패키지를 tez.lib.uris에서 지정한 경로(경로가 이미 있는 경우 변경 가능)에 업로드합니다.\n(4) CDH 메인 페이지에서 HIVE를 찾아 hiveserver와 hivemetastore를 재시작합니다.

3. Spark

작업 단계
(1) 데이터 마이그레이션 섹션에 따라 HDFS 관련 설정을 완료하고, COSN의 SDK jar 패키지를 HDFS의 해당 디렉터리에 넣습니다.\n(2) NodeManager 서비스를 재시작합니다.
예시
COSN에서 Spark example word count 테스트를 진행합니다.
spark-submit --class org.apache.spark.examples.JavaWordCount --executor-memory 4g --executor-cores 4 ./spark-examples-1.6.0-cdh5.16.1-hadoop2.6.0-cdh5.16.1.jar cosn://examplebucket-1250000000/wordcount
실행 결과는 다음과 같습니다.\n
\"\"



4. Sqoop

작업 단계
(1) 데이터 마이그레이션 섹션에 따라 HDFS 관련 설정을 완료하고, COSN의 SDK jar 패키지를 HDFS의 해당 디렉터리에 넣습니다.
(2) COSN의 SDK jar 패키지를 sqoop 디렉터리에 넣어야 합니다(예시: /opt/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/sqoop/).
(3) NodeManager 서비스를 재시작합니다.
예시
MYSQL 테이블을 COSN에 내보냅니다. Import/Export of Relational Database and HDFS 문서를 참고하여 테스트를 진행하십시오.
sqoop import --connect "jdbc:mysql://IP:PORT/mysql" --table sqoop_test --username root --password 123** --target-dir cosn://examplebucket-1250000000/sqoop_test
실행 결과는 다음과 같습니다.\n
\"\"



5. Presto

작업 단계
(1) 데이터 마이그레이션 섹션에 따라 HDFS 관련 설정을 완료하고, COSN의 SDK jar 패키지를 HDFS의 해당 디렉터리에 넣습니다.\n(2) COSN의 SDK jar 패키지를 presto 디렉터리에 넣어야 합니다(예시: /usr/local/services/cos_presto/plugin/hive-hadoop2).\n(3) presto는 hadoop common의 gson-2...jar를 로딩할 수 없으므로 gson-2...jar 또한 presto 디렉터리에 넣어야 합니다(예시: /usr/local/services/cos_presto/plugin/hive-hadoop2, CHDFS만 gson에 종속됨).\n(4) HiveServer, HiveMetaStore, Presto 서비스를 재시작합니다.
예시
HIVE에서 Location이 COSN인 테이블 쿼리를 생성합니다:
select * from cosn_test_table where bucket is not null limit 1;
설명:
cosn_test_table은 location이 cosn scheme인 테이블입니다.
쿼리 결과는 다음과 같습니다.\n
\"\"


","recentReleaseTime":"2025-11-12 11:26:16","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"XvwM6Za0JN0OXUHl75v9u\"},{\"children\":[{\"text\":\"CDH(Cloudera's Distribution, including Apache Hadoop)는 업계에서 각광받는 Hadoop의 릴리스 버전입니다. 본 문서에서는 CDH 환경에서의 COSN 스토리지 서비스 사용 방법을 안내합니다. 이를 통해 빅 데이터 연산 및 스토리지 분산을 구현함으로써 효율적인 저비용 빅 데이터 솔루션을 제공합니다.\"}],\"type\":\"p\",\"id\":\"_T0MSjf0LU3V93BNvPrGd\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"UrVv71-XoVQXGkzVS9Q__\"},{\"children\":[{\"text\":\"본 문서에서 COSN은 COSN을 기반으로 구축된 파일 시스템인 Hadoop-COS를 의미합니다.\"}],\"type\":\"p\",\"id\":\"5yDV2fGHy0N8djUesV-qu\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"KQLns52IkUeA5OT2AAUCg\"},{\"children\":[{\"text\":\"COSN 빅 데이터 모듈 지원 현황은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"LvedgMiVvuVfNAcz4RN3d\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"모듈 이름\"}],\"type\":\"p\",\"id\":\"w7ykmeW2IXhM3gS6Id9M6\"}],\"type\":\"cell\",\"id\":\"J0V80oMhUqetbakhiMB8l\"},{\"children\":[{\"children\":[{\"text\":\"COSN 빅 데이터 모듈 지원 현황\"}],\"type\":\"p\",\"id\":\"BKlMejuUykhseGW92nX8p\"}],\"type\":\"cell\",\"id\":\"Mwwzh9UubNyeND4J6LBz3\"},{\"children\":[{\"children\":[{\"text\":\"서비스 모듈 재시작 필요 여부\"}],\"type\":\"p\",\"id\":\"1KQ7RkTFMS-warzcIVb_W\"}],\"type\":\"cell\",\"id\":\"1EcFb_l-yAX9WKSeenc8e\"}],\"type\":\"row\",\"id\":\"kDQhWSbRwd62Y5vpxjBDo\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Yarn\"}],\"type\":\"p\",\"id\":\"sHF2RELXlwZcBNXqNxr75\"}],\"type\":\"p\",\"id\":\"HunHhmWSdWVj_tGXOZhzA\"}],\"type\":\"cell\",\"id\":\"aYWJzawVe-2eQP9bFnDGL\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"HR1EnLfeZrGdzuElCsEhB\"}],\"type\":\"p\",\"id\":\"8AXr9rHxDnI0txOW5FS_6\"}],\"type\":\"cell\",\"id\":\"ws4k_TIqEib1AlLc1k7pe\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"NodeManager 재시작\"}],\"type\":\"p\",\"id\":\"WDu1SFtHZ4_VOpsoJFv1s\"}],\"type\":\"p\",\"id\":\"3db0LtSgU-fkH29SlvkfM\"}],\"type\":\"cell\",\"id\":\"SL8Ni2PjJpMrMWNjLwmIb\"}],\"type\":\"row\",\"id\":\"A3_5Jz-gFdIZlRDV1Oy7F\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Hive\"}],\"type\":\"p\",\"id\":\"md-48VknGZ2g-XvNNZcoe\"}],\"type\":\"p\",\"id\":\"D43MBoFa0tXmb0J14HfZS\"}],\"type\":\"cell\",\"id\":\"bQsLIVDFBA4dAuF1u24Ea\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"Vsu6s6E2wba_rtLMGe36Q\"}],\"type\":\"p\",\"id\":\"Cax4_9I5iUKNzgxwz7TOB\"}],\"type\":\"cell\",\"id\":\"Cz_jU4AVxzIpKXvNc6Mwf\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"HiveServer 및 HiveMetastore 재시작\"}],\"type\":\"p\",\"id\":\"4dT2o1xjn7-0J8FgT3INz\"}],\"type\":\"p\",\"id\":\"iPwGrbT-iHt7xIcWEPhY_\"}],\"type\":\"cell\",\"id\":\"9SXfIK-9JxP-eazGU-my5\"}],\"type\":\"row\",\"id\":\"q2YV5oMvpfex7DFEE6hN7\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Spark\"}],\"type\":\"p\",\"id\":\"HJpyGTEtO4AR-LfqTrwhv\"}],\"type\":\"p\",\"id\":\"X-VhiRo7XB8TXHcYrMm5M\"}],\"type\":\"cell\",\"id\":\"6cjm7kECAKH4fhYas7Pim\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"lgwa0fNUZ-TkKFI-aYwEQ\"}],\"type\":\"p\",\"id\":\"zcJYwcXYQ1BCQtcK_5EhA\"}],\"type\":\"cell\",\"id\":\"cmLEKlDSZU-8g1WKZgcLC\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"NodeManager 재시작\"}],\"type\":\"p\",\"id\":\"u5nnmXXXfW7ownL9q1_md\"}],\"type\":\"p\",\"id\":\"hV3yq6YsrgPK7QoTsMm3B\"}],\"type\":\"cell\",\"id\":\"HUJoxrDE3Yv-1xING3Wds\"}],\"type\":\"row\",\"id\":\"77vViEADaN71GdnmBedwr\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Sqoop\"}],\"type\":\"p\",\"id\":\"t38vpveb9gp6Ya_hbxCGe\"}],\"type\":\"p\",\"id\":\"lq8v8RUeTPrHi7i6aV1_H\"}],\"type\":\"cell\",\"id\":\"hCebsgWqmoVWlOP7ivQHr\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"fy7UaGpMI6JkIAZzcFrv7\"}],\"type\":\"p\",\"id\":\"vt-teHlm11EJNluF8ezzV\"}],\"type\":\"cell\",\"id\":\"QeE8eUbqAYMBNmRl-ZBTT\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"NodeManager 재시작\"}],\"type\":\"p\",\"id\":\"irTbXu0LhqMxMuuXTfMfQ\"}],\"type\":\"p\",\"id\":\"DA5swHWgopoF6GHI5q2eN\"}],\"type\":\"cell\",\"id\":\"xFw46ayLhhFJ4aEUx5n-S\"}],\"type\":\"row\",\"id\":\"9QEXbC-XQPtAkabI4-KOA\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Presto\"}],\"type\":\"p\",\"id\":\"-PrABtaomu8mclFwXrzVz\"}],\"type\":\"p\",\"id\":\"hw4Xr5x_Kq34DF4iG5IOD\"}],\"type\":\"cell\",\"id\":\"o96tf4Pcl4pJvw_gePHH_\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"hFd0UMtIwaRfq0laFCYy8\"}],\"type\":\"p\",\"id\":\"s5ABwvzw_fsCE9d0l6MEb\"}],\"type\":\"cell\",\"id\":\"eZImv4Vn-5CjUJTaHcpYn\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"HiveServer, HiveMetastore, Presto 재시작\"}],\"type\":\"p\",\"id\":\"jmZYrTLL5HeFnZfG-Z0iX\"}],\"type\":\"p\",\"id\":\"HLMKedFWVuf-e6ssHFvOb\"}],\"type\":\"cell\",\"id\":\"ByAHcoUnXxt3BnqQtiBwo\"}],\"type\":\"row\",\"id\":\"0D3PSQSJXjW-N24FQY5XS\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Flink\"}],\"type\":\"p\",\"id\":\"W0hc7z7WbyljYieXDlyh7\"}],\"type\":\"p\",\"id\":\"I2QVpLQfr5ksYCgVkpoi0\"}],\"type\":\"cell\",\"id\":\"Dh_oJU0Uk60tTzmU4q4QM\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"F6ZLQiGOMwg4IoRYENuOp\"}],\"type\":\"p\",\"id\":\"Hn-LUyes_FHKlq4dUl88a\"}],\"type\":\"cell\",\"id\":\"y-OilZnrFUK8KPdGkLHi0\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"필요 없음\"}],\"type\":\"p\",\"id\":\"GkjPlhfYI6v6X-kfIbs55\"}],\"type\":\"p\",\"id\":\"8jHX41yJntxQR3TyXTTOZ\"}],\"type\":\"cell\",\"id\":\"l5zqLMFeHz0163Pn0BGWC\"}],\"type\":\"row\",\"id\":\"SKkW8xjaogxm4h2ZGOYGc\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Impala\"}],\"type\":\"p\",\"id\":\"gIged0Hxbx-U9sTkBw6nQ\"}],\"type\":\"p\",\"id\":\"VAUhkbPhyG9xs88yqI9lx\"}],\"type\":\"cell\",\"id\":\"7BAlOmp_QFuZP2Fm6PgNr\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"lh2M3r653iuu_ONYXk0NF\"}],\"type\":\"p\",\"id\":\"HY0rJdViJc-Au5xt2qfg-\"}],\"type\":\"cell\",\"id\":\"Z29_aV41m65TGByil1kwz\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"필요 없음\"}],\"type\":\"p\",\"id\":\"WOyQiOBvL6rLwOZg7MuL4\"}],\"type\":\"p\",\"id\":\"XQS2WquoqqwMt5ZWri100\"}],\"type\":\"cell\",\"id\":\"DIPHsu9c2cGEvlhYAZOqb\"}],\"type\":\"row\",\"id\":\"k8P-asUxC8z3Cae5ZFkQz\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"EMR\"}],\"type\":\"p\",\"id\":\"eY2r7-3ZtKuR5jL-8WuAx\"}],\"type\":\"p\",\"id\":\"eOvV2gI-qawx6aBVF-JJT\"}],\"type\":\"cell\",\"id\":\"lc3Ru1DySi563TP1QO9uO\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"iEBwRFqMjicnI3Y_c3B0S\"}],\"type\":\"p\",\"id\":\"g4oCV8I9Qnf5eg4WVG40W\"}],\"type\":\"cell\",\"id\":\"TWNQCNnruZqVuKZjUpeMJ\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"필요 없음\"}],\"type\":\"p\",\"id\":\"-5NiASkPMFHiDdcsbHDhq\"}],\"type\":\"p\",\"id\":\"Q4BOwWsuB5NTVmCduqmdk\"}],\"type\":\"cell\",\"id\":\"U1TM7oWX-5NJTNesqwTUn\"}],\"type\":\"row\",\"id\":\"T7nkW83cRadzARn-YJTog\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"자체구축 모듈\"}],\"type\":\"p\",\"id\":\"-gTCm1ChjEERuTl6ZyB30\"}],\"type\":\"p\",\"id\":\"0SEBfRsU2puETBwjaUZxl\"}],\"type\":\"cell\",\"id\":\"Keq6le-tns4RbWxmQjYha\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"향후 지원\"}],\"type\":\"p\",\"id\":\"v1244fEGNVZBrK7253EH4\"}],\"type\":\"p\",\"id\":\"yfhaC71J5Vub5Ky3aS3Vi\"}],\"type\":\"cell\",\"id\":\"Meye4zyMCqBkuVYgGtTUt\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"필요 없음\"}],\"type\":\"p\",\"id\":\"zgFr0-uFMBeKasy25j_Tk\"}],\"type\":\"p\",\"id\":\"hb42JLTQ81jBFbXK69Kop\"}],\"type\":\"cell\",\"id\":\"lCS67KOR-oBc7y_p_ctKv\"}],\"type\":\"row\",\"id\":\"JJfZrcUGTPN6yU8Y2Q_gQ\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"HBase\"}],\"type\":\"p\",\"id\":\"STVEHr42aY8vbGw74JnqP\"}],\"type\":\"p\",\"id\":\"TvPmO-rPCdPCiuTXNLvR0\"}],\"type\":\"cell\",\"id\":\"61Zd1kZ7x4uYhYwk7uiAv\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"권장하지 않음\"}],\"type\":\"p\",\"id\":\"pNK3TOGqJCaDrcAdFeIgf\"}],\"type\":\"p\",\"id\":\"uVaMp5Bx-7nefZ3NCL63X\"}],\"type\":\"cell\",\"id\":\"OSOI_iA9voHsINYtOeGO-\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"필요 없음\"}],\"type\":\"p\",\"id\":\"kcLV2hgTXxmMN-JHA9HX6\"}],\"type\":\"p\",\"id\":\"vjkv6zKz7GlIFlAkkDGHM\"}],\"type\":\"cell\",\"id\":\"sQQah6A1ihVUMwqAHZGZr\"}],\"type\":\"row\",\"id\":\"UGTjzquUNDyJvvQJhn-vA\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\",\"id\":\"Si_yLItdizEXtlLjp8m98\",\"widths\":[33.33,33.33,33.34],\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"버전 종속\"}],\"nodeId\":\".EB.B2.84.EC.A0.84-.EC.A2.85.EC.86.8D\",\"type\":\"h2\",\"id\":\"7LR_3zQQxazypdMmV0nCV\"},{\"children\":[{\"text\":\"본 문서에 종속된 모듈 버전은 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"cIIj0EDZ9GxmneY93yHhI\"},{\"children\":[{\"text\":\"CDH 5.16.1\"}],\"start\":false,\"type\":\"uli\",\"id\":\"xhZ3NN9daDYacl2HyVvwg\"},{\"children\":[{\"text\":\"Hadoop 2.6.0\"}],\"start\":false,\"type\":\"uli\",\"id\":\"zVdyXtIJA4jjx1jMnmWky\"},{\"children\":[{\"text\":\"사용 방법\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9-.EB.B0.A9.EB.B2.95\",\"type\":\"h2\",\"id\":\"r2VAUU2jPas9H5WHoKLRo\"},{\"children\":[{\"text\":\"스토리지 환경 설정\"}],\"nodeId\":\".EC.8A.A4.ED.86.A0.EB.A6.AC.EC.A7.80-.ED.99.98.EA.B2.BD-.EC.84.A4.EC.A0.95\",\"type\":\"h3\",\"id\":\"0N1_4fn3x5s9tRf9wys1M\"},{\"children\":[{\"text\":\"CDH 관리 페이지에 로그인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"Xb2J8EA79FdpvRbMPJAMs\"},{\"children\":[{\"text\":\"시스템 메인 페이지에서 \"},{\"b\":1,\"text\":\"설정\"},{\"text\":\">\"},{\"b\":1,\"text\":\"서비스 범위\"},{\"text\":\">\"},{\"b\":1,\"text\":\"고급\"},{\"text\":\"을 선택하여 코드 스니펫 고급 설정 페이지로 이동하면 다음 그림과 같이 표시됩니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/b9140a52292111ef9bc3525400456a87.png\",\"id\":\"3uQrl3DSwmmF2xiBrtQpd\",\"naturalSize\":[237,629],\"size\":[237,629]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"5xT7zstVr4u6hhakFtx0e\"},{\"children\":[{\"text\":\"Cluster-wide Advanced Configuration Snippet(Safety Valve) for core-site.xml 코드 창에 COSN 설정을 입력합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"rSy5oC5SVU7NJpBPe2z2q\"},{\"children\":[{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"x9f16rIaDx9SlLSIUelyU\"},{\"children\":[{\"text\":\"fs.cosn.userinfo.secretId\"}],\"type\":\"code-line\",\"id\":\"agnKaM72u9zNH_3TI43Yh\"},{\"children\":[{\"text\":\"AK***\"}],\"type\":\"code-line\",\"id\":\"xJDuFtQttBe_obWUooAXq\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"9HF8fh6HA7bPJlne3yiXS\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"Pr1NaG-tVIhtxVK2esi7X\"},{\"children\":[{\"text\":\"fs.cosn.userinfo.secretKey\"}],\"type\":\"code-line\",\"id\":\"00dK5Fa_J5lOBeJf5Fp2W\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"DEXKZVIOOFOeb8HaNTznP\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"ChNyUHWpBt2Wt8V08IRmg\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"E2YpHY9R8G12OWxhzFGYF\"},{\"children\":[{\"text\":\"fs.cosn.impl\"}],\"type\":\"code-line\",\"id\":\"0tCDrcBPIh2Uwcm9llwpP\"},{\"children\":[{\"text\":\"org.apache.hadoop.fs.CosFileSystem\"}],\"type\":\"code-line\",\"id\":\"GwlVha866qj5VOXwmVgYb\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"HdTunvfSKbxBGEavoXkrj\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"IUXWPqx3ha1F19zOu5sNh\"},{\"children\":[{\"text\":\"fs.AbstractFileSystem.cosn.impl\"}],\"type\":\"code-line\",\"id\":\"L9v3zisjGsmQ6ez7jBvPl\"},{\"children\":[{\"text\":\"org.apache.hadoop.fs.CosN\"}],\"type\":\"code-line\",\"id\":\"3Ov0WaC8uw93XVSTahfZ2\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"0ofy_ae1AI7vCStrWzJnp\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"RT73CszQA5tBaLZpjL_wo\"},{\"children\":[{\"text\":\"fs.cosn.bucket.region\"}],\"type\":\"code-line\",\"id\":\"DG5EoQr6Wlm6Ezl4vOaS8\"},{\"children\":[{\"text\":\"ap-shanghai\"}],\"type\":\"code-line\",\"id\":\"_BxkgWUIxskahh9c7OFti\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"HI5tdx7rHuxnQ-95Y8WQR\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"XX2V4MbhSObGNOowQEGNT\",\"autoWrap\":false},{\"children\":[{\"text\":\"다음은 COSN 필수 설정 항목(core-site.xml에 추가 필요)입니다. COSN의 기타 설정 항목은 \"},{\"children\":[{\"text\":\"Hadoop 툴\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/6884\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/6884\"},\"type\":\"ref\",\"id\":\"wPiTW-Sh7NbXmT9Bd2mlj\"},{\"text\":\" 문서를 참고하십시오.\"}],\"indent\":1,\"type\":\"p\",\"id\":\"c8NCKrOxjXP4_sCF78oW0\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"COSN 매개변수\"}],\"type\":\"p\",\"id\":\"3lxGyxFWEkJe7aYKGBeRX\"}],\"type\":\"cell\",\"id\":\"VpAYn_NwXTwtjWaVdfWnf\"},{\"children\":[{\"children\":[{\"text\":\"값\"}],\"type\":\"p\",\"id\":\"ypYJpO5FPEkcB5b3id9DV\"}],\"type\":\"cell\",\"id\":\"-IW7EHned7CSqHWporZz3\"},{\"children\":[{\"children\":[{\"text\":\"설명\"}],\"type\":\"p\",\"id\":\"7QsHCPYEDc-p3c3R12jrh\"}],\"type\":\"cell\",\"id\":\"Uob6kbtjg6tX_ZOZ6X1ng\"}],\"type\":\"row\",\"id\":\"VYFBMP4AqA5twqiMJd_c-\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"fs.cosn.userinfo.secretId\"}],\"type\":\"p\",\"id\":\"mtLmMI__iQKPvDxQN_c3v\"}],\"type\":\"cell\",\"id\":\"3UcYlw1ZlK0Z9Tv4tmo-L\"},{\"children\":[{\"children\":[{\"text\":\"AKxxxx\"}],\"type\":\"p\",\"id\":\"eRRjNpDWZzjB44iIMY4Pc\"}],\"type\":\"cell\",\"id\":\"d2EdyA6MP_kSKg8EKg2ds\"},{\"children\":[{\"children\":[{\"text\":\"Tencent Cloud 계정의 API 키 정보\"}],\"type\":\"p\",\"id\":\"6mJ9VDfX7Jar0U4NYK-wt\"}],\"type\":\"cell\",\"id\":\"T4iUry-i6jmSb7L6DdBZi\"}],\"type\":\"row\",\"id\":\"Y2iYuzqZ9-LsLUz_gTsUv\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"fs.cosn.userinfo.secretKey\"}],\"type\":\"p\",\"id\":\"7pne6_TVdq4t_qKh2FSuv\"}],\"type\":\"cell\",\"id\":\"KLqHqnkpaRXuzGg3xX-g1\"},{\"children\":[{\"children\":[{\"text\":\"Wpxxxx\"}],\"type\":\"p\",\"id\":\"N_Fb-qEkBUOt5Zi3Bw5CU\"}],\"type\":\"cell\",\"id\":\"RAYxUq4icuVVPDsWjWy_f\"},{\"children\":[{\"children\":[{\"text\":\"Tencent Cloud 계정의 API 키 정보\"}],\"type\":\"p\",\"id\":\"IsEkZ8RJ34pMyTOEjb8yx\"}],\"type\":\"cell\",\"id\":\"XtO_9oS1Q_3MdwoiR6Dx5\"}],\"type\":\"row\",\"id\":\"zubGl6rcXqrv32UNKbE0K\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"fs.cosn.bucket.region\"}],\"type\":\"p\",\"id\":\"NkpL9Eoe1nt9poYD7jTrC\"}],\"type\":\"cell\",\"id\":\"sFwFcav_UqixPA49nFfjc\"},{\"children\":[{\"children\":[{\"text\":\"ap-shanghai\"}],\"type\":\"p\",\"id\":\"il_J91ThX5mhDyiww6VnN\"}],\"type\":\"cell\",\"id\":\"KbYHH44zKGwgU5qYeJcJW\"},{\"children\":[{\"children\":[{\"text\":\"COS 버킷이 있는 리전\"}],\"type\":\"p\",\"id\":\"oRFU5WmNDJUFnk4Lnrjng\"}],\"type\":\"cell\",\"id\":\"kA-96xJf5pZb9XG2KyZUb\"}],\"type\":\"row\",\"id\":\"0tNR_pF_Axq1Te0i_5bst\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"fs.cosn.impl\"}],\"type\":\"p\",\"id\":\"Ilu7320uOgeAIaAmSBpAK\"}],\"type\":\"cell\",\"id\":\"iLlFiFYi2mpCjJK2MD9ib\"},{\"children\":[{\"children\":[{\"text\":\"org.apache.hadoop.fs.CosFileSystem\"}],\"type\":\"p\",\"id\":\"QrrH2HtqoaLtkSKNzNE8S\"}],\"type\":\"cell\",\"id\":\"QGLH36K555oLyVZ9a46gf\"},{\"children\":[{\"children\":[{\"text\":\"FileSystem용 cosn 구현 클래스. org.apache.hadoop.fs.CosFileSystem으로 고정\"}],\"type\":\"p\",\"id\":\"0Y3cFJ1dfmRLwN4iFsBYg\"}],\"type\":\"cell\",\"id\":\"I4-Bmn-2pjDRCCqHgJ4oV\"}],\"type\":\"row\",\"id\":\"vggSNJBhejCpnjUxlmKuB\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"fs.AbstractFileSystem.cosn.impl\"}],\"type\":\"p\",\"id\":\"GOWGPufukTevVPAo373kT\"}],\"type\":\"cell\",\"id\":\"kWRnVl54kIqsyxhM-O0cw\"},{\"children\":[{\"children\":[{\"text\":\"org.apache.hadoop.fs.CosN\"}],\"type\":\"p\",\"id\":\"Oe-LXPDBno-XhYnoffY_1\"}],\"type\":\"cell\",\"id\":\"nXReRp3EMdrpex11-XA9Q\"},{\"children\":[{\"children\":[{\"text\":\"AbstractFileSystem에 대한 cosn 구현 클래스. org.apache.hadoop.fs.CosN으로 고정\"}],\"type\":\"p\",\"id\":\"KT-Rzdo2MNDhYogP51nEG\"}],\"type\":\"cell\",\"id\":\"HHpDvwerXdm_T8_EWmmZ_\"}],\"type\":\"row\",\"id\":\"gx1d45FtIh5aanM3U4VrU\"}],\"rowHeader\":true,\"type\":\"table\",\"widths\":[],\"id\":\"PqimcILD40s_TTsIC7liu\"},{\"children\":[{\"text\":\"HDFS 서비스 작업을 진행하기 위해 클라이언트 배포 설정을 클릭하면 core-site.xml 설정이 클러스터 기기에 업데이트됩니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"pl5vmNA3Pz9qRprhTMHie\"},{\"children\":[{\"text\":\"COSN 최신 SDK 패키지를 CDH HDFS 서비스의 jar 패키지 경로에 설치합니다. 다음 예시와 같이 실제 값에 따라 변경해 주십시오.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"fDpYsSF8Y0_M9rd3_Lw5s\"},{\"children\":[{\"children\":[{\"text\":\"cp hadoop-cos-2.7.3-shaded.jar /opt/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hadoop-hdfs/\"}],\"type\":\"code-line\",\"id\":\"PZEV15T91Mhca-BwdVYGR\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"6ZH7tvZM88FndNChOjUGD\",\"autoWrap\":false},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"ID7IGI7AghD2z2SAfOkD7\"},{\"children\":[{\"text\":\"클러스터의 기기마다 동일한 위치에 SDK 패키지를 설치해야 합니다. \"}],\"type\":\"p\",\"id\":\"GvThzrPajiJ79UtR6Ph_8\"}],\"hintType\":\"alert\",\"indent\":1,\"type\":\"hint\",\"id\":\"w7RxKY-BqgAYhizZoknDG\"},{\"children\":[{\"text\":\"데이터 마이그레이션\"}],\"nodeId\":\"1\",\"type\":\"h3\",\"id\":\"g6mdkitz_ECDxGiNwZyMe\"},{\"children\":[{\"text\":\"Hadoop Distcp 툴을 사용해 CDH HDFS 데이터를 COSN에 마이그레이션합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"Hadoop 파일 시스템과 COS 간 데이터 마이그레이션\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/34076\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/34076\"},\"type\":\"ref\",\"id\":\"fpUOVbidYagYUeTnY6JFA\"},{\"text\":\"을 참고하십시오.\"}],\"type\":\"p\",\"id\":\"07viR-4kVrtdWQWYChKWM\"},{\"children\":[{\"text\":\"빅 데이터 세트에서 COSN 사용하기\"}],\"nodeId\":\".EB.B9.85-.EB.8D.B0.EC.9D.B4.ED.84.B0-.EC.84.B8.ED.8A.B8.EC.97.90.EC.84.9C-cosn-.EC.82.AC.EC.9A.A9.ED.95.98.EA.B8.B0\",\"type\":\"h3\",\"id\":\"JzyeT1C2aqLHlgbnmr7RM\"},{\"children\":[{\"text\":\"1. MapReduce\"}],\"nodeId\":\"1.-mapreduce\",\"type\":\"h4\",\"id\":\"SdFx2O5d1InbqpkzfEcV3\"},{\"children\":[{\"b\":1,\"text\":\"작업 단계\"}],\"type\":\"p\",\"id\":\"3ytP8Vkhi6IvBYanb2T0i\"},{\"children\":[{\"text\":\"(1) \"},{\"children\":[{\"text\":\"데이터 마이그레이션\"}],\"linkTarget\":\"self\",\"linkTitle\":\"#1\",\"props\":{\"type\":\"link\",\"url\":\"#1\"},\"type\":\"ref\",\"id\":\"apB0YST04jTcZ__CLkH83\"},{\"text\":\" 섹션에 따라 HDFS 관련 설정을 완료하고, COSN의 SDK jar 패키지를 HDFS의 해당 디렉터리에 넣습니다.\\n(2) CDH 시스템 메인 페이지에서 YARN을 찾아 NodeManager 서비스를 재시작합니다. TeraGen 명령어는 재시작할 필요가 없으나 TeraSort는 비즈니스 내부 로직으로 인해 NodeManger를 재시작해야 하므로, NodeManager 서비스를 일괄 재시작할 것을 권장합니다.\"}],\"type\":\"p\",\"id\":\"05I91tDcjNmM7jCHt8g_o\"},{\"children\":[{\"b\":1,\"text\":\"예시\"}],\"type\":\"p\",\"id\":\"3MNEr-NJxMv7-d4bhGcKW\"},{\"children\":[{\"text\":\"Hadoop 표준 테스트의 TeraGen 및 TeraSort입니다.\"}],\"type\":\"p\",\"id\":\"kMThZ9emvLRPePjYAESs3\"},{\"children\":[{\"children\":[{\"text\":\"hadoop jar ./hadoop-mapreduce-examples-2.7.3.jar teragen -Dmapred.job.maps=500 -Dfs.cosn.upload.buffer=mapped_disk -Dfs.cosn.upload.buffer.size=-1 1099 cosn://examplebucket-1250000000/terasortv1/1k-input\"}],\"type\":\"code-line\",\"id\":\"1vi8B_aMSbk94aWEY_1AP\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"So8oNW9pJgPCeSYuGj5ND\"},{\"children\":[{\"text\":\"hadoop jar ./hadoop-mapreduce-examples-2.7.3.jar terasort -Dmapred.max.split.size=134217728 -Dmapred.min.split.size=134217728 -Dfs.cosn.read.ahead.block.size=4194304 -Dfs.cosn.read.ahead.queue.size=32 cosn://examplebucket-1250000000/terasortv1/1k-input cosn://examplebucket-1250000000/terasortv1/1k-output\"}],\"type\":\"code-line\",\"id\":\"ex-pxN6eXMIZlobdgpDXY\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"KhjKMLjKOLcCc-1IS78Nh\",\"autoWrap\":false},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"L6P6kIgkoTjn6ouMsUNZP\"},{\"children\":[{\"code\":1,\"text\":\"cosn://schema\"},{\"text\":\" 뒷부분을 사용자 빅 데이터 비즈니스의 버킷 경로로 변경하십시오.\"}],\"type\":\"p\",\"id\":\"5bIQtGCdW0IaA_O9TTz3r\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"yTF6KSe-_bPgErkR9kL_Y\"},{\"children\":[{\"text\":\"2. Hive\"}],\"nodeId\":\"2.-hive\",\"type\":\"h4\",\"id\":\"YUV3fgGPQU2FXhOhSEL_K\"},{\"children\":[{\"text\":\"2.1 MR 엔진\"}],\"nodeId\":\"2.1-mr-.EC.97.94.EC.A7.84\",\"type\":\"h5\",\"id\":\"wG6TZQMlGP6btcU_4CvaG\"},{\"children\":[{\"b\":1,\"text\":\"작업 단계\"}],\"type\":\"p\",\"id\":\"f6TV3OCBRG7I8Uh8DAn53\"},{\"children\":[{\"text\":\"(1) \"},{\"children\":[{\"text\":\"데이터 마이그레이션\"}],\"linkTarget\":\"self\",\"linkTitle\":\"#1\",\"props\":{\"type\":\"link\",\"url\":\"#1\"},\"type\":\"ref\",\"id\":\"wN4nTpKXcZ9s0V5TOAg0g\"},{\"text\":\" 섹션에 따라 HDFS 관련 설정을 완료하고, COSN의 SDK jar 패키지를 HDFS의 해당 디렉터리에 넣습니다.\\n(2) CDH 메인 페이지에서 HIVE 서비스를 찾아 Hiveserver2와 HiverMetastore 역할을 재시작합니다.\"}],\"type\":\"p\",\"id\":\"l9S3cT3jS-WryD7ypa_Lv\"},{\"children\":[{\"b\":1,\"text\":\"예시\"}],\"type\":\"p\",\"id\":\"EzwnbzeKHpURfa_o3LTbF\"},{\"children\":[{\"text\":\"사용자의 실제 작업 쿼리입니다. Hive 명령 라인을 실행하여 Location을 생성하고, 이를 CHDFS의 파티션 테이블로 사용하는 경우입니다.\"}],\"type\":\"p\",\"id\":\"oFBiQVRoKksw5_iofzOEa\"},{\"children\":[{\"children\":[{\"text\":\"CREATE TABLE `report.report_o2o_pid_credit_detail_grant_daily`(\"}],\"type\":\"code-line\",\"id\":\"jqFrsN2g0EQPXAz8N7fTM\"},{\"children\":[{\"text\":\" `cal_dt` string,\"}],\"type\":\"code-line\",\"id\":\"UzHoFEPHysffuwPM6ZeQf\"},{\"children\":[{\"text\":\" `change_time` string,\"}],\"type\":\"code-line\",\"id\":\"Y51zPVbbV6xwz0tLuJvUc\"},{\"children\":[{\"text\":\" `merchant_id` bigint,\"}],\"type\":\"code-line\",\"id\":\"3lwKv2kafGarDAJuoXziM\"},{\"children\":[{\"text\":\" `store_id` bigint,\"}],\"type\":\"code-line\",\"id\":\"56LwcWxN6Hqp4OfoJb0Kr\"},{\"children\":[{\"text\":\" `store_name` string,\"}],\"type\":\"code-line\",\"id\":\"DzC_NJuLfUqW-W8gsFKPR\"},{\"children\":[{\"text\":\" `wid` string,\"}],\"type\":\"code-line\",\"id\":\"pSU8Uz2pKBuuumq313G7e\"},{\"children\":[{\"text\":\" `member_id` bigint,\"}],\"type\":\"code-line\",\"id\":\"DnWX6q6DgLi5UDMgGHT67\"},{\"children\":[{\"text\":\" `meber_card` string,\"}],\"type\":\"code-line\",\"id\":\"IXndyPHu4-X9U6XtKqEY4\"},{\"children\":[{\"text\":\" `nickname` string,\"}],\"type\":\"code-line\",\"id\":\"KBp4VBnsUZ8CY-i7hjqt3\"},{\"children\":[{\"text\":\" `name` string,\"}],\"type\":\"code-line\",\"id\":\"xUVLv8QzcTNILthAFtnoq\"},{\"children\":[{\"text\":\" `gender` string,\"}],\"type\":\"code-line\",\"id\":\"hP_8piB1QQId43NfDRBZK\"},{\"children\":[{\"text\":\" `birthday` string,\"}],\"type\":\"code-line\",\"id\":\"1T1vbNBbvQVR_cHDqMB6F\"},{\"children\":[{\"text\":\" `city` string,\"}],\"type\":\"code-line\",\"id\":\"bh4tTOx2PYutA7DwUGaBb\"},{\"children\":[{\"text\":\" `mobile` string,\"}],\"type\":\"code-line\",\"id\":\"Z5LgGdeEYWws7Asy3HsIE\"},{\"children\":[{\"text\":\" `credit_grant` bigint,\"}],\"type\":\"code-line\",\"id\":\"rP5JTWP50oG01E-Kkpt76\"},{\"children\":[{\"text\":\" `change_reason` string,\"}],\"type\":\"code-line\",\"id\":\"nFhQ-sBHj2krHq_9r7dL2\"},{\"children\":[{\"text\":\" `available_point` bigint,\"}],\"type\":\"code-line\",\"id\":\"P_39ZARjDEk5FfmBpc3HR\"},{\"children\":[{\"text\":\" `date_time` string,\"}],\"type\":\"code-line\",\"id\":\"FC4Gq7MkqYPdFCz2UsJYa\"},{\"children\":[{\"text\":\" `channel_type` bigint,\"}],\"type\":\"code-line\",\"id\":\"in9JhhYTbFyUBTELFqL0l\"},{\"children\":[{\"text\":\" `point_flow_id` bigint)\"}],\"type\":\"code-line\",\"id\":\"d1CnZDiWhXhQfBbvwI0cu\"},{\"children\":[{\"text\":\"PARTITIONED BY (\"}],\"type\":\"code-line\",\"id\":\"SwGxCYNHjrxsLIIhopnFe\"},{\"children\":[{\"text\":\" `topicdate` string)\"}],\"type\":\"code-line\",\"id\":\"U7ds5HU_0QS5qPxq0LtJJ\"},{\"children\":[{\"text\":\"ROW FORMAT SERDE\"}],\"type\":\"code-line\",\"id\":\"6tmkCKwyU-O8U9NVaucV2\"},{\"children\":[{\"text\":\" 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'\"}],\"type\":\"code-line\",\"id\":\"d7E-pD-k1IG1R3_MdMQj5\"},{\"children\":[{\"text\":\"STORED AS INPUTFORMAT\"}],\"type\":\"code-line\",\"id\":\"so0AL0DL5DWQS2E1IWR1_\"},{\"children\":[{\"text\":\" 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'\"}],\"type\":\"code-line\",\"id\":\"_Iy7UwcXdgPQKbHwkqBgC\"},{\"children\":[{\"text\":\" OUTPUTFORMAT\"}],\"type\":\"code-line\",\"id\":\"9F833nRfqCFqVgZ1fg1fv\"},{\"children\":[{\"text\":\" 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'\"}],\"type\":\"code-line\",\"id\":\"YS4HZ20P-S1oIm0Iqmxcq\"},{\"children\":[{\"text\":\"LOCATION\"}],\"type\":\"code-line\",\"id\":\"poG_YHgOMj98oCZna7Y83\"},{\"children\":[{\"text\":\" 'cosn://examplebucket-1250000000/user/hive/warehouse/report.db/report_o2o_pid_credit_detail_grant_daily'\"}],\"type\":\"code-line\",\"id\":\"UjBJY893AjCs48LI8lpP0\"},{\"children\":[{\"text\":\"TBLPROPERTIES (\"}],\"type\":\"code-line\",\"id\":\"1kZH-t2k3IiByydJfTFq8\"},{\"children\":[{\"text\":\" 'last_modified_by'='work',\"}],\"type\":\"code-line\",\"id\":\"xEIi6zdpD6f-zwrvc4wEm\"},{\"children\":[{\"text\":\" 'last_modified_time'='1589310646',\"}],\"type\":\"code-line\",\"id\":\"GDFpjnOL0PG6vIXqlQilH\"},{\"children\":[{\"text\":\" 'transient_lastDdlTime'='1589310646')\"}],\"type\":\"code-line\",\"id\":\"gUSLiAMpK2KzrbLw2LoCd\"}],\"language\":\"plaintext\",\"type\":\"code-block\",\"id\":\"Sl9GjLxozrmZdz0ImMtdE\",\"autoWrap\":false},{\"children\":[{\"text\":\"sql 쿼리 실행:\"}],\"type\":\"p\",\"id\":\"AzD2ZoSiJPFFBEJMukBJn\"},{\"children\":[{\"children\":[{\"text\":\"select count(1) from report.report_o2o_pid_credit_detail_grant_daily;\"}],\"type\":\"code-line\",\"id\":\"P5ohvOYIylmL_M7LcIDar\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"YP9o899VK_VwcMMw5MaF5\",\"autoWrap\":false},{\"children\":[{\"text\":\"모니터링 결과는 다음과 같습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/b91e7c70292111ef8b7b52540096e81f.png\",\"id\":\"LkRIHZ9Y2jl4vmaLG290h\",\"naturalSize\":[554,444],\"size\":[554,444]},{\"text\":\"\"}],\"type\":\"p\",\"id\":\"T960okKxHkTemV7uOGXmg\"},{\"children\":[{\"text\":\"2.2 Tez 엔진\"}],\"nodeId\":\"2.2-tez-.EC.97.94.EC.A7.84\",\"type\":\"h5\",\"id\":\"1ry9MgmGHlhoNY1oOW5tD\"},{\"children\":[{\"text\":\"Tez 엔진은 COSN의 jar 패키지를 Tez의 압축 패키지 내로 가져와야 합니다. 다음은 apache-tez.0.8.5를 예시로 한 설명입니다.\"}],\"type\":\"p\",\"id\":\"v39tjGU4c2w-LiHVtdzsp\"},{\"children\":[{\"b\":1,\"text\":\"작업 단계\"}],\"type\":\"p\",\"id\":\"fnY19I0hda_Sx9XZmi_cR\"},{\"children\":[{\"text\":\"(1) CDH 클러스터에 설치한 tez 패키지를 찾은 후 압축을 해제합니다. /usr/local/service/tez/tez-0.8.5.tar.gz를 예로 들 수 있습니다.\\n(2) COSN의 jar 패키지를 압축 해제한 디렉터리에 넣고 다시 하나의 압축 패키지로 만듭니다.\\n(3) 새로 생성한 압축 패키지를 tez.lib.uris에서 지정한 경로(경로가 이미 있는 경우 변경 가능)에 업로드합니다.\\n(4) CDH 메인 페이지에서 HIVE를 찾아 hiveserver와 hivemetastore를 재시작합니다.\"}],\"type\":\"p\",\"id\":\"cn3303P4nWyIn1gm_Xgvp\"},{\"children\":[{\"text\":\"3. Spark\"}],\"nodeId\":\"3.-spark\",\"type\":\"h4\",\"id\":\"-X5Szuq6CIDbMDtZIREQq\"},{\"children\":[{\"b\":1,\"text\":\"작업 단계\"}],\"type\":\"p\",\"id\":\"uzNfz0Qx7CU7mrqmNqt4v\"},{\"children\":[{\"text\":\"(1) \"},{\"children\":[{\"text\":\"데이터 마이그레이션\"}],\"linkTarget\":\"self\",\"linkTitle\":\"#1\",\"props\":{\"type\":\"link\",\"url\":\"#1\"},\"type\":\"ref\",\"id\":\"ZAXPDJDUAb8kgULo8kb8d\"},{\"text\":\" 섹션에 따라 HDFS 관련 설정을 완료하고, COSN의 SDK jar 패키지를 HDFS의 해당 디렉터리에 넣습니다.\\n(2) NodeManager 서비스를 재시작합니다.\"}],\"type\":\"p\",\"id\":\"bCNQgrJvT1-dts-arXFix\"},{\"children\":[{\"b\":1,\"text\":\"예시\"}],\"type\":\"p\",\"id\":\"s-C2q00QfnlocjOuL3SQw\"},{\"children\":[{\"text\":\"COSN에서 Spark example word count 테스트를 진행합니다.\"}],\"type\":\"p\",\"id\":\"bUt-ANmamgyMXvGBKszIi\"},{\"children\":[{\"children\":[{\"text\":\"spark-submit --class org.apache.spark.examples.JavaWordCount --executor-memory 4g --executor-cores 4 ./spark-examples-1.6.0-cdh5.16.1-hadoop2.6.0-cdh5.16.1.jar cosn://examplebucket-1250000000/wordcount\"}],\"type\":\"code-line\",\"id\":\"XEIqY0PoSH1VEyJcty7Co\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"IZDWUuvMdE-7QYW5LuTNp\",\"autoWrap\":false},{\"children\":[{\"text\":\"실행 결과는 다음과 같습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/b9179229292111efac39525400560de4.png\",\"id\":\"D41X4r-e1u3eIECwxhYDW\",\"naturalSize\":[941,546],\"size\":[941,546]},{\"text\":\"\"}],\"type\":\"p\",\"id\":\"-qeXdAfpEuHcEChnZBGEP\"},{\"children\":[{\"text\":\"4. Sqoop\"}],\"nodeId\":\"4.-sqoop\",\"type\":\"h4\",\"id\":\"lfQM7KxwzaZugOSLstX8G\"},{\"children\":[{\"b\":1,\"text\":\"작업 단계\"}],\"type\":\"p\",\"id\":\"YwY0tO7myyROuMyCKlEJv\"},{\"children\":[{\"text\":\"(1) \"},{\"children\":[{\"text\":\"데이터 마이그레이션\"}],\"linkTarget\":\"self\",\"linkTitle\":\"#1\",\"props\":{\"type\":\"link\",\"url\":\"#1\"},\"type\":\"ref\",\"id\":\"BhUrN2FpVc6Y_jc4jiIpE\"},{\"text\":\" 섹션에 따라 HDFS 관련 설정을 완료하고, COSN의 SDK jar 패키지를 HDFS의 해당 디렉터리에 넣습니다.\"}],\"type\":\"p\",\"id\":\"O0F6gcoFinwHPT2LVx3Ss\"},{\"children\":[{\"text\":\"(2) COSN의 SDK jar 패키지를 sqoop 디렉터리에 넣어야 합니다(예시: /opt/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/sqoop/).\"}],\"type\":\"p\",\"id\":\"qLABVQ8deq-0-k9Ni5H12\"},{\"children\":[{\"text\":\"(3) NodeManager 서비스를 재시작합니다.\"}],\"type\":\"p\",\"id\":\"iu-dz_N7FZwL_X_Vhgj6h\"},{\"children\":[{\"b\":1,\"text\":\"예시\"}],\"type\":\"p\",\"id\":\"LS531nAj_Vr8P3nPwpHfW\"},{\"children\":[{\"text\":\"MYSQL 테이블을 COSN에 내보냅니다. \"},{\"children\":[{\"text\":\"Import/Export of Relational Database and HDFS\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1026/31157\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1026/31157\"},\"type\":\"ref\",\"id\":\"wlGCr31SeJtMT3cRAogwp\"},{\"text\":\" 문서를 참고하여 테스트를 진행하십시오.\"}],\"type\":\"p\",\"id\":\"Tz6aiPRqBDlErw-pOxffy\"},{\"children\":[{\"children\":[{\"text\":\"sqoop import --connect \\\"jdbc:mysql://IP:PORT/mysql\\\" --table sqoop_test --username root --password 123** --target-dir cosn://examplebucket-1250000000/sqoop_test\"}],\"type\":\"code-line\",\"id\":\"b3B_GAyTIc9DmChTVBjBy\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"VWj47N1Skx37Z6fxC0DT4\",\"autoWrap\":false},{\"children\":[{\"text\":\"실행 결과는 다음과 같습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/b9367c32292111ef9aab5254004556a0.png\",\"id\":\"LLpGCLx1ShvwMnlQ0NGBA\",\"naturalSize\":[907,699],\"size\":[907,699]},{\"text\":\"\"}],\"type\":\"p\",\"id\":\"2ukFdPLfWUDGTADoOKuKe\"},{\"children\":[{\"text\":\"5. Presto\"}],\"nodeId\":\"5.-presto\",\"type\":\"h4\",\"id\":\"7zx2zaGKAa6IS-wo8kXBG\"},{\"children\":[{\"b\":1,\"text\":\"작업 단계\"}],\"type\":\"p\",\"id\":\"lwEX-l96onHEqlME_XSBM\"},{\"children\":[{\"text\":\"(1) \"},{\"children\":[{\"text\":\"데이터 마이그레이션\"}],\"linkTarget\":\"self\",\"linkTitle\":\"#1\",\"props\":{\"type\":\"link\",\"url\":\"#1\"},\"type\":\"ref\",\"id\":\"OLr0-LeGAFzrBv_SadJ68\"},{\"text\":\" 섹션에 따라 HDFS 관련 설정을 완료하고, COSN의 SDK jar 패키지를 HDFS의 해당 디렉터리에 넣습니다.\\n(2) COSN의 SDK jar 패키지를 presto 디렉터리에 넣어야 합니다(예시: /usr/local/services/cos_presto/plugin/hive-hadoop2).\\n(3) presto는 hadoop common의 gson-2.\"},{\"i\":1,\"text\":\".\"},{\"text\":\".jar를 로딩할 수 없으므로 gson-2.\"},{\"i\":1,\"text\":\".\"},{\"text\":\".jar 또한 presto 디렉터리에 넣어야 합니다(예시: /usr/local/services/cos_presto/plugin/hive-hadoop2, CHDFS만 gson에 종속됨).\\n(4) HiveServer, HiveMetaStore, Presto 서비스를 재시작합니다.\"}],\"type\":\"p\",\"id\":\"V1Eg5gK65TAqYZYRv4jiC\"},{\"children\":[{\"b\":1,\"text\":\"예시\"}],\"type\":\"p\",\"id\":\"900HY0_i9GFOMqAIwAa2n\"},{\"children\":[{\"text\":\"HIVE에서 Location이 COSN인 테이블 쿼리를 생성합니다:\"}],\"type\":\"p\",\"id\":\"5uGaD7g6ri-ftOQGGqW-P\"},{\"children\":[{\"children\":[{\"text\":\"select * from cosn_test_table where bucket is not null limit 1;\"}],\"type\":\"code-line\",\"id\":\"vJZ7Gcp1I6mvQ4MVCqFIM\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"UZoZRyvxc76CWCBrdZsAX\",\"autoWrap\":false},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"N0lzUzISDtmx2UUC0qrw2\"},{\"children\":[{\"text\":\"cosn_test_table은 location이 cosn scheme인 테이블입니다.\"}],\"type\":\"p\",\"id\":\"Z-dQThmNOXzkm9Uwcs8Zi\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"Uk2W2LzlegV-glTZu6vEf\"},{\"children\":[{\"text\":\"쿼리 결과는 다음과 같습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/b92907c2292111efac39525400560de4.png\",\"id\":\"E_aRfUpEDebDCm3sGP51o\",\"naturalSize\":[936,168],\"size\":[936,168]},{\"text\":\"\"}],\"type\":\"p\",\"id\":\"mcmPQxynlaHV-WLQ1eAtQ\"}]"}},"38298":{"categoryId":436,"weight":60,"type":"page","extension":"","pid":32735,"id":38298,"lang":"ko","title":"COS 스트레스 테스트 가이드","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-03 23:00:51","recentReleaseTime":"2021-03-03 23:00:51","content":{"title":"COS 스트레스 테스트 가이드","body":"

COSBench 소개

COSBench는 Intel의 오픈 소스로서 COS의 부하 테스트 툴로 사용됩니다. Tencent Cloud Object Storage, COS)는 S3 프로토콜과 호환되는 COS 시스템으로서 COSBench를 사용해 읽기/쓰기 성능에 대한 부하 테스트를 실시할 수 있습니다.

시스템 환경

CentOS 7.0 이상에서 COSBench를 실행하는 것이 좋습니다. ubuntu에서 실행하면 예상치 못한 문제가 발생할 수 있습니다.

성능 영향 요인

CPU 코어: 많은 수의 실행 중인 worker와 결합된 적은 수의 CPU 코어는 컨텍스트 전환에 높은 오버헤드를 유발할 가능성이 큽니다. 따라서 테스트에는 32개 또는 64개의 코어가 권장됩니다.
NIC: 서버로부터의 아웃바운드 트래픽이 제한됩니다. 대용량 파일에 대한 트래픽을 테스트하려면 10GB 이상의 NIC가 권장됩니다.
네트워크 링크: 공중망 링크는 품질이 다릅니다. 공중망을 통한 다운로드를 위한 공중망 다운스트림 트래픽에 대해 요금이 부과됩니다. 따라서 동일한 리전 내에서 액세스하기 위해서는 사설망을 권장합니다.
테스트 기간: 신뢰할 수 있는 값을 얻으려면 더 긴 테스트 기간을 권장합니다.
테스트 환경: 프로그램에서 실행 중인 JDK 버전도 핵심 성능 요소입니다. 예를 들어, 이전 JDK 버전을 사용하여 HTTPS에서 테스트할 때 암호화 알고리즘에 대한 GCM BUG와 난수 생성기의 잠금 문제가 발생할 수 있습니다.

COSBench 실행 단계

1. GitHub에서 COSBench 0.4.2.c4.zip을 다운로드하고 서버에서 압축을 해제합니다.
2. COSBench의 종속 라이브러리를 설치한 뒤 다음 명령어를 실행합니다.
centos의 경우 다음 명령을 실행하여 종속성을 설치합니다:
sudo yum install nmap-ncat java curl java-1.8.0-openjdk-devel -y
ubuntu의 경우 다음 명령을 실행하여 종속성을 설치합니다.
sudo apt install nmap openjdk-8-jdk
3. s3-config-sample.xml 파일을 편집하여 작업 설정 정보를 추가합니다. 작업 설정 시 다음 다섯 단계를 주로 포함합니다.
init 단계: 버킷을 생성합니다.
prepare 단계: worker 스레드, main단계에서 읽어오기 위해 PUT 업로드 시 객체 크기를 지정합니다.
main 단계: worker 스레드, 읽기/쓰기 객체를 혼합하고, 실행 시간을 지정합니다.
cleanup 단계: 생성된 객체를 삭제합니다.
dispose 단계: 버킷을 삭제합니다.
설정 예시는 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8" ?>
<workload name="s3-50M-sample" description="sample benchmark for s3">

<storage type="s3" config="accesskey=************************************;secretkey=************************************;endpoint=http://cos.ap-beijing.myqcloud.com" />

<workflow>

<workstage name="init">
<work type="init" workers="10" config="cprefix=examplebucket;csuffix=-1250000000;containers=r(1,10)" />
</workstage>

<workstage name="prepare">
<work type="prepare" workers="100" config="cprefix=examplebucket;csuffix=-1250000000;containers=r(1,10);objects=r(1,1000);sizes=c(50)MB" />
</workstage>

<workstage name="main">
<work name="main" workers="100" runtime="300">
<operation type="read" ratio="50" config="cprefix=examplebucket;csuffix=-1250000000;containers=u(1,10);objects=u(1,1000)" />
<operation type="write" ratio="50" config="cprefix=examplebucket;csuffix=-1250000000;containers=u(1,10);objects=u(1000,2000);sizes=c(50)MB" />
</work>
</workstage>

<workstage name="cleanup">
<work type="cleanup" workers="10" config="cprefix=examplebucket;csuffix=-1250000000;containers=r(1,10);objects=r(1,2000)" />
</workstage>

<workstage name="dispose">
<work type="dispose" workers="10" config="cprefix=examplebucket;csuffix=-1250000000;containers=r(1,10)" />
</workstage>

</workflow>

</workload>
매개변수 설명:
매개변수
설명
accesskey, secretkey
키 정보. 리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한의 원칙을 따르는 것이 좋습니다. 서브 계정 키를 얻는 방법에 대한 자세한 내용은 Access Key를 참고하십시오
cprefix
examplebucket과 같은 버킷 이름 접두사
containers
버킷 이름의 값 범위. 버킷 이름은 examplebucket1 또는 examplebucket2와 같은 cprefix와 containers로 구성됩니다
csuffix
APPID. APPID에는 -1250000000과 같이 - 접두사가 붙습니다
runtime
스트레스 테스트 기간
ratio
읽기 대 쓰기 비율
workers
스트레스 테스트 스레드 수
4. cosbench-start.sh 파일을 편집하여 Java에서 다음 매개변수로 행 추가를 실행하고, s3의 md5 인증 기능을 비활성화합니다.
-Dcom.amazonaws.services.s3.disableGetObjectMD5Validation=true

\"\"


5. cosbench 서비스를 시작합니다.
centos의 경우 다음 명령을 실행합니다.
sudo bash start-all.sh
ubuntu의 경우 다음 명령을 실행합니다.
sudo bash start-driver.sh &sudo bash start-controller.sh &
6. 다음 명령어를 실행하여 작업을 제출합니다.
sudo bash cli.sh submit conf/s3-config-sample.xml
URL `http://ip:19088/controller/index.html`(ip는 사용자의 부하 테스트 기기 IP로 대체)에서 실행 상태를 조회합니다.

\"\"


이때 다음 이미지와 같이 다섯 단계로 실행되는 것을 확인할 수 있습니다.

\"\"


7. 다음은 소속 리전이 베이징이며, 32코어, 사설망 대역폭 17Gbps인 CVM에 대한 업로드 및 다운로드 성능 테스트 예시로, 두 단계를 포함하고 있습니다.
prepare 단계: worker 스레드가 100개이며, 50MB 객체를 1000개 업로드합니다.
main 단계: 100개의 worker 스레드가 300초 동안 읽기/쓰기 객체를 혼합합니다.
위와 같은 두 단계의 성능 테스트 결과는 다음과 같습니다.

\"\"


8. 다음 명령어를 실행하여 테스트 서비스를 중지합니다.
sudo bash stop-all.sh

","recentReleaseTime":"2024-11-19 17:08:27","slate":"[{\"children\":[{\"text\":\"COSBench 소개\"}],\"nodeId\":\"cosbench-.EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"x5UPSLjICADfRSTCWEVZb\"},{\"children\":[{\"text\":\"COSBench는 Intel의 오픈 소스로서 COS의 부하 테스트 툴로 사용됩니다. Tencent Cloud Object Storage, COS)는 S3 프로토콜과 호환되는 COS 시스템으로서 COSBench를 사용해 읽기/쓰기 성능에 대한 부하 테스트를 실시할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"eYnSw2g3N3pQIx13N8Jf8\"},{\"children\":[{\"text\":\"시스템 환경\"}],\"nodeId\":\".EC.8B.9C.EC.8A.A4.ED.85.9C-.ED.99.98.EA.B2.BD\",\"type\":\"h2\",\"id\":\"7_qiE78uCpAH44Lb3gEcN\"},{\"children\":[{\"text\":\"CentOS 7.0 이상에서 COSBench를 실행하는 것이 좋습니다. ubuntu에서 실행하면 예상치 못한 문제가 발생할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"FDlrSJjym-a-cIMpHm3sp\"},{\"children\":[{\"text\":\"성능 영향 요인\"}],\"nodeId\":\".EC.84.B1.EB.8A.A5-.EC.98.81.ED.96.A5-.EC.9A.94.EC.9D.B8\",\"type\":\"h2\",\"id\":\"ZlPVd-vK7cqN06Uz5SGZo\"},{\"children\":[{\"b\":1,\"text\":\"CPU 코어\"},{\"text\":\": 많은 수의 실행 중인 worker와 결합된 적은 수의 CPU 코어는 컨텍스트 전환에 높은 오버헤드를 유발할 가능성이 큽니다. 따라서 테스트에는 32개 또는 64개의 코어가 권장됩니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"Js0ot25GH5BSNtaYT1YFa\"},{\"children\":[{\"b\":1,\"text\":\"NIC\"},{\"text\":\": 서버로부터의 아웃바운드 트래픽이 제한됩니다. 대용량 파일에 대한 트래픽을 테스트하려면 10GB 이상의 NIC가 권장됩니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"0uPHPT2kGj_QCd2Oec5Bd\"},{\"children\":[{\"b\":1,\"text\":\"네트워크 링크\"},{\"text\":\": 공중망 링크는 품질이 다릅니다. 공중망을 통한 다운로드를 위한 공중망 다운스트림 트래픽에 대해 요금이 부과됩니다. 따라서 동일한 리전 내에서 액세스하기 위해서는 사설망을 권장합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"EC7sxdO6SHCz7hZvx9fum\"},{\"children\":[{\"b\":1,\"text\":\"테스트 기간\"},{\"text\":\": 신뢰할 수 있는 값을 얻으려면 더 긴 테스트 기간을 권장합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"ey_x7e1XGYYbXf5P9iwbT\"},{\"children\":[{\"b\":1,\"text\":\"테스트 환경\"},{\"text\":\": 프로그램에서 실행 중인 JDK 버전도 핵심 성능 요소입니다. 예를 들어, 이전 JDK 버전을 사용하여 HTTPS에서 테스트할 때 암호화 알고리즘에 대한 \"},{\"children\":[{\"text\":\"GCM BUG\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://bugs.openjdk.java.net/browse/JDK-8201633\",\"props\":{\"type\":\"link\",\"url\":\"https://bugs.openjdk.java.net/browse/JDK-8201633\"},\"type\":\"ref\",\"id\":\"AIBnhEe-OkCAdGtHSeaVG\"},{\"text\":\"와 난수 생성기의 잠금 문제가 발생할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"TgHyDqLpsH7hktyCKg32r\"},{\"children\":[{\"text\":\"COSBench 실행 단계\"}],\"nodeId\":\"cosbench-.EC.8B.A4.ED.96.89-.EB.8B.A8.EA.B3.84\",\"type\":\"h2\",\"id\":\"7YEKzKlwHjtyVo1XZEvNi\"},{\"children\":[{\"children\":[{\"text\":\"GitHub\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/intel-cloud/cosbench/releases/tag/v0.4.2.c4\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/intel-cloud/cosbench/releases/tag/v0.4.2.c4\"},\"type\":\"ref\",\"id\":\"kD3g7dCGs9Zi5VFAxgLRR\"},{\"text\":\"에서 COSBench 0.4.2.c4.zip을 다운로드하고 서버에서 압축을 해제합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"Dy6kHIW4YQZeQhmhP0Kcr\"},{\"children\":[{\"text\":\"COSBench의 종속 라이브러리를 설치한 뒤 다음 명령어를 실행합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"UxTjKfAlfhLQjB9K3ff33\"},{\"children\":[{\"text\":\"centos의 경우 다음 명령을 실행하여 종속성을 설치합니다:\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"9qO7-mKoSZrCcDdJcy3cj\"},{\"children\":[{\"children\":[{\"text\":\"sudo yum install nmap-ncat java curl java-1.8.0-openjdk-devel -y\"}],\"type\":\"code-line\",\"id\":\"Jywd5ihzm0TWEC_C42c_G\"}],\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"LUzPaH0nHEuvLDXou9Up1\",\"autoWrap\":false},{\"children\":[{\"text\":\"ubuntu의 경우 다음 명령을 실행하여 종속성을 설치합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"t9QwBRORHjGTPeCVzY1T8\"},{\"children\":[{\"children\":[{\"text\":\"sudo apt install nmap openjdk-8-jdk \"}],\"type\":\"code-line\",\"id\":\"9kH2NZ9hYRru8iTkaiPtd\"}],\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"nFbeQ0Hm9p6neeKk7Nsz8\",\"autoWrap\":false},{\"children\":[{\"text\":\"s3-config-sample.xml 파일을 편집하여 작업 설정 정보를 추가합니다. 작업 설정 시 다음 다섯 단계를 주로 포함합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"SSTL5GdeVihWX3_GsxA6r\"},{\"children\":[{\"text\":\"init 단계: 버킷을 생성합니다.\"}],\"indent\":1,\"start\":true,\"type\":\"uli\",\"id\":\"PLOIUpgV7GFFL90MMw2MN\"},{\"children\":[{\"text\":\"prepare 단계: worker 스레드, main단계에서 읽어오기 위해 PUT 업로드 시 객체 크기를 지정합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"TKVOc5jE8hi-7X21GGSqD\"},{\"children\":[{\"text\":\"main 단계: worker 스레드, 읽기/쓰기 객체를 혼합하고, 실행 시간을 지정합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"ODLCaun3UUsqtgblO9ctf\"},{\"children\":[{\"text\":\"cleanup 단계: 생성된 객체를 삭제합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"xuD1mOj2Vamu-t3-b1Wgd\"},{\"children\":[{\"text\":\"dispose 단계: 버킷을 삭제합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"XFDCeqPi8o9jbgABFxfXG\"},{\"children\":[{\"text\":\"설정 예시는 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"EqTQhTXBUFN_48CN93MPu\",\"indent\":1},{\"children\":[{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"VDaxSb065hJK8GD4FuYEf\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"AwYIuNnpl-GJHIUf96mef\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"XRGgfsQs_a8PBkRenBv8p\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"uDr0AGJonmaANUWicWDPS\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"YfuThwiV28EVwvwM11mzz\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"H6rtZ-TISsEZscbHa4Z3T\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"lIjsZac3UtbS7gy4hvDsv\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"B_MgqDYsxj555Xmcs4UYS\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"-asW8lBobdJpyYze0MJEi\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"mgr3E9isqEsXOdCLR4wEw\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"KLVJz1kDSeQtvldBmV381\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"ipqjpWL0xwAcRZqwAEv8g\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"gdsr_zkxpPqKXtpQj_CLs\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"u-DFO0cQXGpqz3yMRy5Z9\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"IhY3dTaDgKfGwHMxNYPc5\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"PZctKbtxhcbjtVaXhIbou\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"6PagtcY1c8nPcV0SORh1T\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"0Ce_JbuA0YW6KZ7Lh-225\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"15hn7EMhDt1EPQb2n_Qwx\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"Z3u6FQ02Jz3fNUL6WN13k\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"uou3mPwCOH9Nf8opRXwf-\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"ZjO_aE1v06_WkvwNjn1Lz\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"F_is4bYsTJ9OJJBT6Ubzc\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"olTF0Jcvl0B0dyFSsZVPC\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"zeO82u6IbSLpdW-FyehvW\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"ah-wCktUt0laFH3RdUQmA\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"GTJe8ya1_5XMWtkfIMxP6\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"nA4k1p-EvjcJDjseT3I5L\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"46bq2BJSqzRZ6ysa3mhN0\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"OTPLVuJdHT4L5wJnJZHmt\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"q1WVbkStD8VpAKZh-7jWS\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"CIRnVNtB6nld3T4NTxfNy\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"R9qJ0hkaQl_DNAh5MqZTH\"}],\"language\":\"shell\",\"type\":\"code-block\",\"id\":\"X19NPmPdFuej06MLaUPNz\",\"autoWrap\":false,\"indent\":1},{\"children\":[{\"b\":1,\"text\":\"매개변수 설명:\"}],\"type\":\"p\",\"id\":\"vAD3RQ7CBuFwt6atq6oxV\",\"indent\":1},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"매개변수\"}],\"type\":\"p\",\"id\":\"3gS3h4_s7X2jifudaPA4M\"}],\"type\":\"cell\",\"id\":\"UuQEdKnolw2qKnHRp9O2E\"},{\"children\":[{\"children\":[{\"text\":\"설명\"}],\"type\":\"p\",\"id\":\"JzyxKv7pvwYdKuW-4Gfxh\"}],\"type\":\"cell\",\"id\":\"2kkxfXZZk8hEfugGkL6fd\"}],\"type\":\"row\",\"id\":\"rMRyhv2fWgutJsqXn3uvP\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"accesskey, secretkey\"}],\"type\":\"p\",\"id\":\"6gDlTvasu7BcQ7aVAw21y\"}],\"type\":\"cell\",\"id\":\"zhORPgbGDYXToN2QxTz2G\"},{\"children\":[{\"children\":[{\"text\":\"키 정보. 리스크를 줄이기 위해 서브 계정 키를 사용하고 \"},{\"children\":[{\"text\":\"최소 권한의 원칙\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/32972\"},\"type\":\"ref\",\"id\":\"VCMHxxV3aVrW8mNNoCNHr\"},{\"text\":\"을 따르는 것이 좋습니다. 서브 계정 키를 얻는 방법에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"Access Key\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/598/32675\"},\"type\":\"ref\",\"id\":\"aVFxvmh8sE3la_BBDg5UO\"},{\"text\":\"를 참고하십시오\"}],\"type\":\"p\",\"id\":\"EhLRS7nLrZJq7K5LzxERj\"}],\"type\":\"cell\",\"id\":\"NrVMrgthl5RPpAPcG4MEp\"}],\"type\":\"row\",\"id\":\"uON4mH1KEt-wWFUjyNlwe\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"cprefix\"}],\"type\":\"p\",\"id\":\"K4K7efPcD7MUl-QDd8q5A\"}],\"type\":\"cell\",\"id\":\"7Z8Rk1pb323eYvfYiTi0C\"},{\"children\":[{\"children\":[{\"text\":\"examplebucket과 같은 버킷 이름 접두사\"}],\"type\":\"p\",\"id\":\"B-Zpyd-qlY32l281Ktke4\"}],\"type\":\"cell\",\"id\":\"hRmI1_M_qe5HgPKL4_Y6I\"}],\"type\":\"row\",\"id\":\"U0TlOOQ1IcLutsDyHA6IH\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"containers\"}],\"type\":\"p\",\"id\":\"fZC7EcMUW4Df2QuvyysPi\"}],\"type\":\"cell\",\"id\":\"fveNeiN5xhhi3iVyXinQj\"},{\"children\":[{\"children\":[{\"text\":\"버킷 이름의 값 범위. 버킷 이름은 examplebucket1 또는 examplebucket2와 같은 cprefix와 containers로 구성됩니다\"}],\"type\":\"p\",\"id\":\"17UgQiYY7Bple4PSnE3o5\"}],\"type\":\"cell\",\"id\":\"UzjRrGjlst7CBez8edbaZ\"}],\"type\":\"row\",\"id\":\"x_Z7GHbnfQOrQwThFOV7R\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"csuffix\"}],\"type\":\"p\",\"id\":\"BoyKmkB7Azy9VM-4oT8CZ\"}],\"type\":\"cell\",\"id\":\"ECa01zJsrOH1Br7X890Yo\"},{\"children\":[{\"children\":[{\"text\":\"APPID. APPID에는 -1250000000과 같이 - 접두사가 붙습니다\"}],\"type\":\"p\",\"id\":\"BjQv0DiOIkZ8cNPf4TF30\"}],\"type\":\"cell\",\"id\":\"j6v7fK22CaaGCFdadlMXu\"}],\"type\":\"row\",\"id\":\"ACGvIxV_z2uXv4zNqUz_s\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"runtime\"}],\"type\":\"p\",\"id\":\"22BHWqH1BLgYlLX5ZktXQ\"}],\"type\":\"cell\",\"id\":\"kRiv2IPQTFKlx7qw8lD96\"},{\"children\":[{\"children\":[{\"text\":\"스트레스 테스트 기간\"}],\"type\":\"p\",\"id\":\"YtTGk7-PWrnBP9LKflBQL\"}],\"type\":\"cell\",\"id\":\"4ZKAcoI5M5oFjyaFiVcg1\"}],\"type\":\"row\",\"id\":\"Aiac5uLMbQkIUOONnDGR9\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"ratio\"}],\"type\":\"p\",\"id\":\"9upUkVKxfmLNfAZmge_0-\"}],\"type\":\"cell\",\"id\":\"XITgMm95-iGIewxsY596s\"},{\"children\":[{\"children\":[{\"text\":\"읽기 대 쓰기 비율\"}],\"type\":\"p\",\"id\":\"iHwjVVBq4wg9kcO6AQ-Zy\"}],\"type\":\"cell\",\"id\":\"LqDaaphIlDO1rbD7e7hIs\"}],\"type\":\"row\",\"id\":\"GAx1eAvir8pivYy_SV9AU\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"workers\"}],\"type\":\"p\",\"id\":\"DCyZsWTC4KFJqhRRVSHE-\"}],\"type\":\"cell\",\"id\":\"v7y1myM_II0zBZDswm3cG\"},{\"children\":[{\"children\":[{\"text\":\"스트레스 테스트 스레드 수\"}],\"type\":\"p\",\"id\":\"NHU3UdnQ1SMpwI8LwXDCF\"}],\"type\":\"cell\",\"id\":\"orZUViLvkcQQz5Rw_67jb\"}],\"type\":\"row\",\"id\":\"o_5ZJXgx2udUK1hybcbFI\"}],\"rowHeader\":true,\"type\":\"table\",\"widths\":[23,77],\"id\":\"ye3KFyjAx5E0aVXgZoL0P\",\"widthMode\":\"percentage\",\"indent\":1},{\"children\":[{\"text\":\"cosbench-start.sh 파일을 편집하여 Java에서 다음 매개변수로 행 추가를 실행하고, s3의 md5 인증 기능을 비활성화합니다.\"}],\"type\":\"oli\",\"id\":\"c53r5EwBuYx8R6jsCeo86\"},{\"type\":\"code-block\",\"language\":\"plaintext\",\"children\":[{\"type\":\"code-line\",\"id\":\"Ea1g2u0hgKf9XlRScBPt3\",\"children\":[{\"text\":\"-Dcom.amazonaws.services.s3.disableGetObjectMD5Validation=true\"}]}],\"id\":\"FSYjhMV6MoT4_CXvJUEh7\",\"autoWrap\":false,\"indent\":1},{\"type\":\"p\",\"id\":\"Tr88IUWg7G6NMuW7m6ny0\",\"children\":[{\"text\":\"\"},{\"type\":\"image\",\"alt\":\"\",\"inline\":true,\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/8fda15f1a65511ef888a52540075b605.png\",\"children\":[{\"text\":\"\"}],\"id\":\"eizdPuVVl2jLEYRD47aMO\",\"naturalSize\":[1518,446],\"size\":[953,279]},{\"text\":\"\"}],\"indent\":1},{\"type\":\"oli\",\"id\":\"_fsTTQHMRPwyxlda0Q2Yf\",\"children\":[{\"text\":\"cosbench 서비스를 시작합니다. \"}]},{\"type\":\"uli\",\"id\":\"wnMEPdXOU9IdfX0BFpStZ\",\"children\":[{\"text\":\"centos의 경우 다음 명령을 실행합니다.\"}],\"indent\":1},{\"type\":\"code-block\",\"language\":\"plaintext\",\"children\":[{\"type\":\"code-line\",\"id\":\"7VX3YwAvjZ3ueMSOSicnP\",\"children\":[{\"text\":\" sudo bash start-all.sh\"}]}],\"id\":\"xSxd-0ygeoUpdE8L1ChgJ\",\"autoWrap\":false,\"indent\":2},{\"type\":\"uli\",\"id\":\"x8dEt8L6aLWgwB4hir3Ko\",\"children\":[{\"text\":\"ubuntu의 경우 다음 명령을 실행합니다.\"}],\"indent\":1},{\"type\":\"code-block\",\"language\":\"plaintext\",\"children\":[{\"type\":\"code-line\",\"id\":\"Fkx1OcGKwQhch8Djq3Ttp\",\"children\":[{\"text\":\" sudo bash start-driver.sh &sudo bash start-controller.sh &\"}]}],\"id\":\"v7o8mEVsrZ6czvHLa0RXB\",\"autoWrap\":false,\"indent\":2},{\"type\":\"oli\",\"id\":\"-bD9XT3mEjyMsA-BEKngG\",\"children\":[{\"text\":\"다음 명령어를 실행하여 작업을 제출합니다.\"}]},{\"type\":\"code-block\",\"language\":\"plaintext\",\"children\":[{\"type\":\"code-line\",\"children\":[{\"text\":\"sudo bash cli.sh submit conf/s3-config-sample.xml\"}],\"id\":\"12n_BQRInj90MfsU3DX_U\"}],\"id\":\"-7l4oO82uqzXJxufSO1C9\",\"autoWrap\":false,\"indent\":1},{\"type\":\"p\",\"id\":\"2L9U29kuZmFL5BtyGUbWv\",\"indent\":1,\"children\":[{\"text\":\"URL `http://ip:19088/controller/index.html`(ip는 사용자의 부하 테스트 기기 IP로 대체)에서 실행 상태를 조회합니다.\"}]},{\"type\":\"p\",\"id\":\"sBJh1k9VYwnCWUy5FULZX\",\"indent\":1,\"children\":[{\"text\":\"\"},{\"type\":\"image\",\"alt\":\"\",\"inline\":true,\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/56edfb01a65511efadbf525400fdb830.png\",\"children\":[{\"text\":\"\"}],\"id\":\"qzhsceWUKCAi0rW2b--0m\",\"naturalSize\":[1139,690],\"size\":[953,577]},{\"text\":\"\"}]},{\"type\":\"p\",\"id\":\"OpgCZy3ZgrlBRPi3EXo8u\",\"indent\":1,\"children\":[{\"text\":\"이때 다음 이미지와 같이 다섯 단계로 실행되는 것을 확인할 수 있습니다.\"}]},{\"type\":\"p\",\"id\":\"MLh8CG9DVqC06O2mzf1Oh\",\"indent\":1,\"children\":[{\"text\":\"\"},{\"type\":\"image\",\"alt\":\"\",\"inline\":true,\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/5c54df29a65511efb7b7525400bdab9d.png\",\"children\":[{\"text\":\"\"}],\"id\":\"F7unt8lwPsHdaoPtzq3P1\",\"naturalSize\":[652,480],\"size\":[652,480]},{\"text\":\"\"}]},{\"type\":\"oli\",\"id\":\"pMyZlKeXardaTCB7uupGO\",\"children\":[{\"text\":\"다음은 소속 리전이 베이징이며, 32코어, 사설망 대역폭 17Gbps인 CVM에 대한 업로드 및 다운로드 성능 테스트 예시로, 두 단계를 포함하고 있습니다. \"}]},{\"type\":\"uli\",\"id\":\"oC-PCqYZQJH4_HVjY1xW1\",\"children\":[{\"text\":\"prepare 단계: worker 스레드가 100개이며, 50MB 객체를 1000개 업로드합니다. \"}],\"indent\":1,\"start\":true},{\"type\":\"uli\",\"id\":\"1BnNeGdsM1vEdRD94X4o4\",\"indent\":1,\"children\":[{\"text\":\"main 단계: 100개의 worker 스레드가 300초 동안 읽기/쓰기 객체를 혼합합니다.\"}]},{\"children\":[{\"text\":\" 위와 같은 두 단계의 성능 테스트 결과는 다음과 같습니다.\"}],\"type\":\"p\",\"id\":\"6f5nanaum2He8nDVTSMA3\",\"indent\":1},{\"type\":\"p\",\"id\":\"xRrEnY7wAKly2zs9ETxCR\",\"children\":[{\"text\":\"\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/e3a562899c2511ef834b525400f69702.png\",\"id\":\"DNzfKiONHCyQaLz5gqW3J\",\"naturalSize\":[1126,504],\"size\":[953,426]},{\"text\":\"\"}],\"indent\":1},{\"type\":\"oli\",\"id\":\"dkTgQfL6F9RbK4C5OK4Z5\",\"children\":[{\"text\":\"다음 명령어를 실행하여 테스트 서비스를 중지합니다.\"}]},{\"children\":[{\"children\":[{\"text\":\"sudo bash stop-all.sh\"}],\"type\":\"code-line\",\"id\":\"IDLsVUTNdSEIRzifXevax\"}],\"language\":\"plaintext\",\"type\":\"code-block\",\"id\":\"vSSMgaJC86xalgTpq1Z1W\",\"autoWrap\":false,\"indent\":1},{\"type\":\"p\",\"children\":[{\"text\":\"\"}],\"id\":\"z4biLim62TLSVUkvpCyUj\"}]"}},"38853":{"categoryId":436,"weight":150,"type":"page","extension":"","pid":32967,"id":38853,"lang":"ko","title":"COS 데이터 보안 솔루션 소개","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-11 18:08:40","recentReleaseTime":"2021-03-11 18:08:40","content":{"title":"COS 데이터 보안 솔루션 소개","body":"

사전 보안 수단

1. 권한 격리

클라우드 기업에게 있어 계정 보안과 리소스에 대한 합리적인 권한 부여는 입체적인 보호 체계를 구축하기 위한 첫 번째 관문입니다. 클라우드 상의 리소스 관리로 권한 부여를 할 때 아래 위험 요소는 반드시 피해야 합니다.
Tencent Cloud 루트 계정으로 일상 업무를 하는 경우
직원들에게 서브 계정을 부여했지만 지나치게 큰 권한을 부여한 경우
높은 권한이 부여된 서브 계정과 고위험 작업 수행 시 액세스 권한 조건이 규제되지 않은 경우
사용자 권한과 로그인 정보에 정기적인 감사가 없는 경우
권한 관리 제도와 절차가 허술한 경우
Tencent Cloud CAM은 계정 등급이나 권한 등급 등 여러 가지 조치를 통해 권한을 명확히 하고 보안을 제어합니다. 계정 등급에서 루트 계정은 서브 계정, 협업 파트너 등 모든 합법적인 CAM 사용자에게 프로그램 액세스와 콘솔 액세스 등 다양한 액세스 권한을 부여할 수 있습니다. 권한 등급에서는 서비스 등급, 인터페이스 등급, 리소스 등급 등 다양한 등급의 권한 부여를 통해 CAM 사용자가 어떤 조건에서 어떤 방식을 통해 어떤 리소스에 대해 어떤 작업을 하게 할지 권한 부여가 가능합니다.
루트 계정에 서브 계정을 생성하고 서브 계정에 루트 계정 리소스 관리 권한을 부여하면 루트 계정에 관련한 자격 증명은 필요하지 않습니다. 그 외에도 다양한 유저에게 다양한 리소스에 대한 액세스 권한을 부여할 수 있습니다. 서브 계정이 어떤 COS 버킷의 읽기 권한을 가지고 있다면 다른 서브 계정이나 루트 계정은 어떤 COS 객체의 쓰기 권한 등을 가질 수 있습니다. 이 곳의 리소스, 액세스 권한, 사용자를 모두 일괄 관리할 수 있어 정교한 권한 관리가 가능합니다.
고위험 작업(예: 데이터 삭제) 권한은 제한할 수 있으며 사용자가 콘솔에서 작업을 하도록 허용하거나 MFA 인증 활성화를 통해 2차 인증을 진행합니다. MFA 인증을 활성화하면 사용자가 유사한 고위험 조작을 할 경우 SMS를 통해 검증 코드를 트리거하여 인증을 진행합니다.
\"\"


2. 객체 잠금

금용 거래 데이터, 의료 영상 데이터 등 중요한 내용의 중요 데이터인 경우 객체 잠금 기능으로 파일 업로드 후 삭제 및 수정을 방지할 수 있습니다. 객체 잠금 기능을 설정한 후 설정한 유효 기간 동안 버킷 내의 모든 데이터는 읽기 전용 상태가 되며 덮어쓰기 및 삭제가 불가합니다. 이 작업의 적용 대상은 루트 계정을 포함한 CAM 사용자 및 익명 사용자입니다.
\"\"


3. 데이터 재해 복구

Tencent cloud COS는 데이터 암호화, 버전 제어, 버킷 복제 및 라이프사이클 등을 포함한 데이터 관리를 지원합니다. 민감한 내용이 들어 있는 파일은 암호화 기능으로 데이터 읽기/쓰기 보안을 보장하며 버전 제어와 버킷 복제를 통해 원격 재해 복구를 실행하여 데이터의 영구성을 보장하고, 데이터를 실수로 삭제하거나 악의적으로 삭제할 때 백업 지점에서 데이터를 복구할 수 있습니다. 또한 라이프사이클을 통해 데이터를 전환하고 삭제하여 데이터 저장 비용을 줄일 수 있습니다.
버전 제어는 파일 덮어쓰기 및 삭제 방지 기능입니다. 버전 제어 설정을 활성화한 후 동일한 이름을 가진 파일을 업로드하면 동일 이름을 가진 새로운 버전 파일이 생성됩니다. 파일을 삭제하면 삭제 마커가 생성됩니다. 데이터를 실수로 삭제했거나 덮어쓰기 한 경우 지정된 버전 번호를 통해 이전 버전의 데이터에 액세스하고 데이터를 롤백하여 문제를 해결할 수 있습니다.\n
\"\"

그 외에도 COS는 버킷 복제 기능을 제공합니다. 사용자는 전용선을 통해 모든 증분 파일을 다른 리전의 데이터 센터로 복제하여 원격으로 재해 복구가 가능합니다. 루트 버킷에 있는 데이터가 삭제된 경우 백업 버킷에서 일괄 복사를 통해 데이터를 복구할 수 있습니다.\n
\"\"

버전 제어와 버킷 복제가 파일 수를 증가시킬 수 있는 점을 고려하여, 사용자는 라이프사이클 기능을 통해 일부 백업 데이터를 표준IA 또는 CAS 등 더욱 저렴한 스토리지 유형으로 전환할 수 있으며 이로써 저비용 콜드 스탠바이를 실현할 수 있습니다. 데이터 암호화, 버전 제어, 버킷 복제 및 라이프사이클 기능을 종합하여 Tencent Cloud COS는 다음 그림과 같은 완벽한 콜드 스탠바이 솔루션을 제공합니다.\n
\"\"

다른 클라우드 벤더의 스토리지 서비스를 주로 이용하거나 데이터 영구성에 대한 요구가 높은 편이라면 SCF에 기반한 COS 재해 복구 솔루션을 고려할 수 있습니다. 먼저 데이터가 다른 클라우드 벤더(AWS 또는 OSS)에 저장되어 있다면 SCF를 통해 데이터 동기화를 트리거하거나 버킷 복제로 원격 재해 복구하여 데이터의 영구성을 보장합니다. 또한 SCF를 통해 데이터 마이그레이션을 트리거하면 중요 데이터가 Tencent Cloud COS 서비스에 백업되며, Tencent Cloud 버킷 복제 기능으로 원격 재해 복구를 실행할 수 있습니다. 마지막으로 Tencent Cloud 권한 관리 통제를 통해 COS의 데이터 액세스 권한을 관리하여 극단적인 상황에서 데이터를 Tencent Cloud COS에서 복구할 수 있습니다.\n
\"\"


작업 중 모니터링 수단

Tencent Cloud COS는 SCF를 기반으로 알림 기능을 제공합니다. SCF를 통해 DeleteObject와 같은 고위험 작업에 SCF를 설정합니다. 고위험 조작이 일어났을 때 이메일이나 핸드폰에 알림을 보내 곧바로 고위험 행위를 알리고 행위를 중지시킬 수 있습니다.\n
\"\"


사후 트래킹 수단

Tencent Cloud COS는 여러 가지 진입 장벽이 낮은 로그 모니터링과 감사 기능을 제공합니다. 버킷 사용자 액세스 로그에는 파일 삭제(DeleteObject), 파일 덮어쓰기(PutObjectCopy), 파일 권한 수정(PutObjectACL) 등의 작업이 포함되며, 버킷 액세스 로그를 통해 트래킹을 진행하고 삭제 작업 등 고위험 행위를 트래킹하고 검증할 수 있습니다. 버킷 설정 관리 행위에는 버킷 삭제(DeleteBucket), 버킷 액세스 제어 리스트 수정(PutBucketACL), 버킷 정책 수정(PutBucketPolicy) 등의 작업이 포함되며 CA 로그 감사를 통해 트래킹을 진행하고 권한 설정 수정 등으로 트래킹 인증을 진행할 수 있습니다.\n
\"\"

","recentReleaseTime":"2024-06-24 16:53:18","slate":"[{\"children\":[{\"text\":\"사전 보안 수단\"}],\"nodeId\":\".EC.82.AC.EC.A0.84-.EB.B3.B4.EC.95.88-.EC.88.98.EB.8B.A8\",\"type\":\"h2\"},{\"children\":[{\"text\":\"1. 권한 격리\"}],\"nodeId\":\"1.-.EA.B6.8C.ED.95.9C-.EA.B2.A9.EB.A6.AC\",\"type\":\"h3\"},{\"children\":[{\"text\":\"클라우드 기업에게 있어 계정 보안과 리소스에 대한 합리적인 권한 부여는 입체적인 보호 체계를 구축하기 위한 첫 번째 관문입니다. 클라우드 상의 리소스 관리로 권한 부여를 할 때 아래 위험 요소는 반드시 피해야 합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"Tencent Cloud 루트 계정으로 일상 업무를 하는 경우\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"직원들에게 서브 계정을 부여했지만 지나치게 큰 권한을 부여한 경우\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"높은 권한이 부여된 서브 계정과 고위험 작업 수행 시 액세스 권한 조건이 규제되지 않은 경우\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"사용자 권한과 로그인 정보에 정기적인 감사가 없는 경우\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"권한 관리 제도와 절차가 허술한 경우\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"Tencent Cloud CAM은 계정 등급이나 권한 등급 등 여러 가지 조치를 통해 권한을 명확히 하고 보안을 제어합니다. 계정 등급에서 루트 계정은 서브 계정, 협업 파트너 등 모든 합법적인 CAM 사용자에게 프로그램 액세스와 콘솔 액세스 등 다양한 액세스 권한을 부여할 수 있습니다. 권한 등급에서는 서비스 등급, 인터페이스 등급, 리소스 등급 등 다양한 등급의 권한 부여를 통해 CAM 사용자가 \"},{\"b\":1,\"text\":\"어떤 조건에서 어떤 방식을 통해 어떤 리소스에 대해 어떤 작업\"},{\"text\":\"을 하게 할지 권한 부여가 가능합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"루트 계정에 서브 계정을 생성하고 서브 계정에 루트 계정 리소스 관리 권한을 부여하면 루트 계정에 관련한 자격 증명은 필요하지 않습니다. 그 외에도 다양한 유저에게 다양한 리소스에 대한 액세스 권한을 부여할 수 있습니다. 서브 계정이 어떤 COS 버킷의 읽기 권한을 가지고 있다면 다른 서브 계정이나 루트 계정은 어떤 COS 객체의 쓰기 권한 등을 가질 수 있습니다. 이 곳의 리소스, 액세스 권한, 사용자를 모두 일괄 관리할 수 있어 정교한 권한 관리가 가능합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"고위험 작업(예: 데이터 삭제) 권한은 제한할 수 있으며 사용자가 콘솔에서 작업을 하도록 허용하거나 MFA 인증 활성화를 통해 2차 인증을 진행합니다. MFA 인증을 활성화하면 사용자가 유사한 고위험 조작을 할 경우 SMS를 통해 검증 코드를 트리거하여 인증을 진행합니다.\"}],\"type\":\"p\"},{\"children\":[{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/6e37d7347ae77eb1d34b1509810b1e84.png\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"2. 객체 잠금\"}],\"nodeId\":\"2.-.EA.B0.9D.EC.B2.B4-.EC.9E.A0.EA.B8.88\",\"type\":\"h3\"},{\"children\":[{\"text\":\"금용 거래 데이터, 의료 영상 데이터 등 중요한 내용의 중요 데이터인 경우 객체 잠금 기능으로 파일 업로드 후 삭제 및 수정을 방지할 수 있습니다. 객체 잠금 기능을 설정한 후 설정한 유효 기간 동안 버킷 내의 모든 데이터는 읽기 전용 상태가 되며 덮어쓰기 및 삭제가 불가합니다. 이 작업의 적용 대상은 루트 계정을 포함한 CAM 사용자 및 익명 사용자입니다.\"}],\"type\":\"p\"},{\"children\":[{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/5632f892600f1e330896a237638e90fe.png\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"3. 데이터 재해 복구\"}],\"nodeId\":\"3.-.EB.8D.B0.EC.9D.B4.ED.84.B0-.EC.9E.AC.ED.95.B4-.EB.B3.B5.EA.B5.AC\",\"type\":\"h3\"},{\"children\":[{\"text\":\"Tencent cloud COS는 데이터 암호화, 버전 제어, 버킷 복제 및 라이프사이클 등을 포함한 데이터 관리를 지원합니다. 민감한 내용이 들어 있는 파일은 암호화 기능으로 데이터 읽기/쓰기 보안을 보장하며 버전 제어와 버킷 복제를 통해 원격 재해 복구를 실행하여 데이터의 영구성을 보장하고, 데이터를 실수로 삭제하거나 악의적으로 삭제할 때 백업 지점에서 데이터를 복구할 수 있습니다. 또한 라이프사이클을 통해 데이터를 전환하고 삭제하여 데이터 저장 비용을 줄일 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"버전 제어는 파일 덮어쓰기 및 삭제 방지 기능입니다. 버전 제어 설정을 활성화한 후 동일한 이름을 가진 파일을 업로드하면 동일 이름을 가진 새로운 버전 파일이 생성됩니다. 파일을 삭제하면 삭제 마커가 생성됩니다. 데이터를 실수로 삭제했거나 덮어쓰기 한 경우 지정된 버전 번호를 통해 이전 버전의 데이터에 액세스하고 데이터를 롤백하여 문제를 해결할 수 있습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/b525afd6a5b804471f191d4b90b269a5.png\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"그 외에도 COS는 버킷 복제 기능을 제공합니다. 사용자는 전용선을 통해 모든 증분 파일을 다른 리전의 데이터 센터로 복제하여 원격으로 재해 복구가 가능합니다. 루트 버킷에 있는 데이터가 삭제된 경우 백업 버킷에서 일괄 복사를 통해 데이터를 복구할 수 있습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/73df76364894b76914cfe4450ba8fbf6.png\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"버전 제어와 버킷 복제가 파일 수를 증가시킬 수 있는 점을 고려하여, 사용자는 라이프사이클 기능을 통해 일부 백업 데이터를 표준IA 또는 CAS 등 더욱 저렴한 스토리지 유형으로 전환할 수 있으며 이로써 저비용 콜드 스탠바이를 실현할 수 있습니다. 데이터 암호화, 버전 제어, 버킷 복제 및 라이프사이클 기능을 종합하여 Tencent Cloud COS는 다음 그림과 같은 완벽한 콜드 스탠바이 솔루션을 제공합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/f02a8d6778228ee4ef0d6238b62c1c98.png\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"다른 클라우드 벤더의 스토리지 서비스를 주로 이용하거나 데이터 영구성에 대한 요구가 높은 편이라면 SCF에 기반한 COS 재해 복구 솔루션을 고려할 수 있습니다. 먼저 데이터가 다른 클라우드 벤더(AWS 또는 OSS)에 저장되어 있다면 SCF를 통해 데이터 동기화를 트리거하거나 버킷 복제로 원격 재해 복구하여 데이터의 영구성을 보장합니다. 또한 SCF를 통해 데이터 마이그레이션을 트리거하면 중요 데이터가 Tencent Cloud COS 서비스에 백업되며, Tencent Cloud 버킷 복제 기능으로 원격 재해 복구를 실행할 수 있습니다. 마지막으로 Tencent Cloud 권한 관리 통제를 통해 COS의 데이터 액세스 권한을 관리하여 극단적인 상황에서 데이터를 Tencent Cloud COS에서 복구할 수 있습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/b6c4a8a19641254bdefa46737385643e.png\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"작업 중 모니터링 수단\"}],\"nodeId\":\".EC.9E.91.EC.97.85-.EC.A4.91-.EB.AA.A8.EB.8B.88.ED.84.B0.EB.A7.81-.EC.88.98.EB.8B.A8\",\"type\":\"h2\"},{\"children\":[{\"text\":\"Tencent Cloud COS는 SCF를 기반으로 알림 기능을 제공합니다. SCF를 통해 DeleteObject와 같은 고위험 작업에 SCF를 설정합니다. 고위험 조작이 일어났을 때 이메일이나 핸드폰에 알림을 보내 곧바로 고위험 행위를 알리고 행위를 중지시킬 수 있습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/7148291126d5b96bc887840b4b045586.png\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"사후 트래킹 수단\"}],\"nodeId\":\".EC.82.AC.ED.9B.84-.ED.8A.B8.EB.9E.98.ED.82.B9-.EC.88.98.EB.8B.A8\",\"type\":\"h2\"},{\"children\":[{\"text\":\"Tencent Cloud COS는 여러 가지 진입 장벽이 낮은 로그 모니터링과 감사 기능을 제공합니다. 버킷 사용자 액세스 로그에는 파일 삭제(DeleteObject), 파일 덮어쓰기(PutObjectCopy), 파일 권한 수정(PutObjectACL) 등의 작업이 포함되며, 버킷 액세스 로그를 통해 트래킹을 진행하고 삭제 작업 등 고위험 행위를 트래킹하고 검증할 수 있습니다. 버킷 설정 관리 행위에는 버킷 삭제(DeleteBucket), 버킷 액세스 제어 리스트 수정(PutBucketACL), 버킷 정책 수정(PutBucketPolicy) 등의 작업이 포함되며 CA 로그 감사를 통해 트래킹을 진행하고 권한 설정 수정 등으로 트래킹 인증을 진행할 수 있습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://main.qcloudimg.com/raw/a328c9a3c9df1b1c48214352fbe2f980.png\"}],\"type\":\"p\"}]"}},"39086":{"categoryId":436,"weight":30,"type":"page","extension":"","pid":34079,"id":39086,"lang":"ko","title":"NextCloud + COS로 개인 클라우드 생성","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-03 23:09:37","recentReleaseTime":"2021-03-03 23:09:37","content":{"title":"NextCloud + COS로 개인 클라우드 생성","body":"

서문

NextCloud는 오픈 소스 클라이언트 및 서버 소프트웨어 애플리케이션으로 개인 온라인 파일 스토리지 서비스를 직접 만들 수 있도록 도와줍니다.
NextCloud 서버는 PHP로 작성되었으며 서버의 로컬 디스크를 기본 스토리지로 사용합니다. COS(Cloud Object Storage)를 기본 스토리지로 사용하도록 NextCloud 구성을 수정하여 더 낮은 스토리지 비용으로 더 높은 안정성, 더 강력한 재해 복구 기능 및 무제한 스토리지 공간을 누릴 수 있습니다.
본 문서는 NextCloud 서버가 의존하는 환경과 로컬 스토리지와 COS의 차이점을 비교 분석하고 개인 온라인 파일 스토리지 서비스 구축 방법을 설명합니다.
주의:
기존의 NextCloud 서버 인스턴스를 로컬 스토리지에서 COS로 전환하면 기존 파일이 보이지 않을 수 있습니다. 기존 인스턴스의 저장 방법을 변경하려면 새로운 NextCloud 서버를 구축하고 COS를 스토리지로 구성한 다음 이전 인스턴스에서 새 인스턴스로 데이터를 마이그레이션하는 것이 좋습니다.

NextCloud 서버 환경 소개

NextCloud의 서버는 PHP로 작성되며, 데이터베이스는 SQLite, MySQL, MariaDB 또는 PostgreSQL을 사용할 수 있습니다. 이중 SQLite는 성능의 제약으로 인해 실제 애플리케이션에는 일반적으로 권장되지 않습니다. PHP, MySQL과 관련된 서버 소프트웨어는 Windows 버전을 모두 갖추고 있지만, Windows에서 실행되는 NextCloud 서버에 텍스트 인코딩 등의 문제가 있을 수 있다는 NextCloud 커뮤니티의 피드백에 따라 공식 홈페이지는 Windows에 설치된 NextCloud 서버를 지원하지 않겠다고 발표했습니다.

서버 구성

Cloud Virtual Machine(CVM)은 현재 각각 여러 서브 패밀리가 있는 여러 인스턴스 패밀리를 제공합니다. 다른 인스턴스 패밀리는 큰 메모리 또는 높은 IO와 같은 다른 강점을 가지고 있습니다. NextCloud는 개인, 가정, 중소기업 사용자를 대상으로 하므로 하드웨어 리소스에 대한 요구 사항이 낮고 리소스가 균형 잡힌 표준형 모델을 선택할 수 있습니다. CVM 인스턴스 서브 패밀리의 경우 일반적으로 최신 제품이 비용 대비 성능이 높으므로 최신 서브 패밀리를 선택하면 됩니다.
인스턴스 패밀리 및 서브 패밀리를 결정한 후 특정 vCPU 및 메모리 사양을 선택해야 합니다(사설망 대역폭 및 PPS는 사양에 따라 다름). PHP용 OPcache를 사용하여 성능을 향상시킬 수 있으며, NextCloud 서버는 APCu 메모리 캐시를 사용하여 성능을 더욱 향상시킬 수 있으므로 대용량 메모리를 선택하는 것이 좋습니다.
구매 후 CVM 인스턴스 구성을 조정할 수 있으므로 1코어 vCPU와 4GB MEM과 같은 낮은 사양의 인스턴스를 먼저 구매하고 온라인 파일 스토리지 서비스를 구축하여 운영 환경에 런칭한 후 사용자 및 파일 수와 CVM 모니터링 데이터를 기반으로 성능 향상을 위한 사양 업그레이드 여부를 결정합니다. 가정 또는 중소기업과 같은 다중 사용자 시나리오에서 서비스를 사용해야 하는 경우 충분한 성능을 제공하기 위해 2코어 8GB MEM 또는 4코어 16GB MEM 인스턴스를 구매하는 것이 좋습니다.

서버 운영 체제

주요 Linux 릴리스 버전은 NextCloud 서버를 잘 유지할 수 있습니다. 이들의 구성은 소프트웨어 패키지 설치에 사용되는 명령(패키지 관리 툴)을 제외하고는 기본적으로 동일합니다.
설명:
본문은 CentOS 7.7의 CVM 인스턴스를 예로 들어 설명합니다.

데이터베이스

앞서 언급한 바와 같이 실제 업무에서는 MySQL을 PHP와 함께 사용하는 것이 일반적입니다. MariaDB는 MySQL의 '포크(fork)' 버전으로, MySQL과의 호환성이 높기 때문에 NextCloud 서버는 MySQL 5.7+ 또는 MariaDB 10.2+에서 잘 실행될 수 있습니다.
Tencent Cloud는 TencentDB for MySQL과 TencentDB for MariaDB를 제공합니다. 두 서비스 모두 원본-복제 고가용성 아키텍처를 채택하고 CVM에서 자체 구축한 데이터베이스에 비해 안정성이 더 높습니다. 또한 자동 백업과 같은 사용하기 쉬운 Ops 기능을 지원합니다. 따라서 실제 비즈니스에서 TencentDB를 사용하는 것이 좋습니다.
설명:
본문은 TencentDB for MySQL 5.7 인스턴스를 예로 들어 설명합니다.

Web 서버 및 PHP Runtime

일부 NextCloud 서버 구성은 .htaccess 파일에 지정되어 있으므로 Apache 서버 소프트웨어 애플리케이션을 사용할 때 NextCloud의 내장 구성 항목을 직접 사용할 수 있습니다. Nginx는 최근 급속도로 발전하고 있는 Web 서버 소프트웨어 애플리케이션으로 Apache에 비해 설치 및 구성이 쉽고 리소스 사용량이 적으며 로드 용량이 큰 것이 특징입니다. NextCloud 서버의 .htaccess 구성을 Nginx 구성으로 변환하여 NextCloud 서버를 더 잘 유지할 수 있습니다. 본문은 Nginx 서버 소프트웨어 애플리케이션을 사용하며 참고용으로 완전한 Nginx 구성 예시를 제공합니다.
PHP Runtime은 PHP 7로 업그레이드되었으며 주요 유지 관리 버전에는 모두 NextCloud 서버를 지원하는 7.2, 7.3 및 7.4가 포함됩니다. 여기에서는 최신 버전 7.4를 사용합니다. 또한 NextCloud는 특정 PHP 모듈에 의존합니다. 특정 모듈에 대한 요구 사항은 아래에 자세히 설명되어 있습니다.

Tencent Cloud 네트워크 환경

현재 Tencent Cloud는 클래식 네트워크 및 VPC 환경을 제공합니다. 클래식 네트워크는 모든 Tencent Cloud 사용자가 공유하는 공중망 리소스 풀로, 모든 CVM 인스턴스의 사설망 IP가 Tencent Cloud에 의해 할당되며 IP 범위 또는 IP 주소를 사용자 지정할 수 없습니다. VPC는 Tencent Cloud에서 논리적으로 격리된 네트워크 공간입니다. VPC에서 IP 범위, IP 주소 및 라우팅 정책을 사용자 지정할 수 있습니다. 현재 클래식 네트워크 리소스가 부족하고 확장할 수 없기 때문에 클래식 네트워크는 더 이상 새 계정과 일부 새 AZ에서 지원되지 않습니다. 따라서 이 문서에서는 VPC를 예로 들어 설명합니다.
설명:
VPC에 대한 자세한 내용은 개요를 참고하십시오.

CBS와 COS의 비교

CBS(Cloud Block Storage) 디스크는 CVM 인스턴스의 로컬 디스크로 운영 체제에 마운트됩니다. NextCloud는 기본적으로 파일 시스템을 사용하여 온라인 파일 스토리지 데이터를 저장하므로 NextCloud 데이터를 운영 체제의 CBS 디스크에 직접 저장할 수 있습니다. CBS와 비교하여 COS는 다음과 같은 이점을 제공합니다.

사용 사례

CBS

CBS는 일종의 블록 스토리지로 CVM 운영 체제에 디스크로 직접 마운트할 수 있습니다. 일반적으로 CBS 디스크는 운영 체제에서만 사용되며 하나의 CVM 인스턴스에만 마운트할 수 있습니다. 그러나 읽기/쓰기 성능이 높고 높은 IO와 낮은 대기 시간이 필요한 시나리오에 적합하며 하나의 CVM 인스턴스에서만 독점적으로 사용됩니다.

COS

COS는 HTTP 프로토콜을 통해 읽기/쓰기 API를 개방하므로 프로그래밍을 통해 COS에 저장된 객체(파일)에 액세스해야 합니다. 파일 경로와 같은 객체 Key를 인덱스로 사용하며 저장 용량이 무제한입니다. 데이터가 네트워크를 통해 전송되기 때문에 COS는 속도가 느리고 대기 시간이 더 깁니다. 그러나 객체에 대한 작업이 수행되므로 애플리케이션에서 객체를 조작한 후 다른 애플리케이션에서 즉시 동일한 객체를 조작할 수 있습니다. 결론적으로 COS는 고성능이 필요하지 않지만 비용 효율적인 대용량 스토리지 또는 공유 액세스가 필요한 시나리오에 적합합니다. 다음과 같은 이유로 온라인 파일 스토리지 애플리케이션을 COS와 함께 사용하는 것이 더 적합합니다. 온라인 파일 스토리지 애플리케이션은 네트워크를 통해 데이터를 전송하며 짧은 대기 시간이 필요하지 않습니다. 온라인 파일 저장 클라이언트에서 서버로 그리고 COS로 연결되는 속도와 대기 시간은 주로 클라이언트 네트워크에 따라 달라집니다. COS는 자체 속도를 제한하지 않습니다.

유지 관리

CBS

CBS에는 고정 용량이 있으며 콘솔 또는 Tencent Cloud API를 통해 확장할 수 있습니다. 확장 후에는 운영 체제에 파티션을 추가해야 하며 파티션 예외가 발생할 수 있으며 일정한 유지 관리 비용이 발생합니다.

COS

COS는 주문형으로 사용되며 총 용량이나 객체(파일)의 수를 제한하지 않으므로 유지 관리가 전혀 필요하지 않습니다.

데이터 보안

CBS와 COS 모두 데이터의 신뢰성을 보장하기 위해 다중 복사와 같은 방법을 사용합니다.

NextCloud 서버 실행 환경 구축

NextCloud 서버가 의존하는 Tencent Cloud 제품 준비

CVM

CVM을 시작하려면 사용자 정의 구성을 참고하십시오.

TencentDB for MySQL

시작하려면 MySQL 인스턴스 생성을 참고하십시오.

COS

1. COS 콘솔에 로그인(처음 사용하는 경우 COS를 먼저 활성화해야 함)하고 버킷 리스트 페이지로 이동하여 버킷 생성을 클릭하고 다음과 같이 구성합니다.
구성 항목
이름
nextcloud와 같은 사용자 정의 버킷 이름을 입력하십시오. 한 번 확인된 이름은 변경할 수 없습니다.
리전
CVM 인스턴스의 리전을 선택합니다
기타
기본 설정을 유지합니다
2. 상기 구성 항목을 설정한 후 확인을 클릭합니다.

Web 서버와 PHP Runtime 설치 및 구성

Nginx 설치

1. SSH 툴을 사용하여 새로 구매한 서버에 로그인합니다.
2. 다음 명령을 실행하여 Nginx를 설치합니다.
yum install nginx
다음과 같은 정보가 뜨면 Y와 Enter 키를 눌러 설치를 확인합니다(이하 동일).
Is this ok [y/d/N]:
3. 다음과 같은 정보가 뜨면 설치가 완료된 것입니다.
Complete!
[root@VM-0-10-centos ~]#
4. 다음 명령어를 실행하여 Nginx 버전이 정상적으로 조회되는지 검증합니다.
nginx -v
다음과 같은 정보가 뜨면 설치 검증이 끝난 것입니다.
nginx version: nginx/1.16.1

PHP 설치

1. SSH 툴을 사용하여 구매한 서버에 로그인합니다.
2. 다음 명령어를 실행하여 PHP 7.4를 설치합니다.
yum install epel-release yum-utils
3. 다음 명령을 순서대로 실행합니다.\n명령어 1:
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
설명:
명령 실행이 너무 느리거나 오랫동안 중단된 경우 Ctrl+C를 눌러 실행을 취소하고 명령을 다시 실행할 수 있습니다(이하 동일).
명령어 2:
yum-config-manager --enable remi-php74
명령어 3:
yum install php php-fpm
4. 설치 완료 후 다음 명령어를 실행하여 PHP 버전이 정상적으로 조회되는지 검증합니다.
php -v
다음과 같은 정보가 뜨면 설치 검증이 끝난 것입니다.
PHP 7.4.8 (cli) (built: Jul 9 2020 08:57:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

PHP 모듈 설치

NextCloud는 기본적인 PHP 외에도 다른 PHP 모듈에 종속되어 일부 기능을 실행합니다. NextCloud의 종속에 관련된 자세한 모듈 정보는 NextCloud 공식 홈페이지 문서를 참조하십시오.
본 튜토리얼에는 NextCloud 필수 PHP 모듈이 설치됩니다. NextCloud의 다른 옵션 기능을 사용할 계획이라면 종속된 기타 PHP 모듈에 주의하여 설치하십시오.
1. SSH 툴을 사용하여 구매한 서버에 로그인합니다.
2. 다음 명령어를 실행하여 PHP 모듈을 설치합니다.
yum install php-xml php-gd php-mbstring php-mysqlnd php-intl php-zip
3. 설치 완료 후 다음 명령어를 실행하여 설치된 PHP 모듈을 조회합니다.
php -m
4. 기타 모듈 설치가 필요한 경우 yum install <php-module-name>을 다시 실행하면 됩니다.

NextCloud 서버 코드 업로드 및 압축 해제

1. NextCloud 공식 홈페이지에서 NextCloud 서버 설치 패키지 최신 버전을 다운로드한 다음 서버 /var/www/ 디렉터리에 업로드합니다. 다음과 같은 방법으로 업로드할 수 있습니다.
1. wget 명령어를 사용하여 서버에서 직접 설치 패키지를 다운로드합니다. 예: /var/www/ 디렉터리로 이동 후 명령어 wget https://download.nextcloud.com/server/releases/nextcloud-19.0.1.zip 실행
2. 로컬 컴퓨터에 다운로드한 후 SFTP 또는 SCP 등 소프트웨어를 통해 /var/www/ 디렉터리에 설치 패키지를 업로드합니다.
3. 로컬 컴퓨터에 다운로드한 후 lrzsz를 사용하여 업로드합니다. 방법은 다음과 같습니다.
3.1 SSH 툴을 사용하여 구매한 서버에 로그인합니다.
3.2 yum install lrzsz를 실행하여 lrzsz를 설치합니다.
3.3 cd /var/www/를 실행하여 타깃 디렉터리로 이동합니다.
3.4 rz -bye를 실행하고 SSH 툴에서 로컬로 다운로드할 NextCloud 서버 설치 패키지를 선택합니다(해당 조작은 SSH 툴에 따라 상이함).
4. SSH 툴을 사용하여 구매한 서버에 로그인합니다.
5. unzip nextcloud-<version>.zip을 실행하여 설치 패키지를 압축 해제합니다(예: unzip nextcloud-19.0.1.zip).

PHP 설정

1. SSH 툴을 사용하여 구매한 서버에 로그인합니다.
2. vim /etc/php-fpm.d/www.conf를 실행하여 PHP-FPM 구성 파일을 열고 순서대로 설정 항목을 수정합니다. vim의 구체적인 사용법은 관련 자료를 참조하십시오. 다른 방식을 사용해 해당 구성 파일을 수정할 수도 있습니다.
1. user = apacheuser = nginx로 수정합니다.
2. group = apachegroup = nginx로 수정합니다.
3. 수정 완료 후 :wq를 입력하여 파일을 저장하고 종료합니다. vim의 구체적인 작업 가이드는 관련 문서를 참조하십시오.
4. 다음 명령어를 실행하여 PHP가 Nginx 사용에 최적화되도록 디렉터리 소유자를 수정합니다.
chown -R nginx:nginx /var/lib/php
5. 계속해서 다음 명령어를 실행하고 PHP-FPM 서비스를 실행합니다.\n명령어 1:
systemctl enable php-fpm # 명령어 1
명령어 2:
systemctl start php-fpm # 명령어 2

Nginx 설정

1. SSH 툴을 사용하여 구매한 서버에 로그인합니다.
2. 다음 명령어를 실행하여 웹 사이트 디렉터리 소유자를 수정합니다.
chown -R nginx:nginx /var/www
3. 기존의 Nginx 구성 파일 /etc/nginx/nginx.conf를 백업합니다. 다음 조작이 가능합니다.
1. cp /etc/nginx/nginx.conf ~/nginx.conf.bak를 실행하여 기존 구성 파일을 홈(HOME) 디렉터리에 백업합니다.
2. SFTP 또는 SCP 등 소프트웨어를 사용하여 기존 구성 파일을 로컬 컴퓨터에 다운로드합니다.
3. /etc/nginx/nginx.conf를 다음 내용으로 수정 또는 대체합니다.
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/nextcloud;

add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;

client_max_body_size 512M;
fastcgi_buffers 64 4K;

gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
try_files $uri $uri/ =404;
index index.php;
}

location ~ ^\\/(?:build|tests|config|lib|3rdparty|templates|data)\\/ {
deny all;
}
location ~ ^\\/(?:\\.|autotest|occ|issue|indie|db_|console) {
deny all;
}

location ~ ^\\/(?:index|remote|public|cron|core\\/ajax\\/update|status|ocs\\/v[12]|updater\\/.+|oc[ms]-provider\\/.+)\\.php(?:$|\\/) {
fastcgi_split_path_info ^(.+?\\.php)(\\/.*|)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param modHeadersAvailable true;
fastcgi_pass 127.0.0.1:9000;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}

location ~ ^\\/(?:updater|oc[ms]-provider)(?:$|\\/) {
try_files $uri/ =404;
index index.php;
}

location ~ \\.(css|js|svg|gif)$ {
add_header Cache-Control "max-age=15778463";
}

location ~ \\.woff2?$ {
add_header Cache-Control "max-age=604800";
}
}

# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }

}
4. 계속해서 다음 명령어를 실행하고 Nginx 서비스를 실행합니다.\n명령어 1:
systemctl enable nginx
명령어 2:
systemctl start nginx

COS를 사용하도록 NextCloud 서버 구성

COS 정보 가져오기

1. COS 콘솔에 로그인합니다.
2. 이전에 생성한 버킷을 찾아 버킷 이름을 클릭합니다.\n
\"\"


3. 왼쪽 사이드바에서 개요를 선택하고 기본 정보버킷 이름리전에 정보를 기록합니다.\n
\"\"



API 키 획득

리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한의 원칙 설명을 따르는 것이 좋습니다. 서브 계정 키를 얻는 방법에 대한 자세한 내용은 Access Key를 참고하십시오.

NextCloud 서버 구성 파일 수정

1. 텍스트 편집 툴을 사용하여 config.php를 생성하고 다음 내용을 입력한 후 주석에 따라 관련 값을 수정합니다.
<?php
$CONFIG = array(
'objectstore' => array(
'class' => '\\\\OC\\\\Files\\\\ObjectStore\\\\S3',
'arguments' => array(
'bucket' => 'nextcloud-1250000000', // 버킷 이름(공간의 이름)
'autocreate' => false,
'key' => 'AKIDxxxxxxxx', // 사용자의 SecretId로 변경
'secret' => 'xxxxxxxxxxxx', // 사용자의 SecretKey로 변경
'hostname' => 'cos.<Region>.myqcloud.com', // <Region>을 소속 리전으로 수정(예: ap-shanghai)
'use_ssl' => true,
),
),
);
다음 이미지 참고:\n
\"\"

\n2. 해당 파일을 저장하고 /var/www/nextcloud/config/ 디렉터리에 업로드합니다(파일 이름은 config.php로 유지). SFTP 또는 SCP 소프트웨어를 통해 파일을 업로드할 수 있고, rz -bye 명령어를 통해 업로드할 수도 있습니다.
2. 다음 명령어를 실행하여 구성 파일의 소유자를 수정합니다.
chown nginx:nginx /var/www/nextcloud/config/config.php

도메인 이름 구성

NextCloud 서버에 IP 주소가 아닌 도메인 이름을 사용하려면, 도메인 이름을 등록하고 CVM IP 주소로 리졸브하고, 도메인 등록 기관의 안내 문서에 따라 ICP 비안을 받을 수 있습니다.
NextCloud 서버는 설치 시 사용한 도메인 이름이나 IP 주소를 기록하므로 설치 전에 도메인 이름을 등록, 리졸브 및 ICP 비안을 받아 도메인 이름을 사용하여 NextCloud 서버의 보안 페이지로 이동하는 것이 좋습니다.
NextCloud 서버 설치 완료 후 도메인 또는 IP 주소를 변경해야 할 경우 직접 /var/www/nextcloud/config/config.php 구성 파일의 trusted_domains를 수정할 수 있습니다. 세부 사항은 NextCloud 공식 홈페이지 문서를 참조하십시오.

NextCloud 서버 설치

1. 브라우저를 사용하여 NextCloud 서버에 액세스한 후 관리자 및 사용자 이름과 비밀번호를 생성하고 기억합니다.
2. 스토리지와 데이터베이스를 확장하고 다음과 같이 구성합니다.
구성 항목
데이터 폴더
/var/www/nextcloud/data(기본값 유지)
데이터베이스 구성
MySQL/MariaDB
데이터베이스 사용자
root
데이터베이스 비밀번호
TencentDB for MySQL 초기화 중에 입력한 root 사용자의 비밀번호
데이터베이스 이름
nextcloud(또는 사용하지 않는 다른 이름)
데이터베이스 호스트(기본적으로 localhost가 표시됨)
TencentDB for MySQL 인스턴스의 사설망 주소
3. **설치 완료**를 클릭하고 NextCloud 서버 설치가 완료될 때까지 기다립니다.4. 설치 과정에서 504 Gateway Timeout과 같은 오류 정보가 뜨는 경우 새로고침 후 다시 시도합니다.5. 설치 완료 후 관리자 계정을 사용해 NextCloud 서버에 로그인하면 웹 페이지 버전의 NextCloud를 사용할 수 있습니다.

NextCloud 서버 환경 최적화

백그라운드 작업

NextCloud 서버는 사용자와 상호작용이 필요하지 않을 때 데이터베이스 정리와 같은 백그라운드 작업을 실행하는 경우가 있습니다. PHP 실행 특성상 PHP 기반 프로그램은 내부적으로 하나의 독립된 작업 진행 또는 스레드를 유지할 수 없으므로 백그라운드 작업과 같은 시나리오는 외부에서 호출하여 대응하는 PHP 프로그램으로 실행해야 합니다.
NextCloud 서버는 세 가지 백그라운드 작업 호출 방식을 제공합니다. 기본값은 웹 페이지에 로그인한 사용자를 통해 브라우저에서 자동으로 AJAX 요청을 보낸 후 서버의 백그라운드 작업 실행을 호출하는 방식으로, 사용자의 로그인 상태에 크게 의존합니다. 사용자가 로그인하지 않으면 이러한 백그라운드 작업은 실행될 수 없으므로 신뢰성이 가장 낮습니다.
AJAX 기반 백그라운드 작업의 신뢰성이 떨어지는 문제를 피하고자 Linux의 cron을 사용한 백그라운드 작업 설정을 권장합니다. Linux의 cron은 작업 호출 시간을 정확하게 제어합니다. 설정 가능한 Interval은 분, 시간, 한 달 중 특정 일, 월, 요일을 포함합니다. 예를 들어 5분마다(분 수는 5의 배수) 또는 매시 10분 등으로 설정할 수 있습니다. 일부 운영 체제는 초 단위, 연 단위도 지원하여 매우 효율적입니다. cron에 대한 설명과 설정은 관련 자료를 참조하십시오.
NextCloud 서버의 백그라운드 작업을 위해 cron을 설정하는 방법을 소개합니다.
1. SSH 툴을 사용하여 구매한 서버에 로그인합니다.
2. 다음 명령어를 실행하여 PHP 모듈을 설치합니다.
yum install php-posix
3. 다음 명령어를 실행하여 nginx 계정에 사용할 cron 설정을 열거나 생성합니다.
crontab -u nginx -e
4. 다음 편집 인터페이스는 vi/vim입니다. i 키를 눌러 편집 모드로 이동한 후 한 행을 삽입합니다. 내용은 다음과 같습니다.
*/5 * * * * php -f /var/www/nextcloud/cron.php
ESC를 눌러 편집 모드를 종료하고 :wq를 입력하여 저장 후 종료합니다. vi/vim의 구체적인 작업 가이드는 관련 문서를 참조하십시오.\n상기 구성에서는 공식적으로 권장되는 실행 빈도를 5분에 한 번씩 설정합니다. 백그라운드 작업이 5분 안에 실행된 후에는 브라우저를 열어 NextCloud 서버에 로그인할 수 있습니다. 그 후, 오른쪽 상단 모서리에서 사용자 이름 첫 글자를 클릭하여 설정 페이지로 이동한 후, 좌측 사이드바에서 기본 설정을 선택하면 기본적으로 Cron이 백그라운드 작업으로 선택되어 있는 것을 확인할 수 있습니다.

메모리 캐시

PHP는 OPcache를 사용하여 성능을 향상할 수 있습니다. NextCloud 서버도 APCu를 사용한 메모리 캐시 성능 향상을 지원합니다. 아래 관련 작업 과정을 소개합니다.
1. SSH 툴을 사용하여 구매한 서버에 로그인합니다.
2. 다음 명령어를 실행하여 PHP 모듈을 설치합니다.
yum install php-pecl-apcu
3. 계속해서 다음 명령어를 실행하여 Nginx와 PHP-FPM을 재시작합니다.\n명령어 1:
systemctl restart nginx
명령어 2:
systemctl restart php-fpm
4. vim /var/www/nextcloud/config/config.php를 실행하여 NextCloud 서버의 구성 파일을 열고 $CONFIG = array (에 한 행 'memcache.local' => '\\OC\\Memcache\\APCu',을 추가합니다. 파일을 저장하고 종료합니다.\n
\"\"


5. cron 설정으로 백그라운드 작업을 최적화한 후 PHP의 apc 설정 변경이 필요합니다. vim /etc/php.d/40-apcu.ini를 실행하여 PHP APCu의 구성 파일을 열고 ;apc.enable_cli=0apc.enable_cli=1로 수정(주의: 맨 앞의 세미콜론을 모두 삭제)한 다음 저장하고 종료합니다. /etc/php.d/40-apcu.ini 경로가 존재하지 않을 경우 직접 /etc/php.d/ 디렉터리에서 apc 또는 apcu 문구가 들어간 .ini 구성 파일을 찾아 편집합니다.\n
\"\"



클라이언트 액세스 설정

NextCloud 공식 홈페이지가 제공하는 데스크톱 동기화 클라이언트와 모바일 클라이언트는 NextCloud 공식 홈페이지 또는 애플리케이션 스토어에서 다운로드할 수 있습니다. NextCloud 설정 시 NextCloud의 서버 주소(도메인 또는 IP)를 입력해야 합니다. 그런 다음 사용자 이름과 비밀번호를 입력하고 로그인하면 바로 클라이언트를 사용할 수 있습니다.
","recentReleaseTime":"2024-11-20 15:43:51","slate":"[{\"children\":[{\"text\":\"서문\"}],\"nodeId\":\".EC.84.9C.EB.AC.B8\",\"type\":\"h2\",\"id\":\"RtXvHxAoOYBF4UtnDmpGM\"},{\"children\":[{\"text\":\"NextCloud는 오픈 소스 클라이언트 및 서버 소프트웨어 애플리케이션으로 개인 온라인 파일 스토리지 서비스를 직접 만들 수 있도록 도와줍니다.\"}],\"type\":\"p\",\"id\":\"QDF4kxO7GHED8W0FRNdch\"},{\"children\":[{\"text\":\"NextCloud 서버는 PHP로 작성되었으며 서버의 로컬 디스크를 기본 스토리지로 사용합니다. COS(Cloud Object Storage)를 기본 스토리지로 사용하도록 NextCloud 구성을 수정하여 더 낮은 스토리지 비용으로 더 높은 안정성, 더 강력한 재해 복구 기능 및 무제한 스토리지 공간을 누릴 수 있습니다.\"}],\"type\":\"p\",\"id\":\"RoVtg37B5E4QJF9OOfcar\"},{\"children\":[{\"text\":\"본 문서는 NextCloud 서버가 의존하는 환경과 로컬 스토리지와 COS의 차이점을 비교 분석하고 개인 온라인 파일 스토리지 서비스 구축 방법을 설명합니다.\"}],\"type\":\"p\",\"id\":\"whFDCNgiQtzsnt8fCxaxr\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"iIMxZE0qh_nClO9BkTDHH\"},{\"children\":[{\"text\":\"기존의 NextCloud 서버 인스턴스를 로컬 스토리지에서 COS로 전환하면 기존 파일이 보이지 않을 수 있습니다. 기존 인스턴스의 저장 방법을 변경하려면 새로운 NextCloud 서버를 구축하고 COS를 스토리지로 구성한 다음 이전 인스턴스에서 새 인스턴스로 데이터를 마이그레이션하는 것이 좋습니다.\"}],\"type\":\"p\",\"id\":\"a7xrA5Mkiqg3Y7-dDiab9\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"NJ_Z17jqqETKqxrCgJopu\"},{\"children\":[{\"text\":\"NextCloud 서버 환경 소개\"}],\"nodeId\":\"nextcloud-.EC.84.9C.EB.B2.84-.ED.99.98.EA.B2.BD-.EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"KGPJRuyE9REEeyXU5FCxE\"},{\"children\":[{\"text\":\"NextCloud의 서버는 PHP로 작성되며, 데이터베이스는 SQLite, MySQL, MariaDB 또는 PostgreSQL을 사용할 수 있습니다. 이중 SQLite는 성능의 제약으로 인해 실제 애플리케이션에는 일반적으로 권장되지 않습니다. PHP, MySQL과 관련된 서버 소프트웨어는 Windows 버전을 모두 갖추고 있지만, Windows에서 실행되는 NextCloud 서버에 텍스트 인코딩 등의 문제가 있을 수 있다는 NextCloud 커뮤니티의 피드백에 따라 공식 홈페이지는 Windows에 설치된 NextCloud 서버를 지원하지 않겠다고 발표했습니다.\"}],\"type\":\"p\",\"id\":\"2UIxoyIidvAIjksYHZbRU\"},{\"children\":[{\"text\":\"서버 구성\"}],\"nodeId\":\".EC.84.9C.EB.B2.84-.EA.B5.AC.EC.84.B1\",\"type\":\"h3\",\"id\":\"benlbekZ_smUDHRQ3vHQI\"},{\"children\":[{\"text\":\"Cloud Virtual Machine(CVM)은 현재 각각 여러 서브 패밀리가 있는 여러 인스턴스 패밀리를 제공합니다. 다른 인스턴스 패밀리는 큰 메모리 또는 높은 IO와 같은 다른 강점을 가지고 있습니다. NextCloud는 개인, 가정, 중소기업 사용자를 대상으로 하므로 하드웨어 리소스에 대한 요구 사항이 낮고 리소스가 균형 잡힌 표준형 모델을 선택할 수 있습니다. CVM 인스턴스 서브 패밀리의 경우 일반적으로 최신 제품이 비용 대비 성능이 높으므로 최신 서브 패밀리를 선택하면 됩니다.\"}],\"type\":\"p\",\"id\":\"253Wul0CNCayytw7_9aNA\"},{\"children\":[{\"text\":\"인스턴스 패밀리 및 서브 패밀리를 결정한 후 특정 vCPU 및 메모리 사양을 선택해야 합니다(사설망 대역폭 및 PPS는 사양에 따라 다름). PHP용 OPcache를 사용하여 성능을 향상시킬 수 있으며, NextCloud 서버는 APCu 메모리 캐시를 사용하여 성능을 더욱 향상시킬 수 있으므로 대용량 메모리를 선택하는 것이 좋습니다.\"}],\"type\":\"p\",\"id\":\"_i7HMUNWsF3uMWpIzbvNI\"},{\"children\":[{\"text\":\"구매 후 CVM 인스턴스 구성을 조정할 수 있으므로 1코어 vCPU와 4GB MEM과 같은 낮은 사양의 인스턴스를 먼저 구매하고 온라인 파일 스토리지 서비스를 구축하여 운영 환경에 런칭한 후 사용자 및 파일 수와 CVM 모니터링 데이터를 기반으로 성능 향상을 위한 사양 업그레이드 여부를 결정합니다. 가정 또는 중소기업과 같은 다중 사용자 시나리오에서 서비스를 사용해야 하는 경우 충분한 성능을 제공하기 위해 2코어 8GB MEM 또는 4코어 16GB MEM 인스턴스를 구매하는 것이 좋습니다.\"}],\"type\":\"p\",\"id\":\"1HoThh_-OEGTZMbGGd6iy\"},{\"children\":[{\"text\":\"서버 운영 체제\"}],\"nodeId\":\".EC.84.9C.EB.B2.84-.EC.9A.B4.EC.98.81-.EC.B2.B4.EC.A0.9C\",\"type\":\"h3\",\"id\":\"ccaofMWnDwH5VrImFj756\"},{\"children\":[{\"text\":\"주요 Linux 릴리스 버전은 NextCloud 서버를 잘 유지할 수 있습니다. 이들의 구성은 소프트웨어 패키지 설치에 사용되는 명령(패키지 관리 툴)을 제외하고는 기본적으로 동일합니다.\"}],\"type\":\"p\",\"id\":\"-nS9dOaM1t4ZIicBdfm7O\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"jFmAo1Xw8g6V_N2G5w28a\"},{\"children\":[{\"text\":\"본문은 CentOS 7.7의 CVM 인스턴스를 예로 들어 설명합니다.\"}],\"type\":\"p\",\"id\":\"ryrDAP5TLqvMaNX39Gl4t\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"bBcouRAVFMWI3Lxr4m63n\"},{\"children\":[{\"text\":\"데이터베이스\"}],\"nodeId\":\".EB.8D.B0.EC.9D.B4.ED.84.B0.EB.B2.A0.EC.9D.B4.EC.8A.A4\",\"type\":\"h3\",\"id\":\"EGRgHhLBM0uQWeq-TyzAK\"},{\"children\":[{\"text\":\"앞서 언급한 바와 같이 실제 업무에서는 MySQL을 PHP와 함께 사용하는 것이 일반적입니다. MariaDB는 MySQL의 '포크(fork)' 버전으로, MySQL과의 호환성이 높기 때문에 NextCloud 서버는 MySQL 5.7+ 또는 MariaDB 10.2+에서 잘 실행될 수 있습니다.\"}],\"type\":\"p\",\"id\":\"_388ETRjovWakhTZC5TE4\"},{\"children\":[{\"text\":\"Tencent Cloud는 TencentDB for MySQL과 TencentDB for MariaDB를 제공합니다. 두 서비스 모두 원본-복제 고가용성 아키텍처를 채택하고 CVM에서 자체 구축한 데이터베이스에 비해 안정성이 더 높습니다. 또한 자동 백업과 같은 사용하기 쉬운 Ops 기능을 지원합니다. 따라서 실제 비즈니스에서 TencentDB를 사용하는 것이 좋습니다.\"}],\"type\":\"p\",\"id\":\"PINLWdBSSOI7Q7FD7OY7d\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"VM2Re7OJulw9oODDiFelp\"},{\"children\":[{\"text\":\"본문은 TencentDB for MySQL 5.7 인스턴스를 예로 들어 설명합니다.\"}],\"type\":\"p\",\"id\":\"oMaxfGHuEHAsT6dU6wO0Y\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"u0PUkXnZPPJt-qlDcHsEr\"},{\"children\":[{\"text\":\"Web 서버 및 PHP Runtime\"}],\"nodeId\":\"web-.EC.84.9C.EB.B2.84-.EB.B0.8F-php-runtime\",\"type\":\"h3\",\"id\":\"1v-oNy-otEuppqcdZ5NjY\"},{\"children\":[{\"text\":\"일부 NextCloud 서버 구성은 \"},{\"code\":1,\"text\":\".htaccess\"},{\"text\":\" 파일에 지정되어 있으므로 Apache 서버 소프트웨어 애플리케이션을 사용할 때 NextCloud의 내장 구성 항목을 직접 사용할 수 있습니다. Nginx는 최근 급속도로 발전하고 있는 Web 서버 소프트웨어 애플리케이션으로 Apache에 비해 설치 및 구성이 쉽고 리소스 사용량이 적으며 로드 용량이 큰 것이 특징입니다. NextCloud 서버의 \"},{\"code\":1,\"text\":\".htaccess\"},{\"text\":\" 구성을 Nginx 구성으로 변환하여 NextCloud 서버를 더 잘 유지할 수 있습니다. 본문은 Nginx 서버 소프트웨어 애플리케이션을 사용하며 참고용으로 완전한 Nginx 구성 예시를 제공합니다.\"}],\"type\":\"p\",\"id\":\"eYM5mQpyPPIXTK7mpNtFE\"},{\"children\":[{\"text\":\"PHP Runtime은 PHP 7로 업그레이드되었으며 주요 유지 관리 버전에는 모두 NextCloud 서버를 지원하는 7.2, 7.3 및 7.4가 포함됩니다. 여기에서는 최신 버전 7.4를 사용합니다. 또한 NextCloud는 특정 PHP 모듈에 의존합니다. 특정 모듈에 대한 요구 사항은 아래에 자세히 설명되어 있습니다.\"}],\"type\":\"p\",\"id\":\"MPCkGKTpqQKLwFSYgkfZ5\"},{\"children\":[{\"text\":\"Tencent Cloud 네트워크 환경\"}],\"nodeId\":\"tencent-cloud-.EB.84.A4.ED.8A.B8.EC.9B.8C.ED.81.AC-.ED.99.98.EA.B2.BD\",\"type\":\"h3\",\"id\":\"TLQ3LrO27R1iRHiIgUx1-\"},{\"children\":[{\"text\":\"현재 Tencent Cloud는 클래식 네트워크 및 VPC 환경을 제공합니다. 클래식 네트워크는 모든 Tencent Cloud 사용자가 공유하는 공중망 리소스 풀로, 모든 CVM 인스턴스의 사설망 IP가 Tencent Cloud에 의해 할당되며 IP 범위 또는 IP 주소를 사용자 지정할 수 없습니다. VPC는 Tencent Cloud에서 논리적으로 격리된 네트워크 공간입니다. VPC에서 IP 범위, IP 주소 및 라우팅 정책을 사용자 지정할 수 있습니다. 현재 클래식 네트워크 리소스가 부족하고 확장할 수 없기 때문에 클래식 네트워크는 더 이상 새 계정과 일부 새 AZ에서 지원되지 않습니다. 따라서 이 문서에서는 VPC를 예로 들어 설명합니다.\"}],\"type\":\"p\",\"id\":\"L-i5dOcu_7H9caNWUW3CF\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"vwhwv5zfKXpza5hygJlEc\"},{\"children\":[{\"text\":\" VPC에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"개요\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/215/535\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/215/535\"},\"type\":\"ref\",\"id\":\"IYQW6reNnZEn7uNw_-MQa\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"hhtYKj8xG-fBJETpk67V2\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"g4BTjj9yJctoaRQKRXOWD\"},{\"children\":[{\"text\":\"CBS와 COS의 비교\"}],\"nodeId\":\"cbs.EC.99.80-cos.EC.9D.98-.EB.B9.84.EA.B5.90\",\"type\":\"h2\",\"id\":\"gVGipq3gZh1UYO2ls2nEH\"},{\"children\":[{\"text\":\"CBS(Cloud Block Storage) 디스크는 CVM 인스턴스의 로컬 디스크로 운영 체제에 마운트됩니다. NextCloud는 기본적으로 파일 시스템을 사용하여 온라인 파일 스토리지 데이터를 저장하므로 NextCloud 데이터를 운영 체제의 CBS 디스크에 직접 저장할 수 있습니다. CBS와 비교하여 COS는 다음과 같은 이점을 제공합니다.\"}],\"type\":\"p\",\"id\":\"8WGuygmVdFp2j6S-C-9pK\"},{\"children\":[{\"text\":\"사용 사례\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9-.EC.82.AC.EB.A1.80\",\"type\":\"h3\",\"id\":\"9a5hHpR7xqWp9r6Gx8PVo\"},{\"children\":[{\"text\":\"CBS\"}],\"nodeId\":\"cbs\",\"type\":\"h4\",\"id\":\"rIkvpLQIe_iI9Ny4uy5kk\"},{\"children\":[{\"text\":\"CBS는 일종의 블록 스토리지로 CVM 운영 체제에 디스크로 직접 마운트할 수 있습니다. 일반적으로 CBS 디스크는 운영 체제에서만 사용되며 하나의 CVM 인스턴스에만 마운트할 수 있습니다. 그러나 읽기/쓰기 성능이 높고 높은 IO와 낮은 대기 시간이 필요한 시나리오에 적합하며 하나의 CVM 인스턴스에서만 독점적으로 사용됩니다.\"}],\"type\":\"p\",\"id\":\"DUuYoe_T_QP3OX3EFBmGP\"},{\"children\":[{\"text\":\"COS\"}],\"nodeId\":\"cos\",\"type\":\"h4\",\"id\":\"Ul4bhUO7NPhtvR34qH8p8\"},{\"children\":[{\"text\":\"COS는 HTTP 프로토콜을 통해 읽기/쓰기 API를 개방하므로 프로그래밍을 통해 COS에 저장된 객체(파일)에 액세스해야 합니다. 파일 경로와 같은 객체 Key를 인덱스로 사용하며 저장 용량이 무제한입니다. 데이터가 네트워크를 통해 전송되기 때문에 COS는 속도가 느리고 대기 시간이 더 깁니다. 그러나 객체에 대한 작업이 수행되므로 애플리케이션에서 객체를 조작한 후 다른 애플리케이션에서 즉시 동일한 객체를 조작할 수 있습니다. 결론적으로 COS는 고성능이 필요하지 않지만 비용 효율적인 대용량 스토리지 또는 공유 액세스가 필요한 시나리오에 적합합니다. 다음과 같은 이유로 온라인 파일 스토리지 애플리케이션을 COS와 함께 사용하는 것이 더 적합합니다. 온라인 파일 스토리지 애플리케이션은 네트워크를 통해 데이터를 전송하며 짧은 대기 시간이 필요하지 않습니다. 온라인 파일 저장 클라이언트에서 서버로 그리고 COS로 연결되는 속도와 대기 시간은 주로 클라이언트 네트워크에 따라 달라집니다. COS는 자체 속도를 제한하지 않습니다.\"}],\"type\":\"p\",\"id\":\"5Vw3zipaSsLYxnRm8sZgn\"},{\"children\":[{\"text\":\"유지 관리\"}],\"nodeId\":\".EC.9C.A0.EC.A7.80-.EA.B4.80.EB.A6.AC\",\"type\":\"h3\",\"id\":\"2tksHCq8x8cIybQfSB3XM\"},{\"children\":[{\"text\":\"CBS\"}],\"nodeId\":\"cbs2\",\"type\":\"h4\",\"id\":\"VI6EHeT9gyygXO9vKbx11\"},{\"children\":[{\"text\":\"CBS에는 고정 용량이 있으며 콘솔 또는 Tencent Cloud API를 통해 확장할 수 있습니다. 확장 후에는 운영 체제에 파티션을 추가해야 하며 파티션 예외가 발생할 수 있으며 일정한 유지 관리 비용이 발생합니다.\"}],\"type\":\"p\",\"id\":\"MI5fUWL2wYvqhlsTLfF2U\"},{\"children\":[{\"text\":\"COS\"}],\"nodeId\":\"cos2\",\"type\":\"h4\",\"id\":\"XLhU_B6SYLbYXSHOqyFEl\"},{\"children\":[{\"text\":\"COS는 주문형으로 사용되며 총 용량이나 객체(파일)의 수를 제한하지 않으므로 유지 관리가 전혀 필요하지 않습니다.\"}],\"type\":\"p\",\"id\":\"rs1140OiKZaj03Oru4RdW\"},{\"children\":[{\"text\":\"데이터 보안\"}],\"nodeId\":\".EB.8D.B0.EC.9D.B4.ED.84.B0-.EB.B3.B4.EC.95.88\",\"type\":\"h3\",\"id\":\"oH5Dom4b_z31kZ1-pGTCR\"},{\"children\":[{\"text\":\"CBS와 COS 모두 데이터의 신뢰성을 보장하기 위해 다중 복사와 같은 방법을 사용합니다.\"}],\"type\":\"p\",\"id\":\"BTkSZseMZ5N4VAkUqSWbP\"},{\"children\":[{\"text\":\"NextCloud 서버 실행 환경 구축\"}],\"nodeId\":\"nextcloud-.EC.84.9C.EB.B2.84-.EC.8B.A4.ED.96.89-.ED.99.98.EA.B2.BD-.EA.B5.AC.EC.B6.95\",\"type\":\"h2\",\"id\":\"Xt5O-mX0ivbAMRI_X8IuV\"},{\"children\":[{\"text\":\"NextCloud 서버가 의존하는 Tencent Cloud 제품 준비\"}],\"nodeId\":\"nextcloud-.EC.84.9C.EB.B2.84.EA.B0.80-.EC.9D.98.EC.A1.B4.ED.95.98.EB.8A.94-tencent-cloud-.EC.A0.9C.ED.92.88-.EC.A4.80.EB.B9.84\",\"type\":\"h3\",\"id\":\"fQQoXaCPZQrPJrysjN58M\"},{\"children\":[{\"text\":\"CVM\"}],\"nodeId\":\"cvm\",\"type\":\"h4\",\"id\":\"4H0euxnZ17ApSc34yrJBe\"},{\"children\":[{\"text\":\"CVM을 시작하려면 \"},{\"children\":[{\"text\":\"사용자 정의 구성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/213/8036\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/213/8036\"},\"type\":\"ref\",\"id\":\"bUzJPRwntNxTngW9UBQQr\"},{\"text\":\"을 참고하십시오.\"}],\"type\":\"p\",\"id\":\"qXh-Hgv0HTTwdU2Xbe_G7\"},{\"children\":[{\"text\":\"TencentDB for MySQL\"}],\"nodeId\":\"tencentdb-for-mysql\",\"type\":\"h4\",\"id\":\"AgKz-WZw7xa3VQI8htS5P\"},{\"children\":[{\"text\":\"시작하려면 \"},{\"children\":[{\"text\":\"MySQL 인스턴스 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/236/37785\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/236/37785\"},\"type\":\"ref\",\"id\":\"KG9AdyWCMohBmDh_Eg8cp\"},{\"text\":\"을 참고하십시오.\"}],\"type\":\"p\",\"id\":\"MMhdGFQniXVe9be7lNvb3\"},{\"children\":[{\"text\":\"COS\"}],\"nodeId\":\"cos3\",\"type\":\"h4\",\"id\":\"PB1_h45pZO7R2ZTadSlKN\"},{\"children\":[{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\",\"id\":\"JyY5pNVQbw4YpRQ1Wv0o3\"},{\"text\":\"에 로그인(처음 사용하는 경우 COS를 먼저 활성화해야 함)하고 \"},{\"b\":1,\"text\":\"버킷 리스트\"},{\"text\":\" 페이지로 이동하여 \"},{\"b\":1,\"text\":\"버킷 생성\"},{\"text\":\"을 클릭하고 다음과 같이 구성합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"9I8R9lh3yHOvHWe_abJPd\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"구성 항목\"}],\"type\":\"p\",\"id\":\"MOCR0MaW9OdO8zEM_Zs9V\"}],\"type\":\"cell\",\"id\":\"IoKgWkExxOrNQbejZgBoA\"},{\"children\":[{\"children\":[{\"text\":\"값\"}],\"type\":\"p\",\"id\":\"GUngoRiWHAA-5vc_mcWU4\"}],\"type\":\"cell\",\"id\":\"oXX1co-8bDKx34TaNN_pV\"}],\"type\":\"row\",\"id\":\"xMuv3LXy5l8yVENCV6Ym0\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"이름\"}],\"type\":\"p\",\"id\":\"QYrCC4eJkJXtz0I0Oqj9k\"}],\"type\":\"cell\",\"id\":\"PJc0E30EiTu4Npg6xpzfr\"},{\"children\":[{\"children\":[{\"text\":\"nextcloud와 같은 사용자 정의 버킷 이름을 입력하십시오. 한 번 확인된 이름은 변경할 수 없습니다.\"}],\"type\":\"p\",\"id\":\"BP_5znYJjB0D3vv9Nk2e6\"}],\"type\":\"cell\",\"id\":\"2hTOd4wXF65NFHBwzh__l\"}],\"type\":\"row\",\"id\":\"k5KkP1tgHDVivWp_XJhdm\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"리전\"}],\"type\":\"p\",\"id\":\"5OjBgrYYY5azwZ6iCBCq_\"}],\"type\":\"cell\",\"id\":\"0FICkVLGgotskSS2KsPxx\"},{\"children\":[{\"children\":[{\"text\":\"CVM 인스턴스의 리전을 선택합니다 \"}],\"type\":\"p\",\"id\":\"W0TthAxfuGkT2KshWgmXC\"}],\"type\":\"cell\",\"id\":\"wW_c3F2AosMzEarDv3I16\"}],\"type\":\"row\",\"id\":\"c2eKU1fnkvKJVHtt1KJHD\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"기타\"}],\"type\":\"p\",\"id\":\"zLI-iyTr-VBZGixolwKBE\"}],\"type\":\"cell\",\"id\":\"97T5SaUhNwwm5X54VI1YX\"},{\"children\":[{\"children\":[{\"text\":\"기본 설정을 유지합니다\"}],\"type\":\"p\",\"id\":\"DnBIfgQSFO4xBAOfQ5jFh\"}],\"type\":\"cell\",\"id\":\"_2bH5M_g79MrDvPncKOVV\"}],\"type\":\"row\",\"id\":\"fVYM7QU8uwFCNr8OoVJAD\"}],\"rowHeader\":true,\"type\":\"table\",\"widths\":[14,86],\"id\":\"CFtsDAQ5nTPnxqwj7LT0m\",\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"상기 구성 항목을 설정한 후 \"},{\"b\":1,\"text\":\"확인\"},{\"text\":\"을 클릭합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"wCSso-Ce3KdOdLCxOnjXo\"},{\"children\":[{\"text\":\"Web 서버와 PHP Runtime 설치 및 구성\"}],\"nodeId\":\"web-.EC.84.9C.EB.B2.84.EC.99.80-php-runtime-.EC.84.A4.EC.B9.98-.EB.B0.8F-.EA.B5.AC.EC.84.B1\",\"type\":\"h3\",\"id\":\"qaLhwZkRkHsmLjTj4dHL9\"},{\"children\":[{\"text\":\"Nginx 설치\"}],\"nodeId\":\"nginx-.EC.84.A4.EC.B9.98\",\"type\":\"h4\",\"id\":\"_r_V7sXpH_x_rHBr4sMlm\"},{\"children\":[{\"text\":\"SSH 툴을 사용하여 새로 구매한 서버에 로그인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"P5fr8PpCntDrYBcobTvrT\"},{\"children\":[{\"text\":\"다음 명령을 실행하여 Nginx를 설치합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"hH6DicVHxnVTfbHrYjwQn\"},{\"children\":[{\"children\":[{\"text\":\"yum install nginx\"}],\"type\":\"code-line\",\"id\":\"uRbLVciMbceU2FJSnHbkd\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"27TuqHFxpxE6zFoM7fzyz\",\"autoWrap\":false},{\"children\":[{\"text\":\" 다음과 같은 정보가 뜨면 \"},{\"code\":1,\"text\":\"Y\"},{\"text\":\"와 Enter 키를 눌러 설치를 확인합니다(이하 동일).\"}],\"indent\":1,\"type\":\"p\",\"id\":\"205IzdkuSfn1PbuW1-qe_\"},{\"children\":[{\"children\":[{\"text\":\"Is this ok [y/d/N]:\"}],\"type\":\"code-line\",\"id\":\"kXVls_POgmfNRGAyuQunS\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"J3V4dCIr1_mP8hjtrCuk5\",\"autoWrap\":false},{\"children\":[{\"text\":\"다음과 같은 정보가 뜨면 설치가 완료된 것입니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"UejMeqH6OYC-HlsvG3nP3\"},{\"children\":[{\"children\":[{\"text\":\"Complete!\"}],\"type\":\"code-line\",\"id\":\"Q8bskpKbepktkyhy0ie_s\"},{\"children\":[{\"text\":\"[root@VM-0-10-centos ~]#\"}],\"type\":\"code-line\",\"id\":\"ni5slGxtP7FYdeKoCj-KA\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"_HjnX8HhDIuQTuHOXuKfK\",\"autoWrap\":false},{\"children\":[{\"text\":\"다음 명령어를 실행하여 Nginx 버전이 정상적으로 조회되는지 검증합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"DwDO-T7b38h2BuXmdbXnb\"},{\"children\":[{\"children\":[{\"text\":\"nginx -v\"}],\"type\":\"code-line\",\"id\":\"WENXlV0EY1xvRAzuCxHph\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"WmEWOdNkWqpxc7QuUEzsQ\",\"autoWrap\":false},{\"children\":[{\"text\":\" 다음과 같은 정보가 뜨면 설치 검증이 끝난 것입니다.\"}],\"indent\":1,\"type\":\"p\",\"id\":\"jUhsPyHVAa3uSMRvc-fMW\"},{\"children\":[{\"children\":[{\"text\":\"nginx version: nginx/1.16.1\"}],\"type\":\"code-line\",\"id\":\"6rxDlAeIS8ZG7altDfrUU\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"N9Yw9HclqhfIcJJkeCXtR\",\"autoWrap\":false},{\"children\":[{\"text\":\"PHP 설치\"}],\"nodeId\":\"php-.EC.84.A4.EC.B9.98\",\"type\":\"h4\",\"id\":\"18Ezyz2_LB1A3W4ksfnrG\"},{\"children\":[{\"text\":\"SSH 툴을 사용하여 구매한 서버에 로그인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"OwgCv3MK0HPg8sl3rl5i_\"},{\"children\":[{\"text\":\"다음 명령어를 실행하여 PHP 7.4를 설치합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"08D_snt6wZIZ0t8oRt8A2\"},{\"children\":[{\"children\":[{\"text\":\"yum install epel-release yum-utils\"}],\"type\":\"code-line\",\"id\":\"eCPEJBHToMCrnqCSVb28X\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"SfgBrRgW6OFd3oP_XN7GS\",\"autoWrap\":false},{\"children\":[{\"text\":\"다음 명령을 순서대로 실행합니다.\\n\"},{\"b\":1,\"text\":\"명령어 1:\"}],\"start\":false,\"type\":\"oli\",\"id\":\"5iYL4hy9bj7_DpMdMSTUd\"},{\"children\":[{\"children\":[{\"text\":\"yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm\"}],\"type\":\"code-line\",\"id\":\"IE7m5gqje8Y4Su7NtKa3a\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"W3AXhsnpLCIHuwDBQSMO6\",\"autoWrap\":false},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"EKc-ABlAERALlLTGBwuEs\"},{\"children\":[{\"text\":\"명령 실행이 너무 느리거나 오랫동안 중단된 경우 \"},{\"code\":1,\"text\":\"Ctrl+C\"},{\"text\":\"를 눌러 실행을 취소하고 명령을 다시 실행할 수 있습니다(이하 동일).\"}],\"type\":\"p\",\"id\":\"6Im4ezZJ5DiiKF0ZxGWdI\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\",\"id\":\"NECNYWQaZXfQ0sDQIUaA6\"},{\"children\":[{\"b\":1,\"text\":\"명령어 2:\"}],\"indent\":1,\"type\":\"p\",\"id\":\"Gzu_BUajlEmWeBtOVksfS\"},{\"children\":[{\"children\":[{\"text\":\"yum-config-manager --enable remi-php74\"}],\"type\":\"code-line\",\"id\":\"vkY-j5jhCYBRZK8tru2-s\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"qwnKqMAMqpAuKbOlQX2hn\",\"autoWrap\":false},{\"children\":[{\"b\":1,\"text\":\"명령어 3:\"}],\"indent\":1,\"type\":\"p\",\"id\":\"nR1Wdv8I2hNtCFMps_3AS\"},{\"children\":[{\"children\":[{\"text\":\"yum install php php-fpm\"}],\"type\":\"code-line\",\"id\":\"GHm1ia-fwtrPS7X1PFd4Y\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"DnwrWhrk_QF_IEG-PXif6\",\"autoWrap\":false},{\"children\":[{\"text\":\"설치 완료 후 다음 명령어를 실행하여 PHP 버전이 정상적으로 조회되는지 검증합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"5oN5YXgqx2xvN9jyIwtvY\"},{\"children\":[{\"children\":[{\"text\":\"php -v\"}],\"type\":\"code-line\",\"id\":\"dzYdCGRJkEuHxcMred2EC\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"5uNRJXJNauny_n-DOqfYR\",\"autoWrap\":false},{\"children\":[{\"text\":\" 다음과 같은 정보가 뜨면 설치 검증이 끝난 것입니다.\"}],\"indent\":1,\"type\":\"p\",\"id\":\"Ymi3gE_chvnH9vuUbvaU5\"},{\"children\":[{\"children\":[{\"text\":\"PHP 7.4.8 (cli) (built: Jul 9 2020 08:57:23) ( NTS )\"}],\"type\":\"code-line\",\"id\":\"Hz_c8dzuJyqvINTeXSE70\"},{\"children\":[{\"text\":\"Copyright (c) The PHP Group\"}],\"type\":\"code-line\",\"id\":\"EOMN0S6Lkp-27cr6wJSPa\"},{\"children\":[{\"text\":\"Zend Engine v3.4.0, Copyright (c) Zend Technologies\"}],\"type\":\"code-line\",\"id\":\"icwygqioptY7dh5l1tTnV\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"VSL6tu6gRGovSmXDgjVy3\",\"autoWrap\":false},{\"children\":[{\"text\":\"PHP 모듈 설치\"}],\"nodeId\":\"php-.EB.AA.A8.EB.93.88-.EC.84.A4.EC.B9.98\",\"type\":\"h4\",\"id\":\"5vV_xczctk37XlMznQVjH\"},{\"children\":[{\"text\":\"NextCloud는 기본적인 PHP 외에도 다른 PHP 모듈에 종속되어 일부 기능을 실행합니다. NextCloud의 종속에 관련된 자세한 모듈 정보는 \"},{\"children\":[{\"text\":\"NextCloud 공식 홈페이지 문서\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://docs.nextcloud.com/server/19/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation\",\"props\":{\"type\":\"link\",\"url\":\"https://docs.nextcloud.com/server/19/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation\"},\"type\":\"ref\",\"id\":\"XuuLWIyn9H4lwmhKhr-xk\"},{\"text\":\"를 참조하십시오.\"}],\"type\":\"p\",\"id\":\"WJj0mGvkB17HgVVoyZKH6\"},{\"children\":[{\"text\":\"본 튜토리얼에는 NextCloud 필수 PHP 모듈이 설치됩니다. NextCloud의 다른 옵션 기능을 사용할 계획이라면 종속된 기타 PHP 모듈에 주의하여 설치하십시오.\"}],\"type\":\"p\",\"id\":\"wevH-_XFArPGpeJJQR_lW\"},{\"children\":[{\"text\":\"SSH 툴을 사용하여 구매한 서버에 로그인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"Ly9ObXoEoPHCyTDLeGOOO\"},{\"children\":[{\"text\":\"다음 명령어를 실행하여 PHP 모듈을 설치합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"x1L_0YylRbL-W8TZBWZC7\"},{\"children\":[{\"children\":[{\"text\":\"yum install php-xml php-gd php-mbstring php-mysqlnd php-intl php-zip\"}],\"type\":\"code-line\",\"id\":\"d9xIFcnbk1gTGP7yNasq6\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"DHCj1hnCUqBfFLC_8ACVI\",\"autoWrap\":false},{\"children\":[{\"text\":\"설치 완료 후 다음 명령어를 실행하여 설치된 PHP 모듈을 조회합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"W82Z4JrQi8b7fdj3Biwq4\"},{\"children\":[{\"children\":[{\"text\":\"php -m\"}],\"type\":\"code-line\",\"id\":\"RimWb1oG9c0yu4dXz0dz3\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"AyHGTSOijTR4Ne8vdqaZW\",\"autoWrap\":false},{\"children\":[{\"text\":\"기타 모듈 설치가 필요한 경우 \"},{\"code\":1,\"text\":\"yum install \"},{\"text\":\"을 다시 실행하면 됩니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"dZFBiwFbhf5A95gXowG1V\"},{\"children\":[{\"text\":\"NextCloud 서버 코드 업로드 및 압축 해제\"}],\"nodeId\":\"nextcloud-.EC.84.9C.EB.B2.84-.EC.BD.94.EB.93.9C-.EC.97.85.EB.A1.9C.EB.93.9C-.EB.B0.8F-.EC.95.95.EC.B6.95-.ED.95.B4.EC.A0.9C\",\"type\":\"h4\",\"id\":\"UllisL79tXOxJNYew1-ql\"},{\"children\":[{\"children\":[{\"text\":\"NextCloud 공식 홈페이지\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://nextcloud.com/install/#instructions-server\",\"props\":{\"type\":\"link\",\"url\":\"https://nextcloud.com/install/#instructions-server\"},\"type\":\"ref\",\"id\":\"XizPP6Qr7UpLxao5F3rgz\"},{\"text\":\"에서 NextCloud 서버 설치 패키지 최신 버전을 다운로드한 다음 서버 \"},{\"code\":1,\"text\":\"/var/www/\"},{\"text\":\" 디렉터리에 업로드합니다. 다음과 같은 방법으로 업로드할 수 있습니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"HzA18wSsMALPcULprpQ1c\"},{\"children\":[{\"code\":1,\"text\":\"wget\"},{\"text\":\" 명령어를 사용하여 서버에서 직접 설치 패키지를 다운로드합니다. 예: \"},{\"code\":1,\"text\":\"/var/www/\"},{\"text\":\" 디렉터리로 이동 후 명령어 \"},{\"code\":1,\"text\":\"wget https://download.nextcloud.com/server/releases/nextcloud-19.0.1.zip\"},{\"text\":\" 실행\"}],\"start\":true,\"type\":\"oli\",\"id\":\"ICT3Ooa2WC3HyFRrjOjkV\"},{\"children\":[{\"text\":\"로컬 컴퓨터에 다운로드한 후 SFTP 또는 SCP 등 소프트웨어를 통해 \"},{\"code\":1,\"text\":\"/var/www/\"},{\"text\":\" 디렉터리에 설치 패키지를 업로드합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"I_qn-3uHvH2O85w8Saw_z\"},{\"children\":[{\"text\":\"로컬 컴퓨터에 다운로드한 후 lrzsz를 사용하여 업로드합니다. 방법은 다음과 같습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"t21dhs-NqIgDCRaY6ui1-\"},{\"children\":[{\"text\":\"SSH 툴을 사용하여 구매한 서버에 로그인합니다.\"}],\"indent\":1,\"start\":true,\"type\":\"oli\",\"id\":\"FJhNIFk3JpKqd_NBvtxih\"},{\"children\":[{\"code\":1,\"text\":\"yum install lrzsz\"},{\"text\":\"를 실행하여 lrzsz를 설치합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"oli\",\"id\":\"4iQZwUimnEy2WEubw_0mR\"},{\"children\":[{\"code\":1,\"text\":\"cd /var/www/\"},{\"text\":\"를 실행하여 타깃 디렉터리로 이동합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"oli\",\"id\":\"fSSABmQpFz_YoKYBqGORU\"},{\"children\":[{\"code\":1,\"text\":\"rz -bye\"},{\"text\":\"를 실행하고 SSH 툴에서 로컬로 다운로드할 NextCloud 서버 설치 패키지를 선택합니다(해당 조작은 SSH 툴에 따라 상이함).\"}],\"indent\":1,\"start\":false,\"type\":\"oli\",\"id\":\"5utEF-Qjp6-PwBpz2S4fR\"},{\"children\":[{\"text\":\"SSH 툴을 사용하여 구매한 서버에 로그인합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"pPsgWnqfrLUbNU1-Pr8Pv\"},{\"children\":[{\"code\":1,\"text\":\"unzip nextcloud-.zip\"},{\"text\":\"을 실행하여 설치 패키지를 압축 해제합니다(예: \"},{\"code\":1,\"text\":\"unzip nextcloud-19.0.1.zip\"},{\"text\":\").\"}],\"start\":false,\"type\":\"oli\",\"id\":\"wbogNTnM2qIWShVtBZZbQ\"},{\"children\":[{\"text\":\"PHP 설정\"}],\"nodeId\":\"php-.EC.84.A4.EC.A0.95\",\"type\":\"h4\",\"id\":\"-azxBayyT0uD3AkGfllwn\"},{\"children\":[{\"text\":\"SSH 툴을 사용하여 구매한 서버에 로그인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"oLKERzoDO7yd1EnGiLtHC\"},{\"children\":[{\"code\":1,\"text\":\"vim /etc/php-fpm.d/www.conf\"},{\"text\":\"를 실행하여 PHP-FPM 구성 파일을 열고 순서대로 설정 항목을 수정합니다. vim의 구체적인 사용법은 관련 자료를 참조하십시오. 다른 방식을 사용해 해당 구성 파일을 수정할 수도 있습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"Bt3-t-EWTbaGVoT9fEAHv\"},{\"children\":[{\"code\":1,\"text\":\"user = apache\"},{\"text\":\"를 \"},{\"code\":1,\"text\":\"user = nginx\"},{\"text\":\"로 수정합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"2Z7SA2H4HAxEK1Dt29DAw\"},{\"children\":[{\"code\":1,\"text\":\"group = apache\"},{\"text\":\"를 \"},{\"code\":1,\"text\":\"group = nginx\"},{\"text\":\"로 수정합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"PH1UPgADgWkuFC7E7M7f6\"},{\"children\":[{\"text\":\"수정 완료 후 \"},{\"code\":1,\"text\":\":wq\"},{\"text\":\"를 입력하여 파일을 저장하고 종료합니다. vim의 구체적인 작업 가이드는 관련 문서를 참조하십시오.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"jBlccKL5LkCw9WETWwBB-\"},{\"children\":[{\"text\":\"다음 명령어를 실행하여 PHP가 Nginx 사용에 최적화되도록 디렉터리 소유자를 수정합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"ojkOKFmKyDkxC3adc9YkU\"},{\"children\":[{\"children\":[{\"text\":\"chown -R nginx:nginx /var/lib/php\"}],\"type\":\"code-line\",\"id\":\"VeMvIs7x-yhenVbxaE5SK\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"c1Moi9YAAtfH9RyLL_CC2\",\"autoWrap\":false},{\"children\":[{\"text\":\"계속해서 다음 명령어를 실행하고 PHP-FPM 서비스를 실행합니다.\\n\"},{\"b\":1,\"text\":\"명령어 1:\"}],\"start\":false,\"type\":\"oli\",\"id\":\"SYdhupgXB4oxKA-Cco-of\"},{\"children\":[{\"children\":[{\"text\":\"systemctl enable php-fpm # 명령어 1\"}],\"type\":\"code-line\",\"id\":\"OkA4qpyZ-RVSUiDJRitx6\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"nO1uKR7xQFSy1dbT_fc7e\",\"autoWrap\":false},{\"children\":[{\"b\":1,\"text\":\"명령어 2:\"}],\"indent\":1,\"type\":\"p\",\"id\":\"lHixSXlNNJdM_Na5sFpPl\"},{\"children\":[{\"children\":[{\"text\":\"systemctl start php-fpm # 명령어 2\"}],\"type\":\"code-line\",\"id\":\"tSkE5rj-7bIueGckBMFgf\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"HDh7rnG0_NLAhcRnxbqa-\",\"autoWrap\":false},{\"children\":[{\"text\":\"Nginx 설정\"}],\"nodeId\":\"nginx-.EC.84.A4.EC.A0.95\",\"type\":\"h4\",\"id\":\"rjjmZJmqB-xwBS-8P7yh7\"},{\"children\":[{\"text\":\"SSH 툴을 사용하여 구매한 서버에 로그인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"y-ckgYHM8ckRySfujdfgL\"},{\"children\":[{\"text\":\"다음 명령어를 실행하여 웹 사이트 디렉터리 소유자를 수정합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"qog6LDNGpUFssHg_61NZ4\"},{\"children\":[{\"children\":[{\"text\":\"chown -R nginx:nginx /var/www\"}],\"type\":\"code-line\",\"id\":\"Gn7NpyBgp3CYArKoEZImm\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"MJ2ItVg-JH1BPK12vn0IF\",\"autoWrap\":false},{\"children\":[{\"text\":\"기존의 Nginx 구성 파일 \"},{\"code\":1,\"text\":\"/etc/nginx/nginx.conf\"},{\"text\":\"를 백업합니다. 다음 조작이 가능합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"zSu-rKK5AgWM6x2EwnYkw\"},{\"children\":[{\"code\":1,\"text\":\"cp /etc/nginx/nginx.conf ~/nginx.conf.bak\"},{\"text\":\"를 실행하여 기존 구성 파일을 홈(HOME) 디렉터리에 백업합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"A4gjUt7J_zAE9NiZ9uFdL\"},{\"children\":[{\"text\":\"SFTP 또는 SCP 등 소프트웨어를 사용하여 기존 구성 파일을 로컬 컴퓨터에 다운로드합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"29DLCsndt20so9XKlUkSx\"},{\"children\":[{\"code\":1,\"text\":\"/etc/nginx/nginx.conf\"},{\"text\":\"를 다음 내용으로 수정 또는 대체합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"I0IVVzpfsq2qsIqQo6bf3\"},{\"children\":[{\"children\":[{\"text\":\"# For more information on configuration, see:\"}],\"type\":\"code-line\",\"id\":\"-nOLUMZ6bJGljhN0a0b_D\"},{\"children\":[{\"text\":\"# * Official English Documentation: http://nginx.org/en/docs/\"}],\"type\":\"code-line\",\"id\":\"bs91d8g7c1cgbSAxsGlQI\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"UNuTaQAe18j07s3BbrfJV\"},{\"children\":[{\"text\":\"user nginx;\"}],\"type\":\"code-line\",\"id\":\"MyCf9QCNf7ufrLXFjWUQq\"},{\"children\":[{\"text\":\"worker_processes auto;\"}],\"type\":\"code-line\",\"id\":\"j1K5tyAqzNR5OUWWrFNLL\"},{\"children\":[{\"text\":\"error_log /var/log/nginx/error.log;\"}],\"type\":\"code-line\",\"id\":\"8evp_ychSzC48Cx1_l5RL\"},{\"children\":[{\"text\":\"pid /run/nginx.pid;\"}],\"type\":\"code-line\",\"id\":\"DCexuv_2b7jfhLVSnbh_y\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"n1tRTX_2haRmf1Lynxqmz\"},{\"children\":[{\"text\":\"# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.\"}],\"type\":\"code-line\",\"id\":\"i8wXOnrx876V3q-JY6r37\"},{\"children\":[{\"text\":\"include /usr/share/nginx/modules/*.conf;\"}],\"type\":\"code-line\",\"id\":\"fFU2FOlYDCgdmHyUkR3a7\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"ThdfnC4JXJ-O9xpltzYnw\"},{\"children\":[{\"text\":\"events {\"}],\"type\":\"code-line\",\"id\":\"Mm_CGqtYhW9e937s5M-nC\"},{\"children\":[{\"text\":\" worker_connections 1024;\"}],\"type\":\"code-line\",\"id\":\"jZqozAy_b3AnuL1mFY9Fb\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"s0lze8BAL5g3Sb0BpCIew\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"VYCNPOrh3yayBzZ7plhsq\"},{\"children\":[{\"text\":\"http {\"}],\"type\":\"code-line\",\"id\":\"JPNKhJyWebJaHJ8-UZi8E\"},{\"children\":[{\"text\":\" log_format main '$remote_addr - $remote_user [$time_local] \\\"$request\\\" '\"}],\"type\":\"code-line\",\"id\":\"DQU82y76ScHjPLWM3oBRG\"},{\"children\":[{\"text\":\" '$status $body_bytes_sent \\\"$http_referer\\\" '\"}],\"type\":\"code-line\",\"id\":\"eW8Gslz-UyxsoYR7w-jJx\"},{\"children\":[{\"text\":\" '\\\"$http_user_agent\\\" \\\"$http_x_forwarded_for\\\"';\"}],\"type\":\"code-line\",\"id\":\"ZUMZgCGvYJFimdH_H7ETc\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"GNw3JBJAntoT7KL4Z9Bdt\"},{\"children\":[{\"text\":\" access_log /var/log/nginx/access.log main;\"}],\"type\":\"code-line\",\"id\":\"rEmkDy2JxCxNwZUBVEBu2\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"vIBjwKzg6kO5C7zC3owSH\"},{\"children\":[{\"text\":\" sendfile on;\"}],\"type\":\"code-line\",\"id\":\"c8UF-PcPhlonRWWSK_c5a\"},{\"children\":[{\"text\":\" tcp_nopush on;\"}],\"type\":\"code-line\",\"id\":\"7FipZ69F7olR0QkT62bpY\"},{\"children\":[{\"text\":\" tcp_nodelay on;\"}],\"type\":\"code-line\",\"id\":\"NIg3Tzt_yQGYCiCnESexR\"},{\"children\":[{\"text\":\" keepalive_timeout 65;\"}],\"type\":\"code-line\",\"id\":\"Ct3nsxulFGNwYRirCKk_X\"},{\"children\":[{\"text\":\" types_hash_max_size 2048;\"}],\"type\":\"code-line\",\"id\":\"J49p9H5ykm2JT1Ovz6O3O\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"LS-_AAsj1SQIstiHB26SF\"},{\"children\":[{\"text\":\" include /etc/nginx/mime.types;\"}],\"type\":\"code-line\",\"id\":\"UStl0TQoeVJURu7ZOC13G\"},{\"children\":[{\"text\":\" default_type application/octet-stream;\"}],\"type\":\"code-line\",\"id\":\"h-3lLqdyeeMeTu3_6mXUA\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"9AvJz8L2ndX8OpqCkval5\"},{\"children\":[{\"text\":\" # Load modular configuration files from the /etc/nginx/conf.d directory.\"}],\"type\":\"code-line\",\"id\":\"D2RMJkds79x5alO7vSZMc\"},{\"children\":[{\"text\":\" # See http://nginx.org/en/docs/ngx_core_module.html#include\"}],\"type\":\"code-line\",\"id\":\"2_K9voxTUs9HYT6yfn6O7\"},{\"children\":[{\"text\":\" # for more information.\"}],\"type\":\"code-line\",\"id\":\"7B_4yzcnmyob1-JrsTZsR\"},{\"children\":[{\"text\":\" include /etc/nginx/conf.d/*.conf;\"}],\"type\":\"code-line\",\"id\":\"UtCku718Y-3TR7wAhe7ri\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"fg5JDiGmtBGJ1RR-2yfTo\"},{\"children\":[{\"text\":\" server {\"}],\"type\":\"code-line\",\"id\":\"eFvKj-Ji61hgcSwbjhA5z\"},{\"children\":[{\"text\":\" listen 80 default_server;\"}],\"type\":\"code-line\",\"id\":\"3tIMb339vTLJB6xUZrC4H\"},{\"children\":[{\"text\":\" listen [::]:80 default_server;\"}],\"type\":\"code-line\",\"id\":\"EJdw3v-5u8gocdHnBm6wx\"},{\"children\":[{\"text\":\" server_name _;\"}],\"type\":\"code-line\",\"id\":\"2yv0eo19cuu7_WZio8_JZ\"},{\"children\":[{\"text\":\" root /var/www/nextcloud;\"}],\"type\":\"code-line\",\"id\":\"czT8W2UcBZvvcean9xy2I\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"yH8Io6QmL6dnFLv7kfISn\"},{\"children\":[{\"text\":\" add_header Referrer-Policy \\\"no-referrer\\\" always;\"}],\"type\":\"code-line\",\"id\":\"u0nIwX6gu0wZs7IBiHqt-\"},{\"children\":[{\"text\":\" add_header X-Content-Type-Options \\\"nosniff\\\" always;\"}],\"type\":\"code-line\",\"id\":\"lNnbZfZX902E2oni899dR\"},{\"children\":[{\"text\":\" add_header X-Download-Options \\\"noopen\\\" always;\"}],\"type\":\"code-line\",\"id\":\"i5ck3TqiQhARXuYIZnDhu\"},{\"children\":[{\"text\":\" add_header X-Frame-Options \\\"SAMEORIGIN\\\" always;\"}],\"type\":\"code-line\",\"id\":\"hjD7ArClwYfoG-B0r1y5P\"},{\"children\":[{\"text\":\" add_header X-Permitted-Cross-Domain-Policies \\\"none\\\" always;\"}],\"type\":\"code-line\",\"id\":\"1Phu0G-VgY0nVvnoAacBD\"},{\"children\":[{\"text\":\" add_header X-Robots-Tag \\\"none\\\" always;\"}],\"type\":\"code-line\",\"id\":\"tj3GIrE4t4SqiqLLfadBl\"},{\"children\":[{\"text\":\" add_header X-XSS-Protection \\\"1; mode=block\\\" always;\"}],\"type\":\"code-line\",\"id\":\"M362lW6ddQNX3_HccA_eE\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"9KStEp-CQElCD7WHx3oZC\"},{\"children\":[{\"text\":\" client_max_body_size 512M;\"}],\"type\":\"code-line\",\"id\":\"KqqD3R514Jke06Ora3TY2\"},{\"children\":[{\"text\":\" fastcgi_buffers 64 4K;\"}],\"type\":\"code-line\",\"id\":\"w40bFJEEpZtLaCafwcVAH\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"qIYheckB0u5EtURl2tcWl\"},{\"children\":[{\"text\":\" gzip on;\"}],\"type\":\"code-line\",\"id\":\"0qRvnbBSwY_rMzD47Lx6t\"},{\"children\":[{\"text\":\" gzip_vary on;\"}],\"type\":\"code-line\",\"id\":\"icA51Ly6BKGkBiBMWDpb0\"},{\"children\":[{\"text\":\" gzip_comp_level 4;\"}],\"type\":\"code-line\",\"id\":\"olrLaRHUQGHvEi4WlzMVt\"},{\"children\":[{\"text\":\" gzip_min_length 256;\"}],\"type\":\"code-line\",\"id\":\"vqCVInxIQeJAJ_07WsYOA\"},{\"children\":[{\"text\":\" gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;\"}],\"type\":\"code-line\",\"id\":\"C9llnQqWr9ztw30JgLCyF\"},{\"children\":[{\"text\":\" gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;\"}],\"type\":\"code-line\",\"id\":\"1c_VfBOtdEnsHT5GiUZst\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"XfHfIG64jgfKf3IZS5Ly3\"},{\"children\":[{\"text\":\" # Load configuration files for the default server block.\"}],\"type\":\"code-line\",\"id\":\"PHXhYj9bxe6VyhzwiPT-G\"},{\"children\":[{\"text\":\" include /etc/nginx/default.d/*.conf;\"}],\"type\":\"code-line\",\"id\":\"JgtWRx1AoGI6tIpBuYvfL\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"F-zRUi8SkeG46_AABK7AY\"},{\"children\":[{\"text\":\" location / {\"}],\"type\":\"code-line\",\"id\":\"mCZHsQWe5a06ts_SFXfAI\"},{\"children\":[{\"text\":\" try_files $uri $uri/ =404;\"}],\"type\":\"code-line\",\"id\":\"8Ov6HUEFyhSLr1HfjRuG-\"},{\"children\":[{\"text\":\" index index.php;\"}],\"type\":\"code-line\",\"id\":\"Wjb3U32YIQ2La-yOjByGE\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"QJIUlAVife0VuV21Myd8R\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"PV-PuACPvH9K1a4eGz1h1\"},{\"children\":[{\"text\":\" location ~ ^\\\\/(?:build|tests|config|lib|3rdparty|templates|data)\\\\/ {\"}],\"type\":\"code-line\",\"id\":\"0b7n305AwTPsTwZRV8nKL\"},{\"children\":[{\"text\":\" deny all;\"}],\"type\":\"code-line\",\"id\":\"UNkQ14FVfKDVZTUlpE57L\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"qoWf3Qd_fr874TuQABVBl\"},{\"children\":[{\"text\":\" location ~ ^\\\\/(?:\\\\.|autotest|occ|issue|indie|db_|console) {\"}],\"type\":\"code-line\",\"id\":\"A2zr2R9XNOMVhKryWHrGj\"},{\"children\":[{\"text\":\" deny all;\"}],\"type\":\"code-line\",\"id\":\"p2qBdF0IGJma5uSLG7-Rj\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"WYVm-NMCwzh2vDPhuBdwq\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"rD-XLLWAgQAKKAtFqD7hW\"},{\"children\":[{\"text\":\" location ~ ^\\\\/(?:index|remote|public|cron|core\\\\/ajax\\\\/update|status|ocs\\\\/v[12]|updater\\\\/.+|oc[ms]-provider\\\\/.+)\\\\.php(?:$|\\\\/) {\"}],\"type\":\"code-line\",\"id\":\"UJBgMQuERRIK1PV_9uSBj\"},{\"children\":[{\"text\":\" fastcgi_split_path_info ^(.+?\\\\.php)(\\\\/.*|)$;\"}],\"type\":\"code-line\",\"id\":\"RKZl3OXg8u3i6BSqhU3-d\"},{\"children\":[{\"text\":\" set $path_info $fastcgi_path_info;\"}],\"type\":\"code-line\",\"id\":\"f0zu0ndR2BsGFODuQb0C5\"},{\"children\":[{\"text\":\" try_files $fastcgi_script_name =404;\"}],\"type\":\"code-line\",\"id\":\"ZJ8oq8jsGuB9o_OCRlFP2\"},{\"children\":[{\"text\":\" include fastcgi_params;\"}],\"type\":\"code-line\",\"id\":\"I7ugTuRngh_TzIxj7vJQ2\"},{\"children\":[{\"text\":\" fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\"}],\"type\":\"code-line\",\"id\":\"5i0i8OwuV8Sc4HaPYGnfa\"},{\"children\":[{\"text\":\" fastcgi_param PATH_INFO $path_info;\"}],\"type\":\"code-line\",\"id\":\"zN1YvMAt2TL8Wqq9xpLja\"},{\"children\":[{\"text\":\" fastcgi_param modHeadersAvailable true;\"}],\"type\":\"code-line\",\"id\":\"ZQXcUPtGaqMx7rd5rxFbL\"},{\"children\":[{\"text\":\" fastcgi_pass 127.0.0.1:9000;\"}],\"type\":\"code-line\",\"id\":\"xLu1A4jArZIO2ARFGp_ZQ\"},{\"children\":[{\"text\":\" fastcgi_intercept_errors on;\"}],\"type\":\"code-line\",\"id\":\"nZmrumFoxoCggWWUq8tHr\"},{\"children\":[{\"text\":\" fastcgi_request_buffering off;\"}],\"type\":\"code-line\",\"id\":\"LpQxVCkWRv7U_kE2dPKHM\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"dRtU1-LiwJqUlCthF22A_\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"aaW1cWhjcdUj-WHdvKamX\"},{\"children\":[{\"text\":\" location ~ ^\\\\/(?:updater|oc[ms]-provider)(?:$|\\\\/) {\"}],\"type\":\"code-line\",\"id\":\"0Qz-FWSOaS3rBmJamI7ue\"},{\"children\":[{\"text\":\" try_files $uri/ =404;\"}],\"type\":\"code-line\",\"id\":\"9tErhRqivsZLUn0tG0h2_\"},{\"children\":[{\"text\":\" index index.php;\"}],\"type\":\"code-line\",\"id\":\"fGgfY_mWoH7SIajPN2XsQ\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"AnTZPUZNiJfoHoVW3tjo-\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"vMrnq9zsRX9PDnNXQCDnk\"},{\"children\":[{\"text\":\" location ~ \\\\.(css|js|svg|gif)$ {\"}],\"type\":\"code-line\",\"id\":\"T6UitJ_dZvrhpXRlJ0DPP\"},{\"children\":[{\"text\":\" add_header Cache-Control \\\"max-age=15778463\\\";\"}],\"type\":\"code-line\",\"id\":\"1Io6ehdeKjz6xIExbBvvm\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"I3wLAWcdVscO6J6-KxGkM\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"skg_P3-KF9yAc_rMUFXxz\"},{\"children\":[{\"text\":\" location ~ \\\\.woff2?$ {\"}],\"type\":\"code-line\",\"id\":\"Aq237OsW-gPqLDFt13Tih\"},{\"children\":[{\"text\":\" add_header Cache-Control \\\"max-age=604800\\\";\"}],\"type\":\"code-line\",\"id\":\"Z0e3UqhbjkOZNVf9tU_4Y\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"joBq83KBsqfjOOvKjGkZM\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"ndmp5CtegwCTFG2OApkxM\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"OQpjbG3a_rZmngRkU9QPD\"},{\"children\":[{\"text\":\"# Settings for a TLS enabled server.\"}],\"type\":\"code-line\",\"id\":\"vDoHm8Z1iWzWOF8zqLdmw\"},{\"children\":[{\"text\":\"#\"}],\"type\":\"code-line\",\"id\":\"K3ege0MvNlUoQj78U8vBH\"},{\"children\":[{\"text\":\"# server {\"}],\"type\":\"code-line\",\"id\":\"31fjcHdBaI-hCF0l7vJoq\"},{\"children\":[{\"text\":\"# listen 443 ssl http2 default_server;\"}],\"type\":\"code-line\",\"id\":\"SW-r_9UvuKDxEWigPeQKJ\"},{\"children\":[{\"text\":\"# listen [::]:443 ssl http2 default_server;\"}],\"type\":\"code-line\",\"id\":\"LLYG7mRf3qKsZowgATb8R\"},{\"children\":[{\"text\":\"# server_name _;\"}],\"type\":\"code-line\",\"id\":\"RXVbeGh1CEKKcBJL8tuJ3\"},{\"children\":[{\"text\":\"# root /usr/share/nginx/html;\"}],\"type\":\"code-line\",\"id\":\"-J3vfESQTkEmPSm8U0H0u\"},{\"children\":[{\"text\":\"#\"}],\"type\":\"code-line\",\"id\":\"sujbsCrJd77i1DEnTCKj0\"},{\"children\":[{\"text\":\"# ssl_certificate \\\"/etc/pki/nginx/server.crt\\\";\"}],\"type\":\"code-line\",\"id\":\"HhSZLS7MpJ4pNlaK3yQna\"},{\"children\":[{\"text\":\"# ssl_certificate_key \\\"/etc/pki/nginx/private/server.key\\\";\"}],\"type\":\"code-line\",\"id\":\"FwgXR4CR8kogU9lxCvs0p\"},{\"children\":[{\"text\":\"# ssl_session_cache shared:SSL:1m;\"}],\"type\":\"code-line\",\"id\":\"IsniJkAU7sJlE9wqRY90H\"},{\"children\":[{\"text\":\"# ssl_session_timeout 10m;\"}],\"type\":\"code-line\",\"id\":\"pyU9Yz117E4f8LGJo8YOy\"},{\"children\":[{\"text\":\"# ssl_ciphers HIGH:!aNULL:!MD5;\"}],\"type\":\"code-line\",\"id\":\"KZDXcEghU8XMghAaJB_r3\"},{\"children\":[{\"text\":\"# ssl_prefer_server_ciphers on;\"}],\"type\":\"code-line\",\"id\":\"ETQiyqdQ0SgGAUj35JW3B\"},{\"children\":[{\"text\":\"#\"}],\"type\":\"code-line\",\"id\":\"48dCYF9g9-BW8EKWuUnj9\"},{\"children\":[{\"text\":\"# # Load configuration files for the default server block.\"}],\"type\":\"code-line\",\"id\":\"43_wgOVEIjDLXiF-9Wqh7\"},{\"children\":[{\"text\":\"# include /etc/nginx/default.d/*.conf;\"}],\"type\":\"code-line\",\"id\":\"5PWHB6DP1sB-XfNpG0aaX\"},{\"children\":[{\"text\":\"#\"}],\"type\":\"code-line\",\"id\":\"-FjP4eOdF4oLid6EgpTQ8\"},{\"children\":[{\"text\":\"# location / {\"}],\"type\":\"code-line\",\"id\":\"09AXkDBr2ljmZKDfISU1C\"},{\"children\":[{\"text\":\"# }\"}],\"type\":\"code-line\",\"id\":\"Kj0IcUcD0dz-UxlO5LXon\"},{\"children\":[{\"text\":\"#\"}],\"type\":\"code-line\",\"id\":\"Wu21jnCBtp1_jeFhOIax-\"},{\"children\":[{\"text\":\"# error_page 404 /404.html;\"}],\"type\":\"code-line\",\"id\":\"NFL2i4VV5TQDMU2wsLqIc\"},{\"children\":[{\"text\":\"# location = /40x.html {\"}],\"type\":\"code-line\",\"id\":\"C_i8MWm75BV4SeeJLA6GA\"},{\"children\":[{\"text\":\"# }\"}],\"type\":\"code-line\",\"id\":\"JMV3-zSUCA5_z6EvnZJ6P\"},{\"children\":[{\"text\":\"#\"}],\"type\":\"code-line\",\"id\":\"NqYW1Ctk6bGmRnpkX7ziy\"},{\"children\":[{\"text\":\"# error_page 500 502 503 504 /50x.html;\"}],\"type\":\"code-line\",\"id\":\"EH0f2m_ITfOODw6K0Ubjw\"},{\"children\":[{\"text\":\"# location = /50x.html {\"}],\"type\":\"code-line\",\"id\":\"SQ3LuOqDFNQxVk3Izk9n-\"},{\"children\":[{\"text\":\"# }\"}],\"type\":\"code-line\",\"id\":\"bkVKTWDp7U-sgcR9-pdSt\"},{\"children\":[{\"text\":\"# }\"}],\"type\":\"code-line\",\"id\":\"3DyoR5KCKj4IEuVzrJxOj\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"Vfx_xcwUjdNiaG6YTqY3l\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\",\"id\":\"vzWpe_o9mveYx9mI0h1M-\"}],\"language\":\"plaintext\",\"type\":\"code-block\",\"id\":\"acMFOYdITtJdFjK65UupI\",\"autoWrap\":false},{\"children\":[{\"text\":\"계속해서 다음 명령어를 실행하고 Nginx 서비스를 실행합니다.\\n\"},{\"b\":1,\"text\":\"명령어 1:\"}],\"start\":false,\"type\":\"oli\",\"id\":\"PchyIJ1kY7-EzHtuaww-3\"},{\"children\":[{\"children\":[{\"text\":\"systemctl enable nginx\"}],\"type\":\"code-line\",\"id\":\"rJI9vGQio_l2mSzIKdIg5\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"6nUxYA7iEGUeL9-5eF2KT\",\"autoWrap\":false},{\"children\":[{\"b\":1,\"text\":\"명령어 2:\"}],\"type\":\"p\",\"id\":\"Q-wkeNlUch1V7eqSmZrbA\"},{\"children\":[{\"children\":[{\"text\":\"systemctl start nginx\"}],\"type\":\"code-line\",\"id\":\"7FXwSfGkcu47wRXSa1STz\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"SyZB6Mjm2y9CzCGdN2LZa\",\"autoWrap\":false},{\"children\":[{\"text\":\"COS를 사용하도록 NextCloud 서버 구성\"}],\"nodeId\":\"cos.EB.A5.BC-.EC.82.AC.EC.9A.A9.ED.95.98.EB.8F.84.EB.A1.9D-nextcloud-.EC.84.9C.EB.B2.84-.EA.B5.AC.EC.84.B1\",\"type\":\"h2\",\"id\":\"vlWCEy-_07PUCripWUT7b\"},{\"children\":[{\"text\":\"COS 정보 가져오기\"}],\"nodeId\":\"cos-.EC.A0.95.EB.B3.B4-.EA.B0.80.EC.A0.B8.EC.98.A4.EA.B8.B0\",\"type\":\"h3\",\"id\":\"-1bau45n0-ueW2wrF58_7\"},{\"children\":[{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\",\"id\":\"B8N7q1EboAqIzaY05IGp5\"},{\"text\":\"에 로그인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"0cfwsjaqyfrzF-llWcvUc\"},{\"children\":[{\"text\":\"이전에 생성한 버킷을 찾아 버킷 이름을 클릭합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/65e07394292211efa45a5254008fe934.png\",\"id\":\"YlWfeh_BblvL9n8uA5NPB\",\"naturalSize\":[933,57],\"size\":[933,57]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"vF1h-jEhqBLOeGQhxsxcq\"},{\"children\":[{\"text\":\"왼쪽 사이드바에서 \"},{\"b\":1,\"text\":\"개요\"},{\"text\":\"를 선택하고 \"},{\"b\":1,\"text\":\"기본 정보\"},{\"text\":\"의 \"},{\"b\":1,\"text\":\"버킷 이름\"},{\"text\":\" 및 \"},{\"b\":1,\"text\":\"리전\"},{\"text\":\"에 정보를 기록합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/65d539b2292211ef94525254005f7176.png\",\"id\":\"vU99oPiqk5R7FWaTLUipY\",\"naturalSize\":[326,241],\"size\":[326,241]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"VbqVvqxEcLCd0t4cm1xlr\"},{\"children\":[{\"text\":\"API 키 획득\"}],\"nodeId\":\"api-.ED.82.A4-.ED.9A.8D.EB.93.9D\",\"type\":\"h3\",\"id\":\"3miZyHUlUi9VXXvZGfTlB\"},{\"children\":[{\"text\":\"리스크를 줄이기 위해 서브 계정 키를 사용하고 \"},{\"children\":[{\"text\":\"최소 권한의 원칙 설명\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/32972\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/32972\"},\"type\":\"ref\",\"id\":\"tolBRoZ-bWn9henuaByAo\"},{\"text\":\"을 따르는 것이 좋습니다. 서브 계정 키를 얻는 방법에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"Access Key\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/598/32675\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/598/32675\"},\"type\":\"ref\",\"id\":\"4Ly7oQplXqpotwB2PFBm7\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"mYIzJFMhXpx4XszMMImFj\"},{\"children\":[{\"text\":\"NextCloud 서버 구성 파일 수정\"}],\"nodeId\":\"nextcloud-.EC.84.9C.EB.B2.84-.EA.B5.AC.EC.84.B1-.ED.8C.8C.EC.9D.BC-.EC.88.98.EC.A0.95\",\"type\":\"h3\",\"id\":\"Hy59aT5nVbuVSjPxMBdgP\"},{\"children\":[{\"text\":\"텍스트 편집 툴을 사용하여 \"},{\"code\":1,\"text\":\"config.php\"},{\"text\":\"를 생성하고 다음 내용을 입력한 후 주석에 따라 관련 값을 수정합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"eDIsMOPAwR3MRi755zD2f\"},{\"children\":[{\"children\":[{\"text\":\" array(\"}],\"type\":\"code-line\",\"id\":\"GIDlL6BCvAxFhBPhU5pZO\"},{\"children\":[{\"text\":\" 'class' => '\\\\\\\\OC\\\\\\\\Files\\\\\\\\ObjectStore\\\\\\\\S3',\"}],\"type\":\"code-line\",\"id\":\"bherk3Dhy4kIWNzbUQZca\"},{\"children\":[{\"text\":\" 'arguments' => array(\"}],\"type\":\"code-line\",\"id\":\"5OvDv8jcpOcPtyuYaQdxS\"},{\"children\":[{\"text\":\" 'bucket' => 'nextcloud-1250000000', // 버킷 이름(공간의 이름)\"}],\"type\":\"code-line\",\"id\":\"QIcjQAt50VUyAgfywZzpR\"},{\"children\":[{\"text\":\" 'autocreate' => false,\"}],\"type\":\"code-line\",\"id\":\"ld_1VNKwkv-NbZaFmx8j4\"},{\"children\":[{\"text\":\" 'key' => 'AKIDxxxxxxxx', // 사용자의 SecretId로 변경\"}],\"type\":\"code-line\",\"id\":\"1corW-Xsv7-RGu4QJ0UxG\"},{\"children\":[{\"text\":\" 'secret' => 'xxxxxxxxxxxx', // 사용자의 SecretKey로 변경\"}],\"type\":\"code-line\",\"id\":\"-0GhBAxpMX1Puhw74MmBs\"},{\"children\":[{\"text\":\" 'hostname' => 'cos..myqcloud.com', // 을 소속 리전으로 수정(예: ap-shanghai)\"}],\"type\":\"code-line\",\"id\":\"u_jM0A-LBougVsW8HmKRN\"},{\"children\":[{\"text\":\" 'use_ssl' => true,\"}],\"type\":\"code-line\",\"id\":\"gyyNmoYqRNeI3Y2HROsTc\"},{\"children\":[{\"text\":\" ),\"}],\"type\":\"code-line\",\"id\":\"uPZRxaj712jG70gFjfOii\"},{\"children\":[{\"text\":\" ),\"}],\"type\":\"code-line\",\"id\":\"DA7Ep7NWCp-AHZJNR5ZE-\"},{\"children\":[{\"text\":\");\"}],\"type\":\"code-line\",\"id\":\"JyQDzwCOhdbQ52WA6cdPR\"}],\"language\":\"php\",\"type\":\"code-block\",\"id\":\"TauqY9HXmOEdhx8L2aD64\",\"autoWrap\":false},{\"children\":[{\"text\":\" 다음 이미지 참고:\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/65d52b37292211efa45a5254008fe934.png\",\"id\":\"8v21JOGRTdXFEiOxACOP7\",\"naturalSize\":[978,308],\"size\":[974,306]},{\"text\":\"\\n2. 해당 파일을 저장하고 \"},{\"code\":1,\"text\":\"/var/www/nextcloud/config/\"},{\"text\":\" 디렉터리에 업로드합니다(파일 이름은 \"},{\"code\":1,\"text\":\"config.php\"},{\"text\":\"로 유지). SFTP 또는 SCP 소프트웨어를 통해 파일을 업로드할 수 있고, \"},{\"code\":1,\"text\":\"rz -bye\"},{\"text\":\" 명령어를 통해 업로드할 수도 있습니다.\"}],\"type\":\"p\",\"id\":\"mWDPE8mwI2PIzO1XjAA13\"},{\"children\":[{\"text\":\"다음 명령어를 실행하여 구성 파일의 소유자를 수정합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"Lq6aZqCBe54FJDHGeaJoY\"},{\"children\":[{\"children\":[{\"text\":\"chown nginx:nginx /var/www/nextcloud/config/config.php\"}],\"type\":\"code-line\",\"id\":\"BaPZYKY9dpXQKNDJ5wGy0\"}],\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"2pnFHJPTybl0AumsKU-rw\",\"autoWrap\":false},{\"children\":[{\"text\":\"도메인 이름 구성\"}],\"nodeId\":\".EB.8F.84.EB.A9.94.EC.9D.B8-.EC.9D.B4.EB.A6.84-.EA.B5.AC.EC.84.B1\",\"type\":\"h2\",\"id\":\"7lJhL5e4SXlq0xHLsdxpo\"},{\"children\":[{\"text\":\"NextCloud 서버에 IP 주소가 아닌 도메인 이름을 사용하려면, 도메인 이름을 등록하고 CVM IP 주소로 리졸브하고, 도메인 등록 기관의 안내 문서에 따라 ICP 비안을 받을 수 있습니다.\"}],\"type\":\"p\",\"id\":\"BCSlYFwLxgaB_CvpMvG4w\"},{\"children\":[{\"text\":\"NextCloud 서버는 설치 시 사용한 도메인 이름이나 IP 주소를 기록하므로 설치 전에 도메인 이름을 등록, 리졸브 및 ICP 비안을 받아 도메인 이름을 사용하여 NextCloud 서버의 보안 페이지로 이동하는 것이 좋습니다.\"}],\"type\":\"p\",\"id\":\"GuCc1A4Pw9rVT1asUyhh-\"},{\"children\":[{\"text\":\"NextCloud 서버 설치 완료 후 도메인 또는 IP 주소를 변경해야 할 경우 직접 \"},{\"code\":1,\"text\":\"/var/www/nextcloud/config/config.php\"},{\"text\":\" 구성 파일의 \"},{\"code\":1,\"text\":\"trusted_domains\"},{\"text\":\"를 수정할 수 있습니다. 세부 사항은 \"},{\"children\":[{\"text\":\"NextCloud 공식 홈페이지 문서\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://docs.nextcloud.com/server/19/admin_manual/installation/installation_wizard.html#trusted-domains\",\"props\":{\"type\":\"link\",\"url\":\"https://docs.nextcloud.com/server/19/admin_manual/installation/installation_wizard.html#trusted-domains\"},\"type\":\"ref\",\"id\":\"2J-yenQxt8G7HVJQEmkv9\"},{\"text\":\"를 참조하십시오.\"}],\"type\":\"p\",\"id\":\"iagDje5dZWmoK0FP5FQZ_\"},{\"children\":[{\"text\":\"NextCloud 서버 설치\"}],\"nodeId\":\"nextcloud-.EC.84.9C.EB.B2.84-.EC.84.A4.EC.B9.98\",\"type\":\"h2\",\"id\":\"J1CtXHZxo401PrDY_Gdas\"},{\"children\":[{\"text\":\"브라우저를 사용하여 NextCloud 서버에 액세스한 후 관리자 및 사용자 이름과 비밀번호를 생성하고 기억합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"lKafG6VY_07veNbDIWtaa\"},{\"children\":[{\"b\":1,\"text\":\"스토리지와 데이터베이스\"},{\"text\":\"를 확장하고 다음과 같이 구성합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"ijVVVs0S0Qz0CbBL9R0sd\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"구성 항목\"}],\"type\":\"p\",\"id\":\"Te4hu2rOsELJSC2CGHrVR\"}],\"type\":\"cell\",\"id\":\"cNcSWsg696EuoiBEBoItU\"},{\"children\":[{\"children\":[{\"text\":\"값\"}],\"type\":\"p\",\"id\":\"SFknF6Vl-lCv1eIzY7Cmb\"}],\"type\":\"cell\",\"id\":\"koio8w4bjeT1Ek40ZpRlz\"}],\"type\":\"row\",\"id\":\"0OxFaQHc-BZpAar7WhWZS\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"데이터 폴더\"}],\"type\":\"p\",\"id\":\"QCNxuD6870r3Cc62Mjk-F\"}],\"type\":\"cell\",\"id\":\"ZSnD1bD1MmIUYDd2sICa3\"},{\"children\":[{\"children\":[{\"text\":\"/var/www/nextcloud/data(기본값 유지)\"}],\"type\":\"p\",\"id\":\"viEiyhHRFaMRXxNcdNkou\"}],\"type\":\"cell\",\"id\":\"TN62xqB9SgzTmo7eCeIjv\"}],\"type\":\"row\",\"id\":\"jdUkIlXPSSigZ-bZTl_sL\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"데이터베이스 구성\"}],\"type\":\"p\",\"id\":\"OElMzldy7b0_p35cDNBRR\"}],\"type\":\"cell\",\"id\":\"lwHp2pbqqy-z9IVsnc_ZQ\"},{\"children\":[{\"children\":[{\"text\":\"MySQL/MariaDB\"}],\"type\":\"p\",\"id\":\"IRX0b07Mh8gdsFYHHWtth\"}],\"type\":\"cell\",\"id\":\"yxYOqRPcpRpVqdeXVbOWx\"}],\"type\":\"row\",\"id\":\"ZugxPnJ36z0fg27_YwN7f\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"데이터베이스 사용자\"}],\"type\":\"p\",\"id\":\"UUunFyEH-pcf_GMKSrn6e\"}],\"type\":\"cell\",\"id\":\"CA3BroNdFVU7BoAteifrO\"},{\"children\":[{\"children\":[{\"text\":\"root\"}],\"type\":\"p\",\"id\":\"dNYzbFob3x2DVaZvTKDDc\"}],\"type\":\"cell\",\"id\":\"IGTV8z3uHHuK8WOPSLLMH\"}],\"type\":\"row\",\"id\":\"-i4X6QSWoqgp2y6sNHg0K\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"데이터베이스 비밀번호\"}],\"type\":\"p\",\"id\":\"Lek7HIGpH3aMqvnv9D1OJ\"}],\"type\":\"cell\",\"id\":\"wYLPXQQbrZMCe7FuZoX2d\"},{\"children\":[{\"children\":[{\"text\":\"TencentDB for MySQL 초기화 중에 입력한 root 사용자의 비밀번호\"}],\"type\":\"p\",\"id\":\"tdOzfGRFyH-7QzcPgvU4b\"}],\"type\":\"cell\",\"id\":\"dW8MlfSX24RtHDkcCISO4\"}],\"type\":\"row\",\"id\":\"mp0bYkj6DqvXgxP4gv7h3\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"데이터베이스 이름\"}],\"type\":\"p\",\"id\":\"Tu7jtT7sbJyoOc2WpLM9B\"}],\"type\":\"cell\",\"id\":\"7A46Lfbiq4B5GpT7GXeTw\"},{\"children\":[{\"children\":[{\"text\":\"nextcloud(또는 사용하지 않는 다른 이름)\"}],\"type\":\"p\",\"id\":\"O6CkAgFQxIleAs8N5fE2x\"}],\"type\":\"cell\",\"id\":\"Aw1cDQ8sFv2fHwu8PN5UV\"}],\"type\":\"row\",\"id\":\"HPQnua56aqRNWrlJ7Oy4v\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"데이터베이스 호스트(기본적으로 localhost가 표시됨)\"}],\"type\":\"p\",\"id\":\"eZ078ounnP0ebv4-lObob\"}],\"type\":\"cell\",\"id\":\"cmZV9_d9KPVvibBlrxOoU\"},{\"children\":[{\"children\":[{\"text\":\"TencentDB for MySQL 인스턴스의 사설망 주소\"}],\"type\":\"p\",\"id\":\"iIjp9yf5bgrsHXiQ8orB2\"}],\"type\":\"cell\",\"id\":\"vskBcBhZcU5I3qRBF9-kS\"}],\"type\":\"row\",\"id\":\"sEmbY5R_JsEtIWLJyaMRJ\"}],\"rowHeader\":true,\"type\":\"table\",\"widths\":[],\"id\":\"bmMbOQr8Oh7ulT_oIsTRo\"},{\"children\":[{\"text\":\"3. **설치 완료**를 클릭하고 NextCloud 서버 설치가 완료될 때까지 기다립니다.4. 설치 과정에서 504 Gateway Timeout과 같은 오류 정보가 뜨는 경우 새로고침 후 다시 시도합니다.5. 설치 완료 후 관리자 계정을 사용해 NextCloud 서버에 로그인하면 웹 페이지 버전의 NextCloud를 사용할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"-a6fA7TKxOcNBvfAJjZnU\"},{\"children\":[{\"text\":\"NextCloud 서버 환경 최적화\"}],\"nodeId\":\"nextcloud-.EC.84.9C.EB.B2.84-.ED.99.98.EA.B2.BD-.EC.B5.9C.EC.A0.81.ED.99.94\",\"type\":\"h2\",\"id\":\"o6MVAgYC1g_dfYmLWYQ2j\"},{\"children\":[{\"text\":\"백그라운드 작업\"}],\"nodeId\":\".EB.B0.B1.EA.B7.B8.EB.9D.BC.EC.9A.B4.EB.93.9C-.EC.9E.91.EC.97.85\",\"type\":\"h3\",\"id\":\"LfPR8zFvSfLMG9lhBnNVI\"},{\"children\":[{\"text\":\"NextCloud 서버는 사용자와 상호작용이 필요하지 않을 때 데이터베이스 정리와 같은 백그라운드 작업을 실행하는 경우가 있습니다. PHP 실행 특성상 PHP 기반 프로그램은 내부적으로 하나의 독립된 작업 진행 또는 스레드를 유지할 수 없으므로 백그라운드 작업과 같은 시나리오는 외부에서 호출하여 대응하는 PHP 프로그램으로 실행해야 합니다.\"}],\"type\":\"p\",\"id\":\"tE9f5tWv8GnZx9CY9gtdX\"},{\"children\":[{\"text\":\"NextCloud 서버는 세 가지 백그라운드 작업 호출 방식을 제공합니다. 기본값은 웹 페이지에 로그인한 사용자를 통해 브라우저에서 자동으로 AJAX 요청을 보낸 후 서버의 백그라운드 작업 실행을 호출하는 방식으로, 사용자의 로그인 상태에 크게 의존합니다. 사용자가 로그인하지 않으면 이러한 백그라운드 작업은 실행될 수 없으므로 신뢰성이 가장 낮습니다.\"}],\"type\":\"p\",\"id\":\"C3Z6vJWedVkdio7ENqRqH\"},{\"children\":[{\"text\":\"AJAX 기반 백그라운드 작업의 신뢰성이 떨어지는 문제를 피하고자 Linux의 cron을 사용한 백그라운드 작업 설정을 권장합니다. Linux의 cron은 작업 호출 시간을 정확하게 제어합니다. 설정 가능한 Interval은 분, 시간, 한 달 중 특정 일, 월, 요일을 포함합니다. 예를 들어 5분마다(분 수는 5의 배수) 또는 매시 10분 등으로 설정할 수 있습니다. 일부 운영 체제는 초 단위, 연 단위도 지원하여 매우 효율적입니다. cron에 대한 설명과 설정은 관련 자료를 참조하십시오.\"}],\"type\":\"p\",\"id\":\"QuvzGfwBroJFai5nX-BVN\"},{\"children\":[{\"text\":\"NextCloud 서버의 백그라운드 작업을 위해 cron을 설정하는 방법을 소개합니다.\"}],\"type\":\"p\",\"id\":\"kMCLNnfKX9lx_DpaNSskB\"},{\"children\":[{\"text\":\"SSH 툴을 사용하여 구매한 서버에 로그인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"PIM4d270bhA1vo7Yp1M_e\"},{\"children\":[{\"text\":\"다음 명령어를 실행하여 PHP 모듈을 설치합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"QZn0sX9Ex99MxnHEDdW_I\"},{\"children\":[{\"children\":[{\"text\":\"yum install php-posix\"}],\"type\":\"code-line\",\"id\":\"iKK1KghvKXYnKkxdJqUYa\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"qQ1vVlVAPf-EQsR4OyBUb\",\"autoWrap\":false},{\"children\":[{\"text\":\"다음 명령어를 실행하여 nginx 계정에 사용할 cron 설정을 열거나 생성합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"tBClCsmbrXIqXTFBMhXc4\"},{\"children\":[{\"children\":[{\"text\":\"crontab -u nginx -e\"}],\"type\":\"code-line\",\"id\":\"TUAHvy-JjLx7pz_aP1j9m\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"QCf4DIv-SeCPzpVcOhwzT\",\"autoWrap\":false},{\"children\":[{\"text\":\"다음 편집 인터페이스는 vi/vim입니다. \"},{\"code\":1,\"text\":\"i\"},{\"text\":\" 키를 눌러 편집 모드로 이동한 후 한 행을 삽입합니다. 내용은 다음과 같습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"dGSNzU4eqJtH00tKuwBKl\"},{\"children\":[{\"children\":[{\"text\":\"*/5 * * * * php -f /var/www/nextcloud/cron.php\"}],\"type\":\"code-line\",\"id\":\"45v3OZs_Wl-0lYJn8rMLp\"}],\"indent\":1,\"language\":\"plaintext\",\"type\":\"code-block\",\"id\":\"pO_c0poC0--CiCweOx4vk\",\"autoWrap\":false},{\"children\":[{\"code\":1,\"text\":\"ESC\"},{\"text\":\"를 눌러 편집 모드를 종료하고 \"},{\"code\":1,\"text\":\":wq\"},{\"text\":\"를 입력하여 저장 후 종료합니다. vi/vim의 구체적인 작업 가이드는 관련 문서를 참조하십시오.\\n상기 구성에서는 공식적으로 권장되는 실행 빈도를 5분에 한 번씩 설정합니다. 백그라운드 작업이 5분 안에 실행된 후에는 브라우저를 열어 NextCloud 서버에 로그인할 수 있습니다. 그 후, 오른쪽 상단 모서리에서 사용자 이름 첫 글자를 클릭하여 \"},{\"b\":1,\"text\":\"설정\"},{\"text\":\" 페이지로 이동한 후, 좌측 사이드바에서 \"},{\"b\":1,\"text\":\"기본 설정\"},{\"text\":\"을 선택하면 기본적으로 Cron이 \"},{\"b\":1,\"text\":\"백그라운드 작업\"},{\"text\":\"으로 선택되어 있는 것을 확인할 수 있습니다.\"}],\"indent\":1,\"type\":\"p\",\"id\":\"GhB2nAdlNJpiNY7fP74f4\"},{\"children\":[{\"text\":\"메모리 캐시\"}],\"nodeId\":\".EB.A9.94.EB.AA.A8.EB.A6.AC-.EC.BA.90.EC.8B.9C\",\"type\":\"h3\",\"id\":\"4CTfPYKqCgj7DWriVyK8A\"},{\"children\":[{\"text\":\"PHP는 OPcache를 사용하여 성능을 향상할 수 있습니다. NextCloud 서버도 APCu를 사용한 메모리 캐시 성능 향상을 지원합니다. 아래 관련 작업 과정을 소개합니다.\"}],\"type\":\"p\",\"id\":\"U9_sKNJMVoQzV6htslftt\"},{\"children\":[{\"text\":\"SSH 툴을 사용하여 구매한 서버에 로그인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"RvwV7wgIa0lJOIB_2vrtn\"},{\"children\":[{\"text\":\"다음 명령어를 실행하여 PHP 모듈을 설치합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"K5JuWqDERNjAHi-1B4kPk\"},{\"children\":[{\"children\":[{\"text\":\"yum install php-pecl-apcu\"}],\"type\":\"code-line\",\"id\":\"-rDbiB9Q_auh-Y0motixC\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"f6J4x3hOqD-I3IwE61iSK\",\"autoWrap\":false},{\"children\":[{\"text\":\"계속해서 다음 명령어를 실행하여 Nginx와 PHP-FPM을 재시작합니다.\\n\"},{\"b\":1,\"text\":\"명령어 1:\"}],\"start\":false,\"type\":\"oli\",\"id\":\"_m4eDSkXyg8k2Vv5sK4DO\"},{\"children\":[{\"children\":[{\"text\":\"systemctl restart nginx\"}],\"type\":\"code-line\",\"id\":\"sjNFJWhIcUYvh6DXy8is0\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"vYQelUnEjLbA2KLrhM1c_\",\"autoWrap\":false},{\"children\":[{\"b\":1,\"text\":\"명령어 2:\"}],\"indent\":1,\"type\":\"p\",\"id\":\"VagDPDWx3rqe7qnk9N2Li\"},{\"children\":[{\"children\":[{\"text\":\"systemctl restart php-fpm\"}],\"type\":\"code-line\",\"id\":\"b67kb8AdMBFGTk5aqS82a\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"hxPjuNBw0CJVfirVVjBHK\",\"autoWrap\":false},{\"children\":[{\"code\":1,\"text\":\"vim /var/www/nextcloud/config/config.php\"},{\"text\":\"를 실행하여 NextCloud 서버의 구성 파일을 열고 \"},{\"code\":1,\"text\":\"$CONFIG = array (\"},{\"text\":\"에 한 행 \"},{\"code\":1,\"text\":\"'memcache.local' => '\\\\OC\\\\Memcache\\\\APCu',\"},{\"text\":\"을 추가합니다. 파일을 저장하고 종료합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/65dde010292211ef9aab5254004556a0.png\",\"id\":\"5SrNniwgNWVaKnM7z0FwD\",\"naturalSize\":[712,800],\"size\":[712,800]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"6OaWJHUU38aek9I1Vxo_z\"},{\"children\":[{\"text\":\"cron 설정으로 백그라운드 작업을 최적화한 후 PHP의 apc 설정 변경이 필요합니다. \"},{\"code\":1,\"text\":\"vim /etc/php.d/40-apcu.ini\"},{\"text\":\"를 실행하여 PHP APCu의 구성 파일을 열고 \"},{\"code\":1,\"text\":\";apc.enable_cli=0\"},{\"text\":\"을 \"},{\"code\":1,\"text\":\"apc.enable_cli=1\"},{\"text\":\"로 수정(주의: 맨 앞의 세미콜론을 모두 삭제)한 다음 저장하고 종료합니다. \"},{\"code\":1,\"text\":\"/etc/php.d/40-apcu.ini\"},{\"text\":\" 경로가 존재하지 않을 경우 직접 \"},{\"code\":1,\"text\":\"/etc/php.d/\"},{\"text\":\" 디렉터리에서 apc 또는 apcu 문구가 들어간 \"},{\"code\":1,\"text\":\".ini\"},{\"text\":\" 구성 파일을 찾아 편집합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/65e0b213292211ef9aab5254004556a0.png\",\"id\":\"6PGr8V6nRtMAzfHtv57tt\",\"naturalSize\":[611,220],\"size\":[611,220]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"luhEG5Z7ApzY0DxRVfDMV\"},{\"children\":[{\"text\":\"클라이언트 액세스 설정\"}],\"nodeId\":\".ED.81.B4.EB.9D.BC.EC.9D.B4.EC.96.B8.ED.8A.B8-.EC.95.A1.EC.84.B8.EC.8A.A4-.EC.84.A4.EC.A0.95\",\"type\":\"h2\",\"id\":\"EfcfPLk2bephZ1zbbVC6K\"},{\"children\":[{\"text\":\"NextCloud 공식 홈페이지가 제공하는 데스크톱 동기화 클라이언트와 모바일 클라이언트는 NextCloud 공식 홈페이지 또는 애플리케이션 스토어에서 다운로드할 수 있습니다. NextCloud 설정 시 NextCloud의 서버 주소(도메인 또는 IP)를 입력해야 합니다. 그런 다음 사용자 이름과 비밀번호를 입력하고 로그인하면 바로 클라이언트를 사용할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"FUv4QipR8_h6dSVBn5Ook\"}]"}},"39144":{"categoryId":436,"weight":9,"type":"page","extension":"","pid":32969,"id":39144,"lang":"ko","title":"COS Ranger 권한 시스템 솔루션","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-03-03 22:15:48","recentReleaseTime":"2021-03-03 22:15:48","content":{"title":"COS Ranger 권한 시스템 솔루션","body":"

배경

Hadoop Ranger 권한 시스템은 빅 데이터 시나리오에서의 권한 솔루션입니다. 사용자는 Hadoop을 사용해 데이터를 Cloud Object Storage(COS)에 보관합니다. COS는 Tencent Cloud Access Management(CAM) 권한 시스템을 사용하며, 사용자 정보, 권한 정책 등의 부분에서 로컬 Hadoop Ranger 시스템과 다릅니다. Tencent Cloud는 클라이언트의 원활한 사용을 위해 COS의 Ranger 액세스 솔루션을 제공합니다.

강점

세밀하게 분할된 권한 제어, Hadoop 권한 로직 호환으로 사용자가 빅 데이터 컴포넌트와 클라우드 호스팅 스토리지의 권한을 통합 관리합니다.
플러그 인 측에서 core-site 키를 설정할 필요가 없으며, 키는 COS Ranger Service에 통합 설치되어 있어 플레인 텍스트가 노출되지 않습니다.

솔루션 아키텍처


\"\"


Hadoop 권한 시스템에서 인증은 Kerberos에서, 권한 인증은 Ranger에서 담당합니다. 여기에 다음과 같은 컴포넌트를 제공해 COS의 Ranger 권한 솔루션을 지원합니다.
1. COS Ranger Plugin: Ranger 서버의 서비스 정의 플러그 인을 제공합니다. Ranger 측에서 필요한 매개변수(COS의 bucket 및 region)의 권한 유형 및 정의를 포함하여 COS 서비스 설명을 제공합니다. 해당 플러그 인이 배포되면, 사용자는 Ranger의 제어판에서 권한 정책을 설정할 수 있습니다.
2. COS Ranger Service: 이 서비스는 Ranger의 클라이언트를 통합하여 주기적으로 Ranger 서버의 권한 정책을 동기화하고, 클라이언트의 인증 요청이 수신되면 로컬에서 권한 인증을 진행합니다. 또한, Hadoop의 DelegationToken과 관련된 생성/리스 갱신 API를 제공합니다. 모든 API는 Hadoop IPC를 통해 정의됩니다.
3. COS Ranger Client: COSN 플러그 인을 동적으로 로딩하여 권한 인증 요청을 COS Ranger Service에 전달합니다.

설치 환경

Hadoop 환경.
ZooKeeper, Ranger, Kerberos 서비스(인증 요구 사항이 있는 경우).
설명:
위 서비스는 기술적으로 안정된 오픈 소스 컴포넌트이므로 클라이언트가 직접 설치할 수 있습니다.

설치 컴포넌트

CHDFS Ranger Plugin, COS Ranger Service, COS Ranger Client 및 COSN의 순서로 컴포넌트를 설치합니다.
COS Ranger Plugin 배포
COS-Ranger-Plugin이 Ranger Admin 콘솔의 서비스 종류를 확장함에 따라, 사용자는 Ranger 콘솔에서 COS와 관련된 작업 권한을 설정할 수 있습니다.

코드 주소

Github의 ranger-plugin 목록으로 이동 후 획득할 수 있습니다.

버전

V1.0 이상 버전.

배포 순서

1. Ranger의 서비스 정의 디렉터리 하위에 새로운 COS 디렉터리를 만듭니다(디렉터리 권한은 최소한 x와 r 권한이 필요합니다).\na. Tencent Cloud의 EMR 환경, 경로는 ranger/ews/webapp/WEB-INF/classes/ranger-plugins입니다.\nb. 자체구축 hadoop 환경은 ranger 디렉터리 아래에서 hdfs 등 이미 ranger 서비스에 액세스 된 컴포넌트를 찾아 디렉터리 위치를 찾을 수 있습니다.\n
\"\"


2. cos-chdfs-ranger-plugin-xxx.jar를 COS 디렉터리에 저장합니다. 최소한 jar 패키지에 대한 r 권한이 있어야 합니다. 동시에 cos-ranger.json 파일을 넣어주어야 하며, Github에서 얻을 수 있습니다.
3. Ranger 서비스를 재시작합니다.
4. Ranger에 COS Service를 등록합니다. 다음과 같은 명령어를 참고할 수 있습니다
##서비스를 생성하려면 Ranger 관리자 계정 암호 및 Ranger 서비스 주소를 입력해야 합니다.
##Tencent Cloud EMR 클러스터의 경우, 관리자는 root이고, 암호는 emr 클러스터를 구축할 때 설정한 root 암호이며, ranger 서비스의 IP는 EMR의 master 노드 IP로 바뀝니다.
adminUser=root
##EMR 클러스터 구축 시 설정한 비밀번호는 ranger 서비스 web 페이지 로그인 비밀번호이기도 합니다.
adminPasswd=xxxxxx
##ranger 서비스에 여러 master 노드가 있는 경우 하나의 master를 선택할 수 있습니다.
rangerServerAddr=10.0.0.1:6080
##명령 라인에서 -d는 2단계에서 json 파일을 지정합니다.
curl -v -u${adminUser}:${adminPasswd} -X POST -H "Accept:application/json" -H "Content-Type:application/json" -d @./cos-ranger.json http://${rangerServerAddr}/service/plugins/definitions
##방금 정의된 서비스를 삭제하려면 관련 서비스를 생성할 때 반환했던 서비스 ID를 입력합니다.
serviceId=102
curl -v -u${adminUser}:${adminPasswd} -X DELETE -H "Accept:application/json" -H "Content-Type:application/json" http://${rangerServerAddr}/service/plugins/definitions/${serviceId}

5. 서비스가 생성되면 Ranger 콘솔에서 COS 서비스를 다음과 같이 볼 수 있습니다.\n
\"\"


6. COS 서비스에서 + 를 클릭해 새로운 서비스의 인스턴스를 정의합니다. 예를 들어 cos 혹은 cos_test서비스의 설정은 다음과 같습니다.\n
\"\"

\n여기서 policy.grantrevoke.auth.users는 COS Ranger Service를 시작하는 데 사용되는 사용자 이름(권한 가져오기 정책을 허용하는 사용자)으로 설정해야 합니다. 일반적으로 hadoop 설정이 권장되며, 이후 작업에서 COS Ranger Service는 이 사용자 이름으로 실행할 수 있습니다.
7. 생성된 COS 서비스 인스턴스를 클릭합니다.\n
\"\"

\n다음 그림과 같이 policy를 추가합니다.\n
\"\"


8. 리디렉션 페이지에서 다음 매개변수를 설정합니다.
bucket: examplebucket-1250000000과 같은 버킷 이름은 COS 콘솔에 로그인하여 조회할 수 있습니다.
path: COS객체 경로입니다. COS의 객체 경로가 /로 시작되지 않도록 주의하십시오.
include: 설정된 권한이 path 자체에 적용되었는지, 혹은 path 이외의 다른 경로에 적용되었는지 나타냅니다.
recursive: 권한이 path 외에 path 경로의 하위 구성원(귀속되는 구성원)에도 적용된다는 것을 나타냅니다. 보통 path 설정을 디렉터리로 사용하는 경우입니다.
user/group: 사용자 이름과 사용자 그룹입니다. 둘 중 하나만 충족하면 되는 관계로, 사용자 이름 혹은 사용자 그룹 중 하나를 만족하면 상응하는 작업 권한을 보유할 수 있습니다.
Permissions:
Read: 읽기 작업입니다. 객체 다운로드, 객체 메타데이터 조회 등 COS의 GET, HEAD와 같은 작업에 대응됩니다
Write: 쓰기 작업입니다. 객체 스토리지 안에 있는 PUT와 같은 수정 작업, 예를 들어 객체 업로드와 같은 작업에 대응합니다.
Delete: 삭제 작업입니다. COS의 Object 삭제와 대응됩니다. Hadoop의 Rename 작업의 경우, 기존 경로에 대한 삭제 작업과 신규 경로에 대한 입력 작업 권한이 필요합니다.
List: 탐색 권한입니다. COS의 List Object에 대응됩니다.\n
\"\"


COS Ranger Service 배포
COS Ranger Service는 전체 권한 시스템의 핵심으로, ranger 클라이언트와 통합되어 ranger client의 인증 요청, token 생성 및 리스 갱신 요청, 임시 키 생성 요청을 수신합니다. 민감한 정보(Tencent Cloud 키 정보)가 저장되는 곳이기도 합니다. 보통 점프 서버에 배포되며 클러스터 관리자만 작업을 수행하고 구성을 쿼리할 수 있습니다.
COS Ranger Service는 단일 프라이머리, 다중 세컨더리 HA 배포를 지원하며, DelegationToken은 HDFS에 저장할 수 있습니다. ZK 잠금 장치로 Leader의 신분을 결정합니다. Leader의 신분을 획득한 프라이머리 노드는 COS Ranger Client가 주소 라우팅을 수행할 수 있도록 ZK에 주소를 기록합니다.

코드 주소

Github의 cos-ranger-server 디렉터리로 이동하여 얻을 수 있습니다.

버전

V5.1.2 이상 버전

배포 순서

1. COS Ranger Service 서비스 코드를 클러스터의 기기 몇 대에 복사하고, 생성 환경은 최소 기기 두 대(메인 기기와 예비용 기기)를 권장합니다. 중요한 정보를 다루기 때문에 점프 서버 혹은 권한이 엄격히 통제되는 기기를 권장합니다.
2. cos-ranger.xml 파일에서 구성을 수정합니다. 다음은 필요한 수정 사항입니다. 구성 항목에 대한 자세한 내용은 파일의 설명을 참고하십시오(구성 파일은 Github의 cos-ranger-service/conf 디렉터리에서 얻을 수 있습니다).
qcloud.object.storage.rpc.address
qcloud.object.storage.status.port
qcloud.object.storage.enable.cos.ranger
qcloud.object.storage.zk.address (zk 주소, cos ranger service 실행 후 zk에 등록)
qcloud.object.storage.cos.secret.id
qcloud.object.storage.cos.secret.key
3. ranger-cos-security.xml 파일에서 구성을 수정합니다. 다음은 필요한 수정 사항입니다. 구성 항목에 대한 자세한 내용은 파일의 설명을 참고하십시오(구성 파일은 Github의 cos-ranger-service/conf 디렉터리에서 얻을 수 있습니다).
ranger.plugin.cos.policy.cache.dir
ranger.plugin.cos.policy.rest.url
ranger.plugin.cos.service.name
4. start_rpc_server.sh에서 hadoop_conf_path, java.library.path의 설정을 수정합니다. 이 두 가지 설정은 각각 hadoop 설정 파일이 들어 있는 디렉터리(core-site.xml, hdfs-site.xml 등) 및 hadoop native lib 경로를 가리킵니다.
5. 다음 명령어를 실행하여 서비스를 시작합니다.
chmod +x start_rpc_server.sh
nohup ./start_rpc_server.sh &> nohup.txt &
6. 실행에 실패하면 log의 error 로그에 잘못된 정보가 있는지 조회합니다.
7. COS Ranger Service는 HTTP 포트 상태(포트 이름은 qcloud.object.storage.status.port, 기본값은 9998)표시를 지원합니다. 사용자는 다음의 명령을 실행하여 leader의 포함 여부 및 인증 통계와 같은 상태 정보를 얻을 수 있습니다.
# 10.xx.xx.xxx를 ranger service와 함께 배포된 장치의 IP 주소로 바꿉니다.
# 명령의 9998을 구성 파일의 qcloud.object.storage.status.port 값으로 바꿉니다.
curl -v http://10.xx.xx.xxx:9998/status
하나의 cos ranger service 노드만 배포된 경우 위의 인터페이스 응답에서 현재 노드가 leader로 표시됩니다.
여러 cos ranger service 노드가 배치된 경우 위의 인터페이스 응답에서 다른 노드가 leader가 되는 것을 볼 수 있으며 모든 노드를 다시 시작한 후 가장 먼저 다시 시작된 노드가 leader로 표시됩니다.
COS Ranger Client 배포
COS Ranger Client는 hadoop cosn 플러그인에 의해 동적으로 로딩됩니다. 임시 키 획득, token 획득, 인증 작업과 같은 모든 COS Ranger Service 액세스 요청을 캡슐화하는 프록시입니다.

소스 코드 다운로드

Github의 cos-ranger-client 및 cosn-ranger-interface 디렉터리로 이동하여 소스 코드를 얻을 수 있습니다.

버전

cos-ranger-client는 V5.0 이상 버전이 필요합니다.cosn-ranger-interface는 v1.0.4 이상 버전이 필요합니다.

배포 방식

1. cos-ranger-client jar 패키지와 cosn-ranger-interface jar 패키지를 COSN과 동일한 디렉터리(일반적으로 /usr/local/service/hadoop/share/hadoop/common/lib/ 디렉터리)에 복사하십시오. 복사를 선택하고 hadoop 자체의 주요 버전과 일치하는 jar 패키지를 선택하고 마지막으로 jar 패키지에 읽기 권한이 있는지 확인합니다.
2. core-site.xml에 다음과 같은 설정 항목을 추가하십시오.
```
<configuration>
<!--*****필수 설정********-->
<!-- 이전 단계에서 배포된 cos ranger server 주소 -->
<property>
<name>qcloud.object.storage.ranger.service.address</name>
<value>10.0.0.8:9999,10.0.0.10:9999</value>
</property>

<!--***선택적 구성****-->
<!-- cos ranger service 측에서 사용되는 kerberos 자격 증명을 설정하고, cos ranger service 측에서 구성한 것과 동일해야 합니다. 인증 요구가 없으면 이 구성을 건너뛸 수 있습니다. -->
<property>
<name>qcloud.object.storage.kerberos.principal</name>
<value>hadoop/_HOST@EMR-XXXX</value>
</property>

<!--***선택적 구성****-->
<!-- zk에 기록된 ranger server의 IP 주소 경로, 여기서는 기본값을 사용합니다. 값은 반드시 COS Ranger Service에 구성된 값과 동일해야 합니다. -->
<property>
<name>qcloud.object.storage.zk.leader.ip.path</name>
<value>/ranger_qcloud_object_storage_leader_ip</value>
</property>
<!-- zk에 기록된 cos ranger service follower의 IP 주소 경로입니다. 여기서 기본값이 사용됩니다. 값은 반드시 COS Ranger Service에 구성된 값과 동일해야 합니다. 프라이머리/세컨더리 노드가 동시에 서비스 제공 -->
<property>
<name>qcloud.object.storage.zk.follower.ip.path</name>
<value>/ranger_qcloud_object_storage_follower_ip</value>
</property>
</configuration>
```

COSN 배포

버전

V8.0.1 이상 버전

배포 방식

COSN 플러그 인 배포 방법은 Hadoop 툴 문서를 참고하십시오. 단, 다음 몇 가지를 주의하십시오.
1. ranger를 사용한 후, fs.cosn.userinfo.secretId와 fs.cosn.userinfo.secretKey 키 정보는 설정이 필요하지 않습니다. COSN 플러그 인은 향후 COSRangerService를 통해 임시 키를 부여받게 됩니다.
2. fs.cosn.credentials.provider는 org.apache.hadoop.fs.auth.RangerCredentialsProvider 설정이 되어야만 Ranger를 통해 다음과 같은 인증 진행이 가능합니다.
```
<property>
<name>fs.cosn.credentials.provider</name>
<value>org.apache.hadoop.fs.auth.RangerCredentialsProvider</value>
</property>
```


인증

1. hadoop cmd를 사용해 COSN 관련 작업을 액세스합니다. 현재 사용자가 하고 있는 작업이 루트 계정의 권한 설정 예측에 부합하는지 확인합니다.
#bucket, 경로 및 기타 정보를 루트 계정의 정보로 교체합니다.
hadoop fs -ls cosn://examplebucket-1250000000/doc
hadoop fs -put ./xxx.txt cosn://examplebucket-1250000000/doc/
hadoop fs -get cosn://examplebucket-1250000000/doc/exampleobject.txt
hadoop fs -rm cosn://examplebucket-1250000000/doc/exampleobject.txt
2. MR Job을 사용하여 인증합니다. 인증 전 Yarn, Hive 등 관련 서비스를 재시작해야 합니다.

FAQ

kerberos 설치가 꼭 필요한가요?

Kerberos는 인증 요구 사항을 충족합니다. 클러스터와 사용자를 신뢰할 수 있고 인증 목적이 권한이 없는 사용자로 인한 오작동을 방지하는 것뿐이라면 Kerberos 설치를 건너뛰고 인증을 위해 ranger만 사용할 수 있습니다. 사실 Kerberos는 일부 성능을 저하시킬 수도 있습니다. 따라서 보안과 성능에 대한 요구 사항의 균형을 맞출 수 있습니다. 인증이 필요한 경우 Kerberos를 활성화한 다음 COS Ranger Service 및 COS Ranger Client를 구성할 수 있습니다.

Ranger를 실행했는데 Policy가 설정되어 있지 않거나 Policy가 매칭되지 않았을 경우, 어떻게 작업하나요?

Policy가 매칭되지 않았을 경우 기본적으로 해당 작업이 거부됩니다.

COS Ranger Service 측의 키 설정은 서브 계정도 가능한가요?

서브 계정도 가능합니다. 그러나 bucket을 실행할 수 있는 권한이 있어야만, COSN 플러그 인에 들어가 관련 작업을 할 수 있는 임시 키 생성이 가능합니다. 일반적으로 여기서 설정하는 키는 해당 bucket의 모든 권한을 갖기를 권장합니다.

임시 키는 어떻게 업데이트 되나요? 그리고 COS를 방문할 때마다 COS Ranger Service에서 임시 키를 획득해야 하나요?

임시 키는 COSN 플러그 인 cache에 있으며, 주기적으로 비동기화 업데이트됩니다.

ranger 페이지에서 Policy를 변경했는데 적용되지 않으면 어떻게 해야 하나요?

ranger-cos-security.xml 파일에서 ranger.plugin.cos.policy.pollIntervalMs 값(밀리초)을 줄이고 COS Ranger Service를 다시 시작합니다. Policy 관련 테스트가 끝난 후에는 다시 원래 값으로 변경하는 것이 좋습니다(시간 간격이 너무 짧으면 라운드 로빈 빈도가 높아 CPU 사용률이 높아짐).
","recentReleaseTime":"2024-06-24 16:53:18","slate":"[{\"children\":[{\"text\":\"배경\"}],\"nodeId\":\".EB.B0.B0.EA.B2.BD\",\"type\":\"h2\",\"id\":\"6e-xQrAh3aoA3FRPBhXQR\"},{\"children\":[{\"text\":\"Hadoop Ranger 권한 시스템은 빅 데이터 시나리오에서의 권한 솔루션입니다. 사용자는 Hadoop을 사용해 데이터를 Cloud Object Storage(COS)에 보관합니다. COS는 Tencent Cloud Access Management(CAM) 권한 시스템을 사용하며, 사용자 정보, 권한 정책 등의 부분에서 로컬 Hadoop Ranger 시스템과 다릅니다. Tencent Cloud는 클라이언트의 원활한 사용을 위해 COS의 Ranger 액세스 솔루션을 제공합니다.\"}],\"type\":\"p\",\"id\":\"hyuwer5-W6zJw0XNWPbxe\"},{\"children\":[{\"text\":\"강점\"}],\"nodeId\":\".EA.B0.95.EC.A0.90\",\"type\":\"h2\",\"id\":\"DP2LWMYfFoz2yuqeAW91j\"},{\"children\":[{\"text\":\"세밀하게 분할된 권한 제어, Hadoop 권한 로직 호환으로 사용자가 빅 데이터 컴포넌트와 클라우드 호스팅 스토리지의 권한을 통합 관리합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"Ea28NhE41Y7QCuChnuDOC\"},{\"children\":[{\"text\":\"플러그 인 측에서 core-site 키를 설정할 필요가 없으며, 키는 COS Ranger Service에 통합 설치되어 있어 플레인 텍스트가 노출되지 않습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"TTntaXD7yTGA0mHYpkXbM\"},{\"children\":[{\"text\":\"솔루션 아키텍처\"}],\"nodeId\":\".EC.86.94.EB.A3.A8.EC.85.98-.EC.95.84.ED.82.A4.ED.85.8D.EC.B2.98\",\"type\":\"h2\",\"id\":\"noeEmunQfvKt06Ul2U_JD\"},{\"type\":\"p\",\"children\":[{\"text\":\"\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/cecd3996292111ef94525254005f7176.png\",\"id\":\"UnDys4geShe1bGJlqFgCa\",\"naturalSize\":[3118,2386],\"size\":[663,507]},{\"text\":\"\"}],\"id\":\"mlD5-j4GpCzfdYRm9AWEN\"},{\"children\":[{\"text\":\"Hadoop 권한 시스템에서 인증은 Kerberos에서, 권한 인증은 Ranger에서 담당합니다. 여기에 다음과 같은 컴포넌트를 제공해 COS의 Ranger 권한 솔루션을 지원합니다.\"}],\"type\":\"p\",\"id\":\"9lHU9YAgU8clCjA3suaEB\"},{\"children\":[{\"text\":\"COS Ranger Plugin: Ranger 서버의 서비스 정의 플러그 인을 제공합니다. Ranger 측에서 필요한 매개변수(COS의 bucket 및 region)의 권한 유형 및 정의를 포함하여 COS 서비스 설명을 제공합니다. 해당 플러그 인이 배포되면, 사용자는 Ranger의 제어판에서 권한 정책을 설정할 수 있습니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"4kHrSzxZqkB5j44ZKyfF5\"},{\"children\":[{\"text\":\"COS Ranger Service: 이 서비스는 Ranger의 클라이언트를 통합하여 주기적으로 Ranger 서버의 권한 정책을 동기화하고, 클라이언트의 인증 요청이 수신되면 로컬에서 권한 인증을 진행합니다. 또한, Hadoop의 DelegationToken과 관련된 생성/리스 갱신 API를 제공합니다. 모든 API는 Hadoop IPC를 통해 정의됩니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"UyXKqhU0Fuk8rCaYLbIwb\"},{\"children\":[{\"text\":\"COS Ranger Client: COSN 플러그 인을 동적으로 로딩하여 권한 인증 요청을 COS Ranger Service에 전달합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"HDkA6iCIhogrMgyF39TqW\"},{\"children\":[{\"text\":\"설치 환경\"}],\"nodeId\":\".EC.84.A4.EC.B9.98-.ED.99.98.EA.B2.BD\",\"type\":\"h2\",\"id\":\"qMDXM1XjdLT2gylwvcthg\"},{\"children\":[{\"text\":\"Hadoop 환경.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"GUKiekqbhaBP_-wXujdNk\"},{\"children\":[{\"text\":\"ZooKeeper, Ranger, Kerberos 서비스(인증 요구 사항이 있는 경우).\"}],\"start\":false,\"type\":\"uli\",\"id\":\"J1smroau9wGTa86QwuQ3y\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"tegbO76H558tiq4gswSVM\"},{\"children\":[{\"text\":\"위 서비스는 기술적으로 안정된 오픈 소스 컴포넌트이므로 클라이언트가 직접 설치할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"eX6mClX6_KA4XM3tsoSxT\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\",\"id\":\"ZoPYL8sihlhKNNp_HQGKp\"},{\"children\":[{\"text\":\"설치 컴포넌트\"}],\"nodeId\":\".EC.84.A4.EC.B9.98-.EC.BB.B4.ED.8F.AC.EB.84.8C.ED.8A.B8\",\"type\":\"h2\",\"id\":\"J9UkO5NZbg6wDKcEwQlM7\"},{\"children\":[{\"text\":\"CHDFS Ranger Plugin, COS Ranger Service, COS Ranger Client 및 COSN의 순서로 컴포넌트를 설치합니다.\"}],\"type\":\"p\",\"id\":\"l31m3CZjrScKx2-SrxDwX\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"COS-Ranger-Plugin이 Ranger Admin 콘솔의 서비스 종류를 확장함에 따라, 사용자는 Ranger 콘솔에서 COS와 관련된 작업 권한을 설정할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"2N92ZUdo_trGvKKOTeU8s\"},{\"children\":[{\"text\":\"코드 주소\"}],\"nodeId\":\".EC.BD.94.EB.93.9C-.EC.A3.BC.EC.86.8C\",\"type\":\"h4\",\"id\":\"cFq6N0ugFrUIsCV9gj2Mw\"},{\"children\":[{\"children\":[{\"text\":\"Github\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-ranger-service\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-ranger-service\"},\"type\":\"ref\",\"id\":\"Sbpw1HvQMGbQTh_1xE-q1\"},{\"text\":\"의 ranger-plugin 목록으로 이동 후 획득할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"n99czt7kp4j9qm1Ndp9nQ\"},{\"children\":[{\"text\":\"버전\"}],\"nodeId\":\".EB.B2.84.EC.A0.84\",\"type\":\"h4\",\"id\":\"aw_0cqe--xvbKIWpyuZSM\"},{\"children\":[{\"text\":\"V1.0 이상 버전.\"}],\"type\":\"p\",\"id\":\"cqh13ZFu1dEUWstxPvBGh\"},{\"children\":[{\"text\":\"배포 순서\"}],\"nodeId\":\".EB.B0.B0.ED.8F.AC-.EC.88.9C.EC.84.9C\",\"type\":\"h4\",\"id\":\"2nOd36iTB05cBBisMrqRN\"},{\"children\":[{\"text\":\"Ranger의 서비스 정의 디렉터리 하위에 새로운 COS 디렉터리를 만듭니다(디렉터리 권한은 최소한 x와 r 권한이 필요합니다).\\na. Tencent Cloud의 EMR 환경, 경로는 ranger/ews/webapp/WEB-INF/classes/ranger-plugins입니다.\\nb. 자체구축 hadoop 환경은 ranger 디렉터리 아래에서 hdfs 등 이미 ranger 서비스에 액세스 된 컴포넌트를 찾아 디렉터리 위치를 찾을 수 있습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/cec87eda292111efa45a5254008fe934.png\",\"id\":\"HLqQ98zhUga-z-1V9X60m\",\"naturalSize\":[1516,796],\"size\":[607,318]},{\"text\":\"\"}],\"start\":true,\"type\":\"oli\",\"id\":\"QkcDcxikZp4sRoTzYAVlp\"},{\"children\":[{\"text\":\"cos-chdfs-ranger-plugin-xxx.jar를 COS 디렉터리에 저장합니다. 최소한 jar 패키지에 대한 r 권한이 있어야 합니다. 동시에 cos-ranger.json 파일을 넣어주어야 하며, \"},{\"children\":[{\"text\":\"Github\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-ranger-service/tree/main/ranger-plugin\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-ranger-service/tree/main/ranger-plugin\"},\"type\":\"ref\",\"id\":\"PKYQscq6gitzzpIQ_SWuK\"},{\"text\":\"에서 얻을 수 있습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"6W_cAbXymwhFv2Mx_Zb6c\"},{\"children\":[{\"text\":\"Ranger 서비스를 재시작합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"652bZcwjQuQc3SG1STG1S\"},{\"children\":[{\"text\":\"Ranger에 COS Service를 등록합니다. 다음과 같은 명령어를 참고할 수 있습니다\"}],\"start\":false,\"type\":\"oli\",\"id\":\"B32sF2ywvV8bSwadbxafv\"},{\"children\":[{\"children\":[{\"text\":\"##서비스를 생성하려면 Ranger 관리자 계정 암호 및 Ranger 서비스 주소를 입력해야 합니다.\"}],\"type\":\"code-line\",\"id\":\"UUD9prn2Z1fQKsHbDRu9P\"},{\"children\":[{\"text\":\"##Tencent Cloud EMR 클러스터의 경우, 관리자는 root이고, 암호는 emr 클러스터를 구축할 때 설정한 root 암호이며, ranger 서비스의 IP는 EMR의 master 노드 IP로 바뀝니다.\"}],\"type\":\"code-line\",\"id\":\"wYlCpN1jiFi7pyv4pz6qV\"},{\"children\":[{\"text\":\"adminUser=root\"}],\"type\":\"code-line\",\"id\":\"D3UWka4yhI0_lzNwUhSyt\"},{\"children\":[{\"text\":\"##EMR 클러스터 구축 시 설정한 비밀번호는 ranger 서비스 web 페이지 로그인 비밀번호이기도 합니다.\"}],\"type\":\"code-line\",\"id\":\"S-N83HPd1Hsrc-M69eTi_\"},{\"children\":[{\"text\":\"adminPasswd=xxxxxx\"}],\"type\":\"code-line\",\"id\":\"a1R361e72tzGuAqCzKarY\"},{\"children\":[{\"text\":\"##ranger 서비스에 여러 master 노드가 있는 경우 하나의 master를 선택할 수 있습니다.\"}],\"type\":\"code-line\",\"id\":\"8Cit2gbGiW_Qfl0lBhsGq\"},{\"children\":[{\"text\":\"rangerServerAddr=10.0.0.1:6080\"}],\"type\":\"code-line\",\"id\":\"WIjtzBEXmTt6RRAdJ-NlC\"},{\"children\":[{\"text\":\"##명령 라인에서 -d는 2단계에서 json 파일을 지정합니다.\"}],\"type\":\"code-line\",\"id\":\"c9lF3iSq8TNbN_gPtNLg0\"},{\"children\":[{\"text\":\"curl -v -u${adminUser}:${adminPasswd} -X POST -H \\\"Accept:application/json\\\" -H \\\"Content-Type:application/json\\\" -d @./cos-ranger.json http://${rangerServerAddr}/service/plugins/definitions\"}],\"type\":\"code-line\",\"id\":\"tHKeuHdd2M1bQ2xVvpsbD\"},{\"children\":[{\"text\":\"##방금 정의된 서비스를 삭제하려면 관련 서비스를 생성할 때 반환했던 서비스 ID를 입력합니다.\"}],\"type\":\"code-line\",\"id\":\"hdPl0Mv23qU7eO8hQZoXW\"},{\"children\":[{\"text\":\"serviceId=102\"}],\"type\":\"code-line\",\"id\":\"8if15ivwbe3i4yzJ3Jema\"},{\"children\":[{\"text\":\"curl -v -u${adminUser}:${adminPasswd} -X DELETE -H \\\"Accept:application/json\\\" -H \\\"Content-Type:application/json\\\" http://${rangerServerAddr}/service/plugins/definitions/${serviceId}\"}],\"type\":\"code-line\",\"id\":\"mK6Kgh7ERLrFgsPCi-6KI\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"MNYxyDWiSV6fil3FjlaDf\"}],\"id\":\"9\",\"language\":\"bash\",\"name\":\"plaintext\",\"type\":\"code-block\",\"autoWrap\":false},{\"children\":[{\"text\":\"서비스가 생성되면 Ranger 콘솔에서 COS 서비스를 다음과 같이 볼 수 있습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/cecc11a9292111efac39525400560de4.png\",\"id\":\"Yg6QNHVkQGGnGGYsV0Fy_\",\"naturalSize\":[2806,1214],\"size\":[649,280]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"sr5EIgzmWJ63EABBHqx6S\"},{\"children\":[{\"text\":\"COS 서비스에서\"},{\"text\":\" + \",\"b\":1},{\"text\":\"를 클릭해 새로운 서비스의 인스턴스를 정의합니다. 예를 들어 \"},{\"code\":1,\"text\":\"cos\"},{\"text\":\" 혹은 \"},{\"code\":1,\"text\":\"cos_test\"},{\"text\":\"서비스의 설정은 다음과 같습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/cecdc653292111ef812f5254002a8f58.png\",\"id\":\"AIb46TONsUDosT3xE0rOw\",\"naturalSize\":[1059,693],\"size\":[642,420]},{\"text\":\"\\n여기서 policy.grantrevoke.auth.users는 COS Ranger Service를 시작하는 데 사용되는 사용자 이름(권한 가져오기 정책을 허용하는 사용자)으로 설정해야 합니다. 일반적으로 hadoop 설정이 권장되며, 이후 작업에서 COS Ranger Service는 이 사용자 이름으로 실행할 수 있습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"5wVVrY8keCOVMvlDdC5of\"},{\"children\":[{\"text\":\"생성된 COS 서비스 인스턴스를 클릭합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/cec84dff292111efa45a5254008fe934.png\",\"id\":\"ixFrByEFPV93IlGqqbbwA\",\"naturalSize\":[790,204],\"size\":[790,204]},{\"text\":\"\\n다음 그림과 같이 policy를 추가합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/cecb68ae292111ef812f5254002a8f58.png\",\"id\":\"6bjDmZ4QO5EULH-pELJo4\",\"naturalSize\":[2551,372],\"size\":[696,101]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"vK4vuZRXOMMRfqgyHn7qm\"},{\"children\":[{\"text\":\"리디렉션 페이지에서 다음 매개변수를 설정합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"vyvyxZWLajHPMeWK4iVJj\"},{\"children\":[{\"b\":1,\"text\":\"bucket\"},{\"text\":\": examplebucket-1250000000과 같은 버킷 이름은 \"},{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5/bucket\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5/bucket\"},\"type\":\"ref\",\"id\":\"QaxBfjOdMbDL1Sykr73jw\"},{\"text\":\"에 로그인하여 조회할 수 있습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"klDZs05tbdHp3u2eAd8je\"},{\"children\":[{\"b\":1,\"text\":\"path\"},{\"text\":\": COS객체 경로입니다. COS의 객체 경로가 /로 시작되지 않도록 주의하십시오.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"s6nBDX5dXlPE7dVx5u_Ds\"},{\"children\":[{\"text\":\"include: 설정된 권한이 path 자체에 적용되었는지, 혹은 path 이외의 다른 경로에 적용되었는지 나타냅니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"P_RDmjMiQ1YXYHTQ8-r7-\"},{\"children\":[{\"text\":\"recursive: 권한이 path 외에 path 경로의 하위 구성원(귀속되는 구성원)에도 적용된다는 것을 나타냅니다. 보통 path 설정을 디렉터리로 사용하는 경우입니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"NP4I21E8JfLuQAcLfsKaW\"},{\"children\":[{\"b\":1,\"text\":\"user/group\"},{\"text\":\": 사용자 이름과 사용자 그룹입니다. 둘 중 하나만 충족하면 되는 관계로, 사용자 이름 혹은 사용자 그룹 중 하나를 만족하면 상응하는 작업 권한을 보유할 수 있습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"SaA25b9leoEi5nXLFG_o3\"},{\"children\":[{\"b\":1,\"text\":\"Permissions\"},{\"text\":\":\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"gBj8q8VL6sKvAN-p4FE6m\"},{\"children\":[{\"text\":\"Read: 읽기 작업입니다. 객체 다운로드, 객체 메타데이터 조회 등 COS의 GET, HEAD와 같은 작업에 대응됩니다 \"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"HnS9B_tI-p-AviriENxPI\"},{\"children\":[{\"text\":\"Write: 쓰기 작업입니다. 객체 스토리지 안에 있는 PUT와 같은 수정 작업, 예를 들어 객체 업로드와 같은 작업에 대응합니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"pS6-Rsd6dowebHYvwVlHF\"},{\"children\":[{\"text\":\"Delete: 삭제 작업입니다. COS의 Object 삭제와 대응됩니다. Hadoop의 Rename 작업의 경우, 기존 경로에 대한 삭제 작업과 신규 경로에 대한 입력 작업 권한이 필요합니다.\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"ldJFupORzYIvTI-aIvS7Q\"},{\"children\":[{\"text\":\"List: 탐색 권한입니다. COS의 List Object에 대응됩니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/cec9cdee292111ef94525254005f7176.png\",\"id\":\"8rvTD5WwT_8zads5E6FKM\",\"naturalSize\":[2491,818],\"size\":[725,238]},{\"text\":\"\"}],\"indent\":2,\"start\":false,\"type\":\"uli\",\"id\":\"n_P_NAUD1T6aCs7kKtNVM\",\"align\":\"left\"}],\"id\":\"8\",\"name\":\"COS Ranger Plugin 배포\",\"type\":\"tab\"},{\"children\":[{\"children\":[{\"text\":\"COS Ranger Service는 전체 권한 시스템의 핵심으로, ranger 클라이언트와 통합되어 ranger client의 인증 요청, token 생성 및 리스 갱신 요청, 임시 키 생성 요청을 수신합니다. 민감한 정보(Tencent Cloud 키 정보)가 저장되는 곳이기도 합니다. 보통 점프 서버에 배포되며 클러스터 관리자만 작업을 수행하고 구성을 쿼리할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"x6kR6yh4U7BvLNBlng4Wr\"},{\"children\":[{\"text\":\"COS Ranger Service는 단일 프라이머리, 다중 세컨더리 HA 배포를 지원하며, DelegationToken은 HDFS에 저장할 수 있습니다. ZK 잠금 장치로 Leader의 신분을 결정합니다. Leader의 신분을 획득한 프라이머리 노드는 COS Ranger Client가 주소 라우팅을 수행할 수 있도록 ZK에 주소를 기록합니다.\"}],\"type\":\"p\",\"id\":\"-zRVsy15FH5cYNhkHOx9a\"},{\"children\":[{\"text\":\"코드 주소\"}],\"nodeId\":\".EC.BD.94.EB.93.9C-.EC.A3.BC.EC.86.8C2\",\"type\":\"h4\",\"id\":\"jV_3D9lNQuK5p7EN5JTLy\"},{\"children\":[{\"children\":[{\"text\":\"Github\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-ranger-service\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-ranger-service\"},\"type\":\"ref\",\"id\":\"_XwPb0nPVawyCuLBhEoBF\"},{\"text\":\"의 cos-ranger-server 디렉터리로 이동하여 얻을 수 있습니다.\"}],\"type\":\"p\",\"id\":\"HJSW0twLOREuelvEFR1QC\"},{\"children\":[{\"text\":\"버전\"}],\"nodeId\":\".EB.B2.84.EC.A0.842\",\"type\":\"h4\",\"id\":\"tNUHfuB68shiKeV71ppb9\"},{\"children\":[{\"text\":\"V5.1.2 이상 버전\"}],\"type\":\"p\",\"id\":\"eN0rrZI-Z1slY60-q_1IO\"},{\"children\":[{\"text\":\"배포 순서\"}],\"nodeId\":\".EB.B0.B0.ED.8F.AC-.EC.88.9C.EC.84.9C2\",\"type\":\"h4\",\"id\":\"LhspKfcrGZogRqJX-lICy\"},{\"children\":[{\"text\":\"COS Ranger Service 서비스 코드를 클러스터의 기기 몇 대에 복사하고, 생성 환경은 최소 기기 두 대(메인 기기와 예비용 기기)를 권장합니다. 중요한 정보를 다루기 때문에 점프 서버 혹은 권한이 엄격히 통제되는 기기를 권장합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"f0a5TuPN9HVsnxKNqxRmp\"},{\"children\":[{\"text\":\"cos-ranger.xml 파일에서 구성을 수정합니다. 다음은 필요한 수정 사항입니다. 구성 항목에 대한 자세한 내용은 파일의 설명을 참고하십시오(구성 파일은 \"},{\"children\":[{\"text\":\"Github\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-ranger-service\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-ranger-service\"},\"type\":\"ref\",\"id\":\"TNZdsf4HwsyMnYH0SqVa9\"},{\"text\":\"의 cos-ranger-service/conf 디렉터리에서 얻을 수 있습니다).\"}],\"start\":false,\"type\":\"oli\",\"id\":\"Jl36CVyKr7fbcHtFloucY\"},{\"children\":[{\"text\":\"qcloud.object.storage.rpc.address\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"m8wN8wO0ynOg_SjNUrp_f\"},{\"children\":[{\"text\":\"qcloud.object.storage.status.port\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"upTho6-PzYX6RcJiJ-BsP\"},{\"children\":[{\"text\":\"qcloud.object.storage.enable.cos.ranger\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"0y3HgBSlpHdsDot5rCbua\"},{\"children\":[{\"text\":\"qcloud.object.storage.zk.address (zk 주소, cos ranger service 실행 후 zk에 등록)\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"oWUzoq5iU5KCzXgQy-eiD\"},{\"children\":[{\"text\":\"qcloud.object.storage.cos.secret.id\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"AeGXVAw_5LXMoG6EcLMJ5\"},{\"children\":[{\"text\":\"qcloud.object.storage.cos.secret.key\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"ium39C__XwYvWDbTOtdNm\"},{\"children\":[{\"text\":\"ranger-cos-security.xml 파일에서 구성을 수정합니다. 다음은 필요한 수정 사항입니다. 구성 항목에 대한 자세한 내용은 파일의 설명을 참고하십시오(구성 파일은 \"},{\"children\":[{\"text\":\"Github\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-ranger-service\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-ranger-service\"},\"type\":\"ref\",\"id\":\"XDh9-8NHOets4WtoNstxK\"},{\"text\":\"의 cos-ranger-service/conf 디렉터리에서 얻을 수 있습니다).\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"rIYaUsWgEQMmRlfgNkUAU\"},{\"children\":[{\"text\":\"ranger.plugin.cos.policy.cache.dir\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"MM77Sct3KTziftmmDkCYt\"},{\"children\":[{\"text\":\"ranger.plugin.cos.policy.rest.url\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"DbuQcziDyrYi6ZYiSuqG2\"},{\"children\":[{\"text\":\"ranger.plugin.cos.service.name\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"06Uyi7eQE_6ahldduSvnI\"},{\"children\":[{\"text\":\"start_rpc_server.sh에서 hadoop_conf_path, java.library.path의 설정을 수정합니다. 이 두 가지 설정은 각각 hadoop 설정 파일이 들어 있는 디렉터리(core-site.xml, hdfs-site.xml 등) 및 hadoop native lib 경로를 가리킵니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"ssrU74VjBS7SMKgZW4tpz\"},{\"children\":[{\"text\":\"다음 명령어를 실행하여 서비스를 시작합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"gcRU07beIBmRS-WusNUTm\"},{\"children\":[{\"children\":[{\"text\":\"chmod +x start_rpc_server.sh\"}],\"type\":\"code-line\",\"id\":\"6Oc4EhhW9dponXuF2TFhe\"},{\"children\":[{\"text\":\"nohup ./start_rpc_server.sh &> nohup.txt &\"}],\"type\":\"code-line\",\"id\":\"8FzS8OXK0PCKxHKMFBI_0\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"AdHp-dGvbaLq719X0v-z2\",\"autoWrap\":false},{\"children\":[{\"text\":\"실행에 실패하면 log의 error 로그에 잘못된 정보가 있는지 조회합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"xVkeFE896K8pfJ24KV5x0\"},{\"children\":[{\"text\":\"COS Ranger Service는 HTTP 포트 상태(포트 이름은 qcloud.object.storage.status.port, 기본값은 9998)표시를 지원합니다. 사용자는 다음의 명령을 실행하여 leader의 포함 여부 및 인증 통계와 같은 상태 정보를 얻을 수 있습니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"Zg2xo9bV-7Nwg_nqztWG0\"},{\"children\":[{\"children\":[{\"text\":\"# 10.xx.xx.xxx를 ranger service와 함께 배포된 장치의 IP 주소로 바꿉니다.\"}],\"type\":\"code-line\",\"id\":\"8L13AxhqTyQu-akaM9iq4\"},{\"children\":[{\"text\":\"# 명령의 9998을 구성 파일의 qcloud.object.storage.status.port 값으로 바꿉니다.\"}],\"type\":\"code-line\",\"id\":\"Sklsa3LkPYF0mMZI2_tqN\"},{\"children\":[{\"text\":\"curl -v http://10.xx.xx.xxx:9998/status\"}],\"type\":\"code-line\",\"id\":\"UBGZXzhc3oSfxkYT-f-fT\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"bjRaR_vxs_Qqh2E28rXub\",\"autoWrap\":false},{\"children\":[{\"text\":\"하나의 cos ranger service 노드만 배포된 경우 위의 인터페이스 응답에서 현재 노드가 leader로 표시됩니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"M8AI5hbgCmCx3RiV6yEor\"},{\"children\":[{\"text\":\"여러 cos ranger service 노드가 배치된 경우 위의 인터페이스 응답에서 다른 노드가 leader가 되는 것을 볼 수 있으며 모든 노드를 다시 시작한 후 가장 먼저 다시 시작된 노드가 leader로 표시됩니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"5ihXt04KMk3XwQHp1m3mp\"}],\"id\":\"10\",\"name\":\"COS Ranger Service 배포\",\"type\":\"tab\"},{\"children\":[{\"children\":[{\"text\":\"COS Ranger Client는 hadoop cosn 플러그인에 의해 동적으로 로딩됩니다. 임시 키 획득, token 획득, 인증 작업과 같은 모든 COS Ranger Service 액세스 요청을 캡슐화하는 프록시입니다.\"}],\"type\":\"p\",\"id\":\"TX4VkVOsh9PxU3olL3SNP\"},{\"children\":[{\"text\":\"소스 코드 다운로드\"}],\"nodeId\":\".EC.86.8C.EC.8A.A4-.EC.BD.94.EB.93.9C-.EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C\",\"type\":\"h4\",\"id\":\"gYPkP2_r5HDUNKBCdiUKv\"},{\"children\":[{\"children\":[{\"text\":\"Github\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-ranger-service\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-ranger-service\"},\"type\":\"ref\",\"id\":\"UqjsbQWmQZdYfXhE3cB3V\"},{\"text\":\"의 cos-ranger-client 및 cosn-ranger-interface 디렉터리로 이동하여 소스 코드를 얻을 수 있습니다.\"}],\"type\":\"p\",\"id\":\"1Xyz9hteqF3Lj22wXOo7J\"},{\"children\":[{\"text\":\"버전\"}],\"nodeId\":\".EB.B2.84.EC.A0.843\",\"type\":\"h4\",\"id\":\"Y-YcJGRzC7igo6N5hw52e\"},{\"children\":[{\"text\":\"cos-ranger-client는 V5.0 이상 버전이 필요합니다.\"},{\"text\":\"cosn-ranger-interface는 v1.0.4 이상 버전이 필요합니다.\"}],\"type\":\"p\",\"id\":\"m4CaxcU525lezBI0_hHMQ\"},{\"children\":[{\"text\":\"배포 방식\"}],\"nodeId\":\".EB.B0.B0.ED.8F.AC-.EB.B0.A9.EC.8B.9D\",\"type\":\"h4\",\"id\":\"siNWtluaOQvlqw6eS9Xl4\"},{\"children\":[{\"text\":\"cos-ranger-client jar 패키지와 cosn-ranger-interface jar 패키지를 COSN과 동일한 디렉터리(일반적으로 /usr/local/service/hadoop/share/hadoop/common/lib/ 디렉터리)에 복사하십시오. 복사를 선택하고 hadoop 자체의 주요 버전과 일치하는 jar 패키지를 선택하고 마지막으로 jar 패키지에 읽기 권한이 있는지 확인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"MH8Rd_pPV9CEzNZP7xZyo\"},{\"children\":[{\"text\":\"core-site.xml에 다음과 같은 설정 항목을 추가하십시오.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"nwXuLF0RaYPiUn29shXtm\"},{\"children\":[{\"children\":[{\"text\":\"```\"}],\"type\":\"code-line\",\"id\":\"vNeoeDsdwjHgifTiwBRv0\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"VCDmpgpat0F1IQNrB88xa\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"3UIwiBerCWqhWuu-bTNeR\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"PrXrcw50hxKgNNkorw1RB\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"JTctPIsUtZAIPr_e1dXoE\"},{\"children\":[{\"text\":\" qcloud.object.storage.ranger.service.address\"}],\"type\":\"code-line\",\"id\":\"P3Q_CnXlpXz_9O3Za_Owx\"},{\"children\":[{\"text\":\" 10.0.0.8:9999,10.0.0.10:9999\"}],\"type\":\"code-line\",\"id\":\"FyOKwWNzVztuMw-0Z7rgR\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"S2awALK_fJAjHt4XJ5wQS\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"CVvQzgk9JWO6LSRhuWkB1\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"acdmI2CqhQGqmOFLxBLCy\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"yCTVrZaQljHpEDxRLPNTr\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"BwxC09OXVnZYcWOuekC3w\"},{\"children\":[{\"text\":\" qcloud.object.storage.kerberos.principal\"}],\"type\":\"code-line\",\"id\":\"FWfVcw-UVCMMIhZsrg35c\"},{\"children\":[{\"text\":\" hadoop/_HOST@EMR-XXXX\"}],\"type\":\"code-line\",\"id\":\"k0BBxHNMR_pE4TCE2dufJ\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"ESBR8JUj9fTb56V2tm3Ow\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"YTN0P_nOsCIxKLO0TaB8l\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"NYlqW_LnyUdVjG5wkUtHB\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"AmxSZTE8wnu2XH5RX0uJF\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"XGjpRQLiQuyuZHIc4Ypkv\"},{\"children\":[{\"text\":\" qcloud.object.storage.zk.leader.ip.path \"}],\"type\":\"code-line\",\"id\":\"FzmEdvsmNBck8fTgFhlq6\"},{\"children\":[{\"text\":\" /ranger_qcloud_object_storage_leader_ip\"}],\"type\":\"code-line\",\"id\":\"orHLbNKgRVoEgdn5yYpmP\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"g5iRCPJkIQMNQoXXiAIAd\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"uha_aHnPCnSSdbIBqeMDe\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"TE_bNFDtNRaLPk8YbO7uD\"},{\"children\":[{\"text\":\" qcloud.object.storage.zk.follower.ip.path\"}],\"type\":\"code-line\",\"id\":\"vNPA74L2EUkPknTmVoniM\"},{\"children\":[{\"text\":\" /ranger_qcloud_object_storage_follower_ip\"}],\"type\":\"code-line\",\"id\":\"fQNNwPlEajI2DiV59Zi3L\"},{\"children\":[{\"text\":\" \"}],\"type\":\"code-line\",\"id\":\"kiqGHKMvPIBtTUC0FEk-X\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"jEynH_cHTrDARUd4EpbFA\"},{\"children\":[{\"text\":\"```\"}],\"type\":\"code-line\",\"id\":\"yLlvmKw09m1iPmi_PCH_l\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"CSVmu88AJduh2Wc-JvlbB\"}],\"id\":\"12\",\"language\":\"bash\",\"name\":\"xml\",\"type\":\"code-block\",\"autoWrap\":false}],\"id\":\"11\",\"name\":\"COS Ranger Client 배포\",\"type\":\"tab\"},{\"children\":[{\"children\":[{\"text\":\"버전\"}],\"nodeId\":\".EB.B2.84.EC.A0.844\",\"type\":\"h4\",\"id\":\"vZRrGmokhicWfXF_WwVWN\"},{\"children\":[{\"text\":\"V8.0.1 이상 버전\"}],\"type\":\"p\",\"id\":\"Pw2Gdqido6Fdwgt-_RAjd\"},{\"children\":[{\"text\":\"배포 방식\"}],\"nodeId\":\".EB.B0.B0.ED.8F.AC-.EB.B0.A9.EC.8B.9D2\",\"type\":\"h4\",\"id\":\"co2Crt0JxbwUibCEGWER-\"},{\"children\":[{\"text\":\"COSN 플러그 인 배포 방법은 \"},{\"children\":[{\"text\":\"Hadoop 툴\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/6884\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/6884\"},\"type\":\"ref\",\"id\":\"X_Aol5bKs_8mlHhJWR9My\"},{\"text\":\" 문서를 참고하십시오. 단, 다음 몇 가지를 주의하십시오.\"}],\"type\":\"p\",\"id\":\"Mhe7_w7dcJ2HKPZSE3hZV\"},{\"children\":[{\"text\":\"ranger를 사용한 후, fs.cosn.userinfo.secretId와 fs.cosn.userinfo.secretKey 키 정보는 설정이 필요하지 않습니다. COSN 플러그 인은 향후 COSRangerService를 통해 임시 키를 부여받게 됩니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"1kP8MHtNQ_mGqV3-9KOE1\"},{\"children\":[{\"text\":\"fs.cosn.credentials.provider는 org.apache.hadoop.fs.auth.RangerCredentialsProvider 설정이 되어야만 Ranger를 통해 다음과 같은 인증 진행이 가능합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"SSo-Af6y_V9SiK2nC9L1B\"},{\"children\":[{\"children\":[{\"text\":\"```\"}],\"type\":\"code-line\",\"id\":\"K07bpIBEvR3yoL7te1oc5\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"J8rEFaKrxpV4hUDwzEggM\"},{\"children\":[{\"text\":\" fs.cosn.credentials.provider\"}],\"type\":\"code-line\",\"id\":\"QdMi37jPZb45Zj9dp1Hbc\"},{\"children\":[{\"text\":\" org.apache.hadoop.fs.auth.RangerCredentialsProvider\"}],\"type\":\"code-line\",\"id\":\"5uPUWG-lhZpXnkAwnQC6O\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"ZCcYyrNN2IdLD17y2lv0b\"},{\"children\":[{\"text\":\"```\"}],\"type\":\"code-line\",\"id\":\"hag49oh4WF_xKgJs_zrnJ\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\",\"id\":\"4Asc7H4BY4zhw9WYx46Md\"}],\"id\":\"14\",\"language\":\"bash\",\"name\":\"plaintext\",\"type\":\"code-block\",\"autoWrap\":false}],\"id\":\"13\",\"name\":\"COSN 배포\",\"type\":\"tab\"}],\"type\":\"tabs\",\"id\":\"t58WEIydMgswVCspodp6j\"},{\"children\":[{\"text\":\"인증\"}],\"nodeId\":\".EC.9D.B8.EC.A6.9D\",\"type\":\"h2\",\"id\":\"dpgdii0cRkyubqlCGpH5j\"},{\"children\":[{\"text\":\"hadoop cmd를 사용해 COSN 관련 작업을 액세스합니다. 현재 사용자가 하고 있는 작업이 루트 계정의 권한 설정 예측에 부합하는지 확인합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"UkcN4ntqoaSpNSOn0f4ay\"},{\"children\":[{\"children\":[{\"text\":\"#bucket, 경로 및 기타 정보를 루트 계정의 정보로 교체합니다.\"}],\"type\":\"code-line\",\"id\":\"aifc7OhOHp4g4qm8Eog4H\"},{\"children\":[{\"text\":\"hadoop fs -ls cosn://examplebucket-1250000000/doc\"}],\"type\":\"code-line\",\"id\":\"qvvSnw3VFBALNfRLAx3_Q\"},{\"children\":[{\"text\":\"hadoop fs -put ./xxx.txt cosn://examplebucket-1250000000/doc/\"}],\"type\":\"code-line\",\"id\":\"_aqRG1X59csM3VW10zyAB\"},{\"children\":[{\"text\":\"hadoop fs -get cosn://examplebucket-1250000000/doc/exampleobject.txt\"}],\"type\":\"code-line\",\"id\":\"IRnqfGA_Ghz5rzUCao9KQ\"},{\"children\":[{\"text\":\"hadoop fs -rm cosn://examplebucket-1250000000/doc/exampleobject.txt\"}],\"type\":\"code-line\",\"id\":\"9XTs_OxPwkHvXr63DqdnL\"}],\"indent\":1,\"language\":\"plaintext\",\"type\":\"code-block\",\"id\":\"1CFGBE684P6YeAE_tuQGG\",\"autoWrap\":false},{\"children\":[{\"text\":\"MR Job을 사용하여 인증합니다. 인증 전 Yarn, Hive 등 관련 서비스를 재시작해야 합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"3AZvaBvu1z2fY_86sTVZN\"},{\"children\":[{\"text\":\"FAQ\"}],\"nodeId\":\"faq\",\"type\":\"h2\",\"id\":\"pBmDs9xXnd5u1LTl-zF8z\"},{\"children\":[{\"text\":\"kerberos 설치가 꼭 필요한가요?\"}],\"nodeId\":\"kerberos-.EC.84.A4.EC.B9.98.EA.B0.80-.EA.BC.AD-.ED.95.84.EC.9A.94.ED.95.9C.EA.B0.80.EC.9A.94.3F\",\"type\":\"h4\",\"id\":\"-4R-DOvrehrEeRjSv0hck\"},{\"children\":[{\"text\":\"Kerberos는 인증 요구 사항을 충족합니다. 클러스터와 사용자를 신뢰할 수 있고 인증 목적이 권한이 없는 사용자로 인한 오작동을 방지하는 것뿐이라면 Kerberos 설치를 건너뛰고 인증을 위해 ranger만 사용할 수 있습니다. 사실 Kerberos는 일부 성능을 저하시킬 수도 있습니다. 따라서 보안과 성능에 대한 요구 사항의 균형을 맞출 수 있습니다. 인증이 필요한 경우 Kerberos를 활성화한 다음 COS Ranger Service 및 COS Ranger Client를 구성할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"MUTgSYJtIVWYfgG2Cfohj\"},{\"children\":[{\"text\":\"Ranger를 실행했는데 Policy가 설정되어 있지 않거나 Policy가 매칭되지 않았을 경우, 어떻게 작업하나요?\"}],\"nodeId\":\"ranger.EB.A5.BC-.EC.8B.A4.ED.96.89.ED.96.88.EB.8A.94.EB.8D.B0-policy.EA.B0.80-.EC.84.A4.EC.A0.95.EB.90.98.EC.96.B4-.EC.9E.88.EC.A7.80-.EC.95.8A.EA.B1.B0.EB.82.98-policy.EA.B0.80-.EB.A7.A4.EC.B9.AD.EB.90.98.EC.A7.80-.EC.95.8A.EC.95.98.EC.9D.84-.EA.B2.BD.EC.9A.B0.2C-.EC.96.B4.EB.96.BB.EA.B2.8C-.EC.9E.91.EC.97.85.ED.95.98.EB.82.98.EC.9A.94.3F\",\"type\":\"h4\",\"id\":\"q7kpPD6DuavQs01B7PhrD\"},{\"children\":[{\"text\":\"Policy가 매칭되지 않았을 경우 기본적으로 해당 작업이 거부됩니다.\"}],\"type\":\"p\",\"id\":\"GD8kwg7HzzwO5peFdg-mx\"},{\"children\":[{\"text\":\"COS Ranger Service 측의 키 설정은 서브 계정도 가능한가요?\"}],\"nodeId\":\"cos-ranger-service-.EC.B8.A1.EC.9D.98-.ED.82.A4-.EC.84.A4.EC.A0.95.EC.9D.80-.EC.84.9C.EB.B8.8C-.EA.B3.84.EC.A0.95.EB.8F.84-.EA.B0.80.EB.8A.A5.ED.95.9C.EA.B0.80.EC.9A.94.3F\",\"type\":\"h4\",\"id\":\"trB-fLqDjFC7moaJ88ZQV\"},{\"children\":[{\"text\":\"서브 계정도 가능합니다. 그러나 bucket을 실행할 수 있는 권한이 있어야만, COSN 플러그 인에 들어가 관련 작업을 할 수 있는 임시 키 생성이 가능합니다. 일반적으로 여기서 설정하는 키는 해당 bucket의 모든 권한을 갖기를 권장합니다.\"}],\"type\":\"p\",\"id\":\"nO9tM6TowSXAGUdIT82Fo\"},{\"children\":[{\"text\":\"임시 키는 어떻게 업데이트 되나요? 그리고 COS를 방문할 때마다 COS Ranger Service에서 임시 키를 획득해야 하나요?\"}],\"nodeId\":\".EC.9E.84.EC.8B.9C-.ED.82.A4.EB.8A.94-.EC.96.B4.EB.96.BB.EA.B2.8C-.EC.97.85.EB.8D.B0.EC.9D.B4.ED.8A.B8-.EB.90.98.EB.82.98.EC.9A.94.3F-.EA.B7.B8.EB.A6.AC.EA.B3.A0-cos.EB.A5.BC-.EB.B0.A9.EB.AC.B8.ED.95.A0-.EB.95.8C.EB.A7.88.EB.8B.A4-cos-ranger-service.EC.97.90.EC.84.9C-.EC.9E.84.EC.8B.9C-.ED.82.A4.EB.A5.BC-.ED.9A.8D.EB.93.9D.ED.95.B4.EC.95.BC-.ED.95.98.EB.82.98.EC.9A.94.3F\",\"type\":\"h4\",\"id\":\"_2xqqsW2hwOhVElzgx5Vc\"},{\"children\":[{\"text\":\"임시 키는 COSN 플러그 인 cache에 있으며, 주기적으로 비동기화 업데이트됩니다.\"}],\"type\":\"p\",\"id\":\"URojyxykz62tnn47Q_9VT\"},{\"children\":[{\"text\":\"ranger 페이지에서 Policy를 변경했는데 적용되지 않으면 어떻게 해야 하나요?\"}],\"nodeId\":\"ranger-.ED.8E.98.EC.9D.B4.EC.A7.80.EC.97.90.EC.84.9C-policy.EB.A5.BC-.EB.B3.80.EA.B2.BD.ED.96.88.EB.8A.94.EB.8D.B0-.EC.A0.81.EC.9A.A9.EB.90.98.EC.A7.80-.EC.95.8A.EC.9C.BC.EB.A9.B4-.EC.96.B4.EB.96.BB.EA.B2.8C-.ED.95.B4.EC.95.BC-.ED.95.98.EB.82.98.EC.9A.94.3F\",\"type\":\"h4\",\"id\":\"mwUeTx2Ube8lnGwU14hQv\"},{\"children\":[{\"text\":\"ranger-cos-security.xml 파일에서 ranger.plugin.cos.policy.pollIntervalMs 값(밀리초)을 줄이고 COS Ranger Service를 다시 시작합니다. Policy 관련 테스트가 끝난 후에는 다시 원래 값으로 변경하는 것이 좋습니다(시간 간격이 너무 짧으면 라운드 로빈 빈도가 높아 CPU 사용률이 높아짐).\"}],\"type\":\"p\",\"id\":\"Qn68e6GqzuW9H9wGWpKNm\"}]"}},"40490":{"categoryId":436,"weight":20,"type":"page","extension":"","pid":34079,"id":40490,"lang":"ko","title":"COS를 로컬 드라이브로 Windows 서버에 마운트하기","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2021-07-01 23:14:16","recentReleaseTime":"2021-07-01 23:14:16","content":{"title":"COS를 로컬 드라이브로 Windows 서버에 마운트하기","body":"

작업 시나리오

현재 Windows시스템에서의 Tencent Cloud COS 작업은 주로 API, COSBrowser, COSCMD 툴로 구현됩니다.
Windows 서버를 사용하는 사용자는 COSBrowser를 클라우드 저장소로만 사용할 수 있으므로 프로그램을 실행하거나 작업을 수행하는 데 적합하지 않습니다. 본 문서는 비용 효율적인 COS를 로컬 드라이브로 Windows 서버에 마운트하는 방법을 소개합니다.
설명:
본 문서에 제공된 예시는 Windows 7 또는 Windows Server 2012 / 2016 / 2019 / 2022에만 적용됩니다.

작업 단계

다운로드 및 설치

본 문서에 제공된 예시에는 세 가지 유형의 소프트웨어가 포함됩니다. 시스템과 호환되는 소프트웨어 버전을 설치할 수 있습니다.
GitHub로 이동하여 Winfsp를 다운로드합니다.\n예시로 winfsp-1.12.22301을 다운로드 합니다. 그 다음 기본 옵션으로 설치할 수 있습니다.
설명:
Windows Server 2012 R2의 경우 Winfsp 1.12.22242는 호환되지 않지만 Winfsp 1.11.22176은 호환됩니다.
1. Git 또는 GitHub로 이동하여 Git을 다운로드합니다.\nGit-2.38.1-64-bit는 예시로 다운로드 됩니다. 그런 다음 기본 옵션으로 설치할 수 있습니다.
2. Rclone 또는 GitHub에 접속하여 Rclone을 다운로드합니다.\n예시로 rclone-v1.60.1-windows-amd64가 다운로드됩니다. 영어로 이름이 지정된 디렉터리에만 압축을 풀면 됩니다(한자가 포함된 경로로 압축을 풀면 오류가 발생할 수 있음). 이 예시에서 패키지는 E:\\AutoRclone으로 압축 해제됩니다.
설명:
GitHub를 열 수 없거나 다운로드 속도가 느린 경우 다른 다운로드 방법을 찾을 수 있습니다.

Rclone 구성

주의:
다음 구성 프로세스는 rclone-v1.60.1-windows-amd64를 예로 들어 설명합니다. 구성 프로세스는 버전에 따라 다를 수 있습니다.
1. 폴더를 열고 왼쪽 탐색 창에서 이 PC를 찾아 우클릭한 다음 속성 > 고급 시스템 설정 > 환경 변수 > 시스템 변수 > Path를 선택합니다. 생성을 클릭합니다.
2. 팝업 창에 Rclone이 압축 해제된 경로(E:\\AutoRclone)를 입력하고 확인을 클릭합니다.
3. Windows PowerShell을 열고 rclone --version 명령을 실행하여 Enter를 눌러 Rclone이 성공적으로 설치되었는지 확인합니다.
4. Rclone 설치 확인 후 Windows PowerShell에서 rclone config 명령을 입력하고 Enter를 눌러 명령을 실행합니다.
5. Windows PowerShell에서 n을 입력하고 Enter를 눌러 New remote를 생성합니다.
6. Windows PowerShell에서 myCOS와 같은 해당 디스크의 이름을 입력하고 Enter를 누릅니다.
7. 표시되는 옵션에서 ‘Tencent COS’가 포함된 옵션을 선택(즉, 5 입력)한 다음 Enter를 누릅니다.\n
\"\"


8. 표시되는 옵션에서 ‘TencentCOS’가 포함된 옵션(즉, 21 입력)을 선택한 다음 Enter를 누릅니다.\n
\"\"


9. env_auth>가 표시되면 Enter를 누릅니다.
10. access_key_id>가 표시되면 COS의 SecretId를 입력하고 Enter를 누릅니다.
설명:
여기서는 서브 계정 권한 사용을 권장합니다. API 키 관리로 이동하여 SecretId와 SecretKey를 확인할 수 있습니다.
11. secret_access_key>가 표시되면 COS의 SecretKey를 입력하고 Enter를 누릅니다.
12. 표시되는 Tencent Cloud 리전의 게이트웨이 주소에 따라 버킷 리전을 선택합니다.\n여기에서는 광저우 리전을 예로 사용합니다. 따라서 4(cos.ap-guangzhou.myqcloud.com)를 입력한 후 Enter를 누릅니다.
13. 필요에 따라 객체 권한(예시: default, public-read 등)을 선택합니다. 이 권한은 나중에 업로드되는 객체에만 적용됩니다. 여기서는 default가 예로 사용됩니다. 따라서 1을 입력한 다음 Enter를 누릅니다.\n
\"\"


14. COS에 업로드된 객체의 스토리지 클래스를 선택합니다. 여기서는 Default가 예로 사용됩니다. 따라서 1을 입력한 다음 Enter를 누릅니다.\n
\"\"


Default: 기본값
Standard storage class: 스탠다드 스토리지(STANDARD)
Archive storage mode: 아카이브 스토리지(ARCHIVE)
Infrequent access storage mode: 스탠다드IA 스토리지(STANDARD_IA)
설명:
INTELLIGENT TIERING 또는 DEEP ARCHIVE 스토리지 클래스를 사용하려면 구성 파일 수정 방법을 사용한 다음 storage_class 값을 INTELLIGENT_TIERING 또는 DEEP_ARCHIVE로 설정합니다. 스토리지 클래스에 대한 자세한 내용은 스토리지 유형 개요를 참고하십시오.
15. Edit advanced config? (y/n)이 표시되면 Enter를 누릅니다.
16. 정보에 오류가 없는지 확인한 후 Enter를 누릅니다.
17. q를 입력하여 구성을 완료합니다.\n
\"\"



구성 파일 수정

이전 구성이 완료되면 C:\\Users\\Username\\AppData\\Roaming\\rclone 디렉터리에 rclone.conf라는 구성 파일이 생성됩니다. 파일을 직접 수정하여 rclone 구성을 업데이트할 수 있습니다. 파일을 찾을 수 없는 경우 명령줄 창에서 rclone config file 명령을 실행하여 rclone 구성 파일을 볼 수 있습니다.

COS를 로컬 드라이브로 마운트

1. 설치된 Git Bash를 열고 명령 라인 툴에 실행 명령을 입력합니다. 여기에는 두 가지 사용 시나리오가 제공되며(둘 중 하나 선택), 실제 필요에 따라 둘 중 하나를 선택할 수 있습니다.
LAN에서 COS를 공유 드라이브로 마운트하려면(권장) 다음 명령을 실행하십시오.
rclone mount myCOS:/ Y: --fuse-flag --VolumePrefix=\\server\\share --cache-dir E:\\temp --vfs-cache-mode writes &
로컬 디스크로 매핑된 경우 다음과 같이 명령을 실행합니다:
rclone mount myCOS:/ Y: --cache-dir E:\\temp --vfs-cache-mode writes &
myCOS: 사용자 정의 디스크 이름으로 변경합니다.
Y: 마운트할 디스크로 변경한 후 디스크의 드라이브 문자를 변경하면 됩니다. 로컬의 C, D, E 드라이브 등과 중복되지 않아야 합니다.
E:\\temp: 필요에 따라 설정할 수 있는 로컬 캐시 디렉터리입니다. 디렉터리에 대한 권한이 있습니다.
"The service rclone has been started"가 안내되면 마운트가 성공적으로 완료되었음을 의미합니다.
2. exit를 입력하고 터미널을 종료합니다.
3. 로컬 컴퓨터의 내 PC에서 myCOS(Y:)란 이름의 디스크를 찾을 수 있습니다.\n해당 디스크를 열면 광저우 리전 전체에 속한 모든 버킷 이름을 조회할 수 있습니다. 이때 업로드, 다운로드, 생성, 삭제 등 로컬 디스크에서 자주 쓰는 작업을 진행할 수 있습니다.
주의:
작업 도중 오류가 발생하면 Git Bash 소프트웨어에서 상세 오류 정보를 확인하십시오.
디스크를 마운트하는 도중 버킷에서 삭제 작업을 하면 버킷 내 파일 존재 여부와 상관없이 모두 삭제될 수 있으니 신중히 작업하시기 바랍니다.
디스크를 마운트하는 도중 버킷 이름을 변경하는 경우 COS 버킷 이름이 변경될 수 있으니 신중히 작업하시기 바랍니다.

시작 시 자동으로 마운트된 드라이브 실행

마운트된 드라이브는 서버가 재시작되면 사라집니다. 따라서 다음 작업을 수행하여 시작 시 드라이브가 자동 실행되도록 설정할 수 있습니다.
1. E:\\AutoRclone 디렉터리에 startup_rclone.vbs 및 startup_rclone.bat 파일을 생성합니다.
설명:
PowerShell을 통해 텍스트 파일을 생성할 때 올바른 인코딩을 사용하십시오. 그렇지 않으면 생성된 .bat 및 .vbs 파일을 실행할 수 없습니다.
2. startup_rclone.bat에 다음 마운트 명령어를 입력합니다.
COS가 LAN에서 공유 드라이브로 마운트된 경우 다음 명령을 실행합니다.
rclone mount myCOS:/ Y: --fuse-flag --VolumePrefix=\\server\\share --cache-dir E:\\temp --vfs-cache-mode writes &
로컬 디스크로 매핑한 경우 다음 명령어를 입력합니다.
rclone mount myCOS:/ Y: --cache-dir E:\\temp --vfs-cache-mode writes &
3. startup_rclone.vbs에 다음 코드를 입력합니다.
CreateObject("WScript.Shell").Run "cmd /c E:\\AutoRclone\\startup_rclone.bat",0
주의:
코드 경로를 실행 경로로 수정하십시오.
4. startup_rclone.vbs 파일을 잘라내 %USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup 폴더에 붙여 넣습니다.
5. 서버를 재시작합니다.
설명:
일반적으로 자동 마운트 구성이 완료되고 서버가 다시 시작되면 마운트 성공 메시지가 수십 초 후에 표시됩니다.

관련 작업

3rd party 상용화 유료 툴을 사용해 COS를 Windows 서버에 마운트한 후 로컬 디스크로 매핑할 수도 있습니다. 다음 작업은 TntDrive 툴 예시입니다.
1. TntDrive를 다운로드 및 설치합니다.
2. TntDrive를 열고 Account > Add New Account를 클릭해 계정을 생성합니다.\n
\"\"

\n주요 매개변수 정보는 다음과 같습니다.
Account Name: 사용자 정의 계정 이름
Account Type: COS는 S3와 호환되므로, 여기서 Amazon S3 Compatible Storage를 선택할 수 있습니다.
REST Endpoint: 버킷이 위치한 리전을 입력합니다. 예를 들어, 버킷이 광저우 리전에 있다면 cos.ap-guangzhou.myqcloud.com을 입력합니다.
주의
2024년 1월 1일 이후에 생성된 버킷은 경로 스타일 도메인 이름(형식: cos.<Region>.myqcloud.com) 사용을 지원하지 않습니다. 자세한 내용은 COS 버킷 도메인 이름 보안 관리 공지(2024년 1월 시행)를 참조하십시오.
Access Key ID: SecretId를 입력합니다. API 키 관리 페이지에서 생성 및 획득할 수 있습니다.
Secret Access Key: SecretKey를 입력합니다.
3. Add new account를 클릭합니다.
4. TntDrive 인터페이스에서 Add New Mapped Drives를 클릭해 Mapped Drives를 생성합니다.\n
\"\"

\n주요 매개변수 정보는 다음과 같습니다.
Amazon S3 Bucket: 버킷 경로를 입력하거나 버킷 이름을 선택합니다. 우측 버튼을 클릭해 버킷을 선택할 수 있습니다. 2단계에서 설정한 광저우 리전의 버킷이 표시되며, 버킷 1개당 1개의 디스크가 독립적으로 매핑됩니다.
Mapped drive letter: 디스크의 드라이브 문자를 설정합니다. 로컬의 C, D, E 드라이브 등과 중복되지 않아야 합니다.
5. 위의 정보를 확인하고 Add new drive를 클릭합니다.
6. 로컬 컴퓨터의 내 PC에서 드라이브를 찾습니다. 모든 버킷을 Windows 서버에 매핑하려면 위의 단계를 반복합니다.

마운트 실패 원인

1. 다음 매개변수가 올바르게 구성되었는지 확인하세요:
SecretId와 SecretKey가 올바르게 입력되었는지 확인합니다.
Option Storage를 선택할 때 반드시 TencentCOS를 선택해야 합니다.
\"\"

\"\"

2. 오류가 있는 경우 매개변수를 수정한 후 서버를 재부팅하여 다시 마운트합니다.
3. 비관리자 내장 관리자 계정을 사용하여 마운트 작업을 수행하는 경우 드라이브 문자나 디렉토리가 보이지 않는 문제가 발생할 수 있습니다. 비관리자 계정을 사용해야 하는 경우, Windows UAC 기능을 신중하게 비활성화하고 재부팅이 필요합니다. Windows UAC 기능을 비활성화하는 명령은 다음과 같습니다:
reg add "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\" /v EnableLUA /t REG_DWORD /d 0 /f

","recentReleaseTime":"2025-08-29 10:35:53","slate":"[{\"children\":[{\"text\":\"작업 시나리오\"}],\"nodeId\":\".EC.9E.91.EC.97.85-.EC.8B.9C.EB.82.98.EB.A6.AC.EC.98.A4\",\"type\":\"h2\",\"id\":\"qIzXq2BtOdqtLKviE2ODq\"},{\"children\":[{\"text\":\"현재 Windows시스템에서의 Tencent Cloud COS 작업은 주로 API, COSBrowser, COSCMD 툴로 구현됩니다.\"}],\"type\":\"p\",\"id\":\"AMTDIMnqpr3EwhvUzJnGm\"},{\"children\":[{\"text\":\"Windows 서버를 사용하는 사용자는 COSBrowser를 클라우드 저장소로만 사용할 수 있으므로 프로그램을 실행하거나 작업을 수행하는 데 적합하지 않습니다. 본 문서는 비용 효율적인 COS를 로컬 드라이브로 Windows 서버에 마운트하는 방법을 소개합니다.\"}],\"type\":\"p\",\"id\":\"qejdvNEVu15hGBxs3rriu\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"OKDKMv4aiX1ciEgwobBBQ\"},{\"children\":[{\"text\":\" 본 문서에 제공된 예시는 Windows 7 또는 Windows Server 2012 / 2016 / 2019 / 2022에만 적용됩니다.\"}],\"type\":\"p\",\"id\":\"BsZEB8En6wpiiLgYnrEUP\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"iHUOoe8HfH2lwn6m5qgHw\"},{\"children\":[{\"text\":\"작업 단계\"}],\"nodeId\":\".EC.9E.91.EC.97.85-.EB.8B.A8.EA.B3.84\",\"type\":\"h2\",\"id\":\"yJJQeGnbWkfR7VK28ibb2\"},{\"children\":[{\"text\":\"다운로드 및 설치\"}],\"nodeId\":\".EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C-.EB.B0.8F-.EC.84.A4.EC.B9.98\",\"type\":\"h3\",\"id\":\"YW8yLv7JejYoRNkw6eSWY\"},{\"children\":[{\"text\":\"본 문서에 제공된 예시에는 세 가지 유형의 소프트웨어가 포함됩니다. 시스템과 호환되는 소프트웨어 버전을 설치할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"fS7AlXK6NcTtP3bhWUWY0\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"GitHub\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/billziss-gh/winfsp/releases\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/billziss-gh/winfsp/releases\"},\"type\":\"ref\",\"id\":\"CNAta1wS_7IOCblu8uwVi\"},{\"text\":\"로 이동하여 Winfsp를 다운로드합니다.\\n예시로 winfsp-1.12.22301을 다운로드 합니다. 그 다음 기본 옵션으로 설치할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"ImNubt7eCOXAG7egrDsVp\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"NoZyyyJSQYBktsqAR0BSg\"},{\"children\":[{\"text\":\"Windows Server 2012 R2의 경우 Winfsp 1.12.22242는 호환되지 않지만 Winfsp 1.11.22176은 호환됩니다.\"}],\"type\":\"p\",\"id\":\"ccw3wwM3R-fXaMj3gF0h7\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\",\"id\":\"0QV5V0lv8tM3LQs1zQqsr\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"Git\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://gitforwindows.org/\",\"props\":{\"type\":\"link\",\"url\":\"https://gitforwindows.org/\"},\"type\":\"ref\",\"id\":\"E5-TNILNlhxNTAQtw2M9A\"},{\"text\":\" 또는 \"},{\"children\":[{\"text\":\"GitHub\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/git-for-windows/git/releases/\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/git-for-windows/git/releases/\"},\"type\":\"ref\",\"id\":\"uMPIfOYeB4Si5o9T1zQiQ\"},{\"text\":\"로 이동하여 Git을 다운로드합니다.\\nGit-2.38.1-64-bit는 예시로 다운로드 됩니다. 그런 다음 기본 옵션으로 설치할 수 있습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"Tl6vzGlbiUqZQU5ARurQV\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"Rclone\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://rclone.org/downloads/\",\"props\":{\"type\":\"link\",\"url\":\"https://rclone.org/downloads/\"},\"type\":\"ref\",\"id\":\"9XW1Q6yhYLSHaoAlB3cqm\"},{\"text\":\" 또는 \"},{\"children\":[{\"text\":\"GitHub\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/rclone/rclone/releases\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/rclone/rclone/releases\"},\"type\":\"ref\",\"id\":\"DLJbLiUUgCM53A2M5y-wd\"},{\"text\":\"에 접속하여 Rclone을 다운로드합니다.\\n예시로 rclone-v1.60.1-windows-amd64가 다운로드됩니다. 영어로 이름이 지정된 디렉터리에만 압축을 풀면 됩니다(한자가 포함된 경로로 압축을 풀면 오류가 발생할 수 있음). 이 예시에서 패키지는 E:\\\\AutoRclone으로 압축 해제됩니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"77Z8MulG8q4fi9N51WpPO\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"bEub6syPFY8_1fhel4fWa\"},{\"children\":[{\"text\":\" GitHub를 열 수 없거나 다운로드 속도가 느린 경우 다른 다운로드 방법을 찾을 수 있습니다.\"}],\"type\":\"p\",\"id\":\"WMminlSvDzsnUn1e4Q7b3\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"jYqok_rGhDEPpQ5oIlxrL\"},{\"children\":[{\"text\":\"Rclone 구성\"}],\"nodeId\":\"rclone-.EA.B5.AC.EC.84.B1\",\"type\":\"h3\",\"id\":\"et3-MW3TBjTPw9KMvcgiV\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"CF75LCj4cYuaW6ugGd8_L\"},{\"children\":[{\"text\":\"다음 구성 프로세스는 rclone-v1.60.1-windows-amd64를 예로 들어 설명합니다. 구성 프로세스는 버전에 따라 다를 수 있습니다.\"}],\"type\":\"p\",\"id\":\"FBOMrwKaH7cYoaHTkuZJT\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"Xb3LLud-kiq_grLFEDBpw\"},{\"children\":[{\"text\":\"폴더를 열고 왼쪽 탐색 창에서 \"},{\"b\":1,\"text\":\"이 PC\"},{\"text\":\"를 찾아 우클릭한 다음 \"},{\"b\":1,\"text\":\"속성 > 고급 시스템 설정 > 환경 변수 > 시스템 변수 > Path\"},{\"text\":\"를 선택합니다. \"},{\"b\":1,\"text\":\"생성\"},{\"text\":\"을 클릭합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"RXNQZJDl3R3b5UybwYOyC\"},{\"children\":[{\"text\":\"팝업 창에 Rclone이 압축 해제된 경로(E:\\\\AutoRclone)를 입력하고 \"},{\"b\":1,\"text\":\"확인\"},{\"text\":\"을 클릭합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"6eZi1mHKhiNumJE_qGnUZ\"},{\"children\":[{\"text\":\"Windows PowerShell을 열고 \"},{\"code\":1,\"text\":\"rclone --version\"},{\"text\":\" 명령을 실행하여 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 눌러 Rclone이 성공적으로 설치되었는지 확인합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"q2EC1wlw76nk__r_yuRdq\"},{\"children\":[{\"text\":\"Rclone 설치 확인 후 Windows PowerShell에서 \"},{\"code\":1,\"text\":\"rclone config\"},{\"text\":\" 명령을 입력하고 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 눌러 명령을 실행합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"wHrnCl1-vm6pxOzpN172Z\"},{\"children\":[{\"text\":\"Windows PowerShell에서 \"},{\"b\":1,\"text\":\"n\"},{\"text\":\"을 입력하고 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 눌러 New remote를 생성합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"btupcpl_87A3tx3wYHSXI\"},{\"children\":[{\"text\":\"Windows PowerShell에서 myCOS와 같은 해당 디스크의 이름을 입력하고 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 누릅니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"tGmQ6oDcry1gkMdr2X8cN\"},{\"children\":[{\"text\":\"표시되는 옵션에서 ‘Tencent COS’가 포함된 옵션을 선택(즉, \"},{\"b\":1,\"text\":\"5\"},{\"text\":\" 입력)한 다음 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 누릅니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7fdc03af292211efac39525400560de4.png\",\"id\":\"ePFcEX3natNYDuALW9oP9\",\"naturalSize\":[827,243],\"size\":[827,243]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"vZtIYuQJDLNoy9lqrvOHw\"},{\"children\":[{\"text\":\"표시되는 옵션에서 ‘TencentCOS’가 포함된 옵션(즉, \"},{\"b\":1,\"text\":\"21\"},{\"text\":\" 입력)을 선택한 다음 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 누릅니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7fdadd98292211efa45a5254008fe934.png\",\"id\":\"CWQVCC7kYv8F4b55P_X2c\",\"naturalSize\":[355,168],\"size\":[355,168]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"9Q7NjFi8pfYPk-qKi4gXw\"},{\"children\":[{\"code\":1,\"text\":\"env_auth>\"},{\"text\":\"가 표시되면 Enter를 누릅니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"8FjSJRU52QDxaVuaVBedU\"},{\"children\":[{\"code\":1,\"text\":\"access_key_id>\"},{\"text\":\"가 표시되면 COS의 SecretId를 입력하고 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 누릅니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"anJ_nPezWyQbXX_wCpUBL\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"GXv-ZEtyeVv7Vu2DeFiJD\"},{\"children\":[{\"text\":\" 여기서는 서브 계정 권한 사용을 권장합니다. \"},{\"children\":[{\"text\":\"API 키 관리\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cam/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/capi\"},\"type\":\"ref\",\"id\":\"x1p5txVx-AqJ_pcCE9ZDm\"},{\"text\":\"로 이동하여 SecretId와 SecretKey를 확인할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"yQ2iW7EdIXIYJRpiZEnpe\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\",\"id\":\"mYtHIk6xh8w-TC4EOh2us\"},{\"children\":[{\"code\":1,\"text\":\"secret_access_key>\"},{\"text\":\"가 표시되면 COS의 SecretKey를 입력하고 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 누릅니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"VC7b3Dgti1VZXkEpG5dmb\"},{\"children\":[{\"text\":\"표시되는 Tencent Cloud 리전의 게이트웨이 주소에 따라 버킷 리전을 선택합니다.\\n여기에서는 광저우 리전을 예로 사용합니다. 따라서 \"},{\"b\":1,\"text\":\"4\"},{\"text\":\"(\"},{\"code\":1,\"text\":\"cos.ap-guangzhou.myqcloud.com\"},{\"text\":\")를 입력한 후 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 누릅니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"kEDn5iDUC8ug4U0FRAIOR\"},{\"children\":[{\"text\":\"필요에 따라 객체 권한(예시: default, public-read 등)을 선택합니다. 이 권한은 나중에 업로드되는 객체에만 적용됩니다. 여기서는 default가 예로 사용됩니다. 따라서 \"},{\"b\":1,\"text\":\"1\"},{\"text\":\"을 입력한 다음 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 누릅니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7fdadf81292211efac39525400560de4.png\",\"id\":\"9PZd4q8q9Etfx-NBgPyEg\",\"naturalSize\":[598,306],\"size\":[598,306]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"cCe6pOW5SnYB1mhoO7ntG\"},{\"children\":[{\"text\":\"COS에 업로드된 객체의 스토리지 클래스를 선택합니다. 여기서는 Default가 예로 사용됩니다. 따라서 \"},{\"b\":1,\"text\":\"1\"},{\"text\":\"을 입력한 다음 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 누릅니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7fd920e4292211efac39525400560de4.png\",\"id\":\"V3yqQeMhQrYUI1Q0OjE50\",\"naturalSize\":[554,227],\"size\":[554,227]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"SX8rmLF-bPREgiH3MwONc\"},{\"children\":[{\"text\":\"Default: 기본값\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"ln302K2_nsqTB23wXTpSl\"},{\"children\":[{\"text\":\"Standard storage class: 스탠다드 스토리지(STANDARD)\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"bQslIjQtlDWEXz04jx3lC\"},{\"children\":[{\"text\":\"Archive storage mode: 아카이브 스토리지(ARCHIVE)\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"VTUSthOOc1h0JIlyOwpYu\"},{\"children\":[{\"text\":\"Infrequent access storage mode: 스탠다드IA 스토리지(STANDARD_IA)\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"fWTsTzn3juFZKrKDbI44v\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"at6YOGxpvWaMxv7wxYABi\"},{\"children\":[{\"text\":\"INTELLIGENT TIERING 또는 DEEP ARCHIVE 스토리지 클래스를 사용하려면 \"},{\"b\":1,\"text\":\"구성 파일 수정\"},{\"text\":\" 방법을 사용한 다음 storage_class 값을 INTELLIGENT_TIERING 또는 DEEP_ARCHIVE로 설정합니다. 스토리지 클래스에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"스토리지 유형 개요\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/30925\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/30925\"},\"type\":\"ref\",\"id\":\"4x1xOvoxlRGajAgZrLc30\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"Q1QwBaFZ6iPJnWRcuOhcp\"}],\"hintType\":\"info\",\"indent\":2,\"type\":\"hint\",\"id\":\"42B_EYCwjduASzMVS8UaR\"},{\"children\":[{\"code\":1,\"text\":\"Edit advanced config? (y/n)\"},{\"text\":\"이 표시되면 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 누릅니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"12s9u09ciirBsRG2uDJj4\"},{\"children\":[{\"text\":\"정보에 오류가 없는지 확인한 후 \"},{\"b\":1,\"text\":\"Enter\"},{\"text\":\"를 누릅니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"0tb8YU9IwzDoeALw7kr75\"},{\"children\":[{\"b\":1,\"text\":\"q\"},{\"text\":\"를 입력하여 구성을 완료합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7fdc0836292211ef8b7b52540096e81f.png\",\"id\":\"r9pb_skTwcHrEt1AJeGJS\",\"naturalSize\":[406,282],\"size\":[406,282]},{\"text\":\"\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"nNw_wLrD0t_CENcKh4ShL\"},{\"children\":[{\"text\":\"구성 파일 수정\"}],\"nodeId\":\".EA.B5.AC.EC.84.B1-.ED.8C.8C.EC.9D.BC-.EC.88.98.EC.A0.95\",\"type\":\"h3\",\"id\":\"89lPlV6HkAjzzXRbSdn2Z\"},{\"children\":[{\"text\":\"이전 구성이 완료되면 \"},{\"code\":1,\"text\":\"C:\\\\Users\\\\Username\\\\AppData\\\\Roaming\\\\rclone\"},{\"text\":\" 디렉터리에 rclone.conf라는 구성 파일이 생성됩니다. 파일을 직접 수정하여 rclone 구성을 업데이트할 수 있습니다. 파일을 찾을 수 없는 경우 명령줄 창에서 \"},{\"code\":1,\"text\":\"rclone config file\"},{\"text\":\" 명령을 실행하여 rclone 구성 파일을 볼 수 있습니다.\"}],\"type\":\"p\",\"id\":\"9vSi_I4Ctyq7XK7oA2Cwv\"},{\"children\":[{\"text\":\"COS를 로컬 드라이브로 마운트\"}],\"nodeId\":\"cos.EB.A5.BC-.EB.A1.9C.EC.BB.AC-.EB.93.9C.EB.9D.BC.EC.9D.B4.EB.B8.8C.EB.A1.9C-.EB.A7.88.EC.9A.B4.ED.8A.B8\",\"type\":\"h3\",\"id\":\"PFMdRyYREA3YztaLhN7sD\"},{\"children\":[{\"text\":\"설치된 Git Bash를 열고 명령 라인 툴에 실행 명령을 입력합니다. 여기에는 두 가지 사용 시나리오가 제공되며(둘 중 하나 선택), 실제 필요에 따라 둘 중 하나를 선택할 수 있습니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"wWleN-JSroJQOjRG73eGk\"},{\"type\":\"uli\",\"id\":\"juLFaNdJR_CjYv9qFVnRP\",\"children\":[{\"text\":\"LAN에서 COS를 공유 드라이브로 마운트하려면(권장) 다음 명령을 실행하십시오.\"}],\"indent\":1},{\"type\":\"code-block\",\"language\":\"plaintext\",\"children\":[{\"type\":\"code-line\",\"id\":\"aHNhQRFigKvv2NQRBdEjh\",\"children\":[{\"text\":\"rclone mount myCOS:/ Y: --fuse-flag --VolumePrefix=\\\\server\\\\share --cache-dir E:\\\\temp --vfs-cache-mode writes &\"}]}],\"id\":\"ZUM93eyP-NdOzDA4BSYrC\",\"autoWrap\":false,\"indent\":1},{\"type\":\"uli\",\"children\":[{\"text\":\"로컬 디스크로 매핑된 경우 다음과 같이 명령을 실행합니다:\"}],\"id\":\"1s8WsubPB3zRgUPwdkUFR\",\"indent\":1},{\"type\":\"code-block\",\"language\":\"plaintext\",\"children\":[{\"type\":\"code-line\",\"id\":\"BrnACiU0K6X-yno6xGBcF\",\"children\":[{\"text\":\"rclone mount myCOS:/ Y: --cache-dir E:\\\\temp --vfs-cache-mode writes &\"}]}],\"id\":\"_o8-INJ5e5lRc7jiGkFc2\",\"autoWrap\":false,\"indent\":1},{\"type\":\"uli\",\"children\":[{\"text\":\"myCOS: 사용자 정의 디스크 이름으로 변경합니다.\"}],\"id\":\"ooEUxNX5WZOiY7R8A8Q0A\",\"indent\":1},{\"type\":\"uli\",\"children\":[{\"text\":\"Y: 마운트할 디스크로 변경한 후 디스크의 드라이브 문자를 변경하면 됩니다. 로컬의 C, D, E 드라이브 등과 중복되지 않아야 합니다.\"}],\"id\":\"9bOSAey3YKz4UOZJ3FIGY\",\"indent\":1},{\"type\":\"uli\",\"children\":[{\"text\":\"E:\\\\temp: 필요에 따라 설정할 수 있는 로컬 캐시 디렉터리입니다. 디렉터리에 대한 권한이 있습니다.\"}],\"id\":\"ZcglT6Mlmq24pAQ3CztqO\",\"indent\":1},{\"type\":\"p\",\"children\":[{\"text\":\"\\\"The service rclone has been started\\\"가 안내되면 마운트가 성공적으로 완료되었음을 의미합니다.\"}],\"id\":\"Mn4rRgUrgy3uHZUc1yIrO\"},{\"children\":[{\"b\":1,\"text\":\"exit\"},{\"text\":\"를 입력하고 터미널을 종료합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"ol9zfhHh_AyJt5mmO4dmc\"},{\"children\":[{\"text\":\"로컬 컴퓨터의 \"},{\"b\":1,\"text\":\"내 PC\"},{\"text\":\"에서 myCOS(Y:)란 이름의 디스크를 찾을 수 있습니다.\\n해당 디스크를 열면 광저우 리전 전체에 속한 모든 버킷 이름을 조회할 수 있습니다. 이때 업로드, 다운로드, 생성, 삭제 등 로컬 디스크에서 자주 쓰는 작업을 진행할 수 있습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"PT1S0QoWf8kkRbWNh1GPx\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"wXURa6E6G2qlq0BPY3a_8\"},{\"children\":[{\"text\":\"작업 도중 오류가 발생하면 Git Bash 소프트웨어에서 상세 오류 정보를 확인하십시오.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"_3VlltQp_hKPXSmSTXwLv\"},{\"children\":[{\"text\":\"디스크를 마운트하는 도중 버킷에서 삭제 작업을 하면 버킷 내 파일 존재 여부와 상관없이 모두 삭제될 수 있으니 신중히 작업하시기 바랍니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"uBcjiol-3eoKsl3bkl9VP\"},{\"children\":[{\"text\":\"디스크를 마운트하는 도중 버킷 이름을 변경하는 경우 COS 버킷 이름이 변경될 수 있으니 신중히 작업하시기 바랍니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"Aw8cnJhy0VsXfDReGd2Nz\"}],\"hintType\":\"alert\",\"indent\":1,\"type\":\"hint\",\"id\":\"kdEgVCvgdTOtlFERZWnGR\"},{\"children\":[{\"text\":\"시작 시 자동으로 마운트된 드라이브 실행\"}],\"nodeId\":\".EC.8B.9C.EC.9E.91-.EC.8B.9C-.EC.9E.90.EB.8F.99.EC.9C.BC.EB.A1.9C-.EB.A7.88.EC.9A.B4.ED.8A.B8.EB.90.9C-.EB.93.9C.EB.9D.BC.EC.9D.B4.EB.B8.8C-.EC.8B.A4.ED.96.89\",\"type\":\"h3\",\"id\":\"EhmpvEnpPhJNHd_8aba6o\"},{\"children\":[{\"text\":\"마운트된 드라이브는 서버가 재시작되면 사라집니다. 따라서 다음 작업을 수행하여 시작 시 드라이브가 자동 실행되도록 설정할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"AEqXtyBZhqd9bHmE0036X\"},{\"children\":[{\"text\":\"E:\\\\AutoRclone 디렉터리에 startup_rclone.vbs 및 startup_rclone.bat 파일을 생성합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"PLNNCBU141efdKC0GMov9\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"BHXuxJi5dvtP3lAK9n-M7\"},{\"children\":[{\"text\":\" PowerShell을 통해 텍스트 파일을 생성할 때 올바른 인코딩을 사용하십시오. 그렇지 않으면 생성된 .bat 및 .vbs 파일을 실행할 수 없습니다.\"}],\"type\":\"p\",\"id\":\"jeL_PpwhoFhL00xm8nJaa\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\",\"id\":\"Osf5H9-3hFlqvLtBZ6A_S\"},{\"children\":[{\"text\":\"startup_rclone.bat에 다음 마운트 명령어를 입력합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"z4gZYX2L42LrUZnk7kEDq\"},{\"children\":[{\"text\":\"COS가 LAN에서 공유 드라이브로 마운트된 경우 다음 명령을 실행합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"CA8juzFmVHHeby9jZy2Le\"},{\"children\":[{\"children\":[{\"text\":\"rclone mount myCOS:/ Y: --fuse-flag --VolumePrefix=\\\\server\\\\share --cache-dir E:\\\\temp --vfs-cache-mode writes &\"}],\"type\":\"code-line\",\"id\":\"HvvG0RQBampaGHDdYGU9_\"}],\"indent\":2,\"language\":\"plaintext\",\"type\":\"code-block\",\"id\":\"x_jDJml4TRy6Mtr7YA8ya\",\"autoWrap\":false},{\"children\":[{\"text\":\"로컬 디스크로 매핑한 경우 다음 명령어를 입력합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"ZAhFqTy52AfJ96hJvzRHZ\"},{\"children\":[{\"children\":[{\"text\":\"rclone mount myCOS:/ Y: --cache-dir E:\\\\temp --vfs-cache-mode writes &\"}],\"type\":\"code-line\",\"id\":\"QR1N_X-mzzSJ0q2kRneOh\"}],\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"fp6zXSZ9fkP9939MAnNWm\",\"autoWrap\":false},{\"children\":[{\"text\":\"startup_rclone.vbs에 다음 코드를 입력합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"7JLW05q5fGyRigt-sJUsk\"},{\"children\":[{\"children\":[{\"text\":\"CreateObject(\\\"WScript.Shell\\\").Run \\\"cmd /c E:\\\\AutoRclone\\\\startup_rclone.bat\\\",0\"}],\"type\":\"code-line\",\"id\":\"aIxt1K7sIyx9aI1mQN8Fj\"}],\"indent\":1,\"language\":\"plaintext\",\"type\":\"code-block\",\"id\":\"M90goZRM2_e6m4zowD_wi\",\"autoWrap\":false},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"y5IzGS7ZrePE_5JiVmyNQ\"},{\"children\":[{\"text\":\" 코드 경로를 실행 경로로 수정하십시오.\"}],\"type\":\"p\",\"id\":\"S-QQqdF5OyI2-ABJcf6ey\"}],\"hintType\":\"alert\",\"indent\":1,\"type\":\"hint\",\"id\":\"NA9rFlbSUELix_M-n0bs8\"},{\"children\":[{\"text\":\"startup_rclone.vbs 파일을 잘라내 %USERPROFILE%\\\\AppData\\\\Roaming\\\\Microsoft\\\\Windows\\\\Start Menu\\\\Programs\\\\Startup 폴더에 붙여 넣습니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"g4leBigyGmfWUp8qa0BE2\"},{\"children\":[{\"text\":\"서버를 재시작합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"9mp4LwWyPRfaJTo9aC4Yd\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"i6XP2zKyk-19SsZJzXRpg\"},{\"children\":[{\"text\":\"일반적으로 자동 마운트 구성이 완료되고 서버가 다시 시작되면 마운트 성공 메시지가 수십 초 후에 표시됩니다.\"}],\"type\":\"p\",\"id\":\"Q_quwdRzIQfcyl_j75jby\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\",\"id\":\"lGRLBfKicxGnVmVlLC6uG\"},{\"children\":[{\"text\":\"관련 작업\"}],\"nodeId\":\".EA.B4.80.EB.A0.A8-.EC.9E.91.EC.97.85\",\"type\":\"h2\",\"id\":\"mfAMS0p9f9gq23Fljd1zt\"},{\"children\":[{\"text\":\"3rd party 상용화 유료 툴을 사용해 COS를 Windows 서버에 마운트한 후 로컬 디스크로 매핑할 수도 있습니다. 다음 작업은 TntDrive 툴 예시입니다.\"}],\"type\":\"p\",\"id\":\"3PtC5Ac5UgBZH5Wc1yOcv\"},{\"children\":[{\"text\":\"TntDrive를 다운로드 및 설치합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"Cb4z9LQ3JGLxek0U0bL_m\"},{\"children\":[{\"text\":\"TntDrive를 열고 \"},{\"b\":1,\"text\":\"Account > Add New Account\"},{\"text\":\"를 클릭해 계정을 생성합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7fd6e562292211ef8b7b52540096e81f.png\",\"id\":\"ZY_1xWCN0FZ3I3tPQejnI\",\"naturalSize\":[711,682],\"size\":[711,682]},{\"text\":\"\\n주요 매개변수 정보는 다음과 같습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"sXia8-_xMKOW5Urp1r-Rg\"},{\"children\":[{\"text\":\"Account Name: 사용자 정의 계정 이름\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"gJsbOi2THWNVE37lsr4wY\"},{\"children\":[{\"text\":\"Account Type: COS는 S3와 호환되므로, 여기서 \"},{\"b\":1,\"text\":\"Amazon S3 Compatible Storage\"},{\"text\":\"를 선택할 수 있습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"_9cVJjXri2A7bNv__GxCM\"},{\"children\":[{\"text\":\"REST Endpoint: 버킷이 위치한 리전을 입력합니다. 예를 들어, 버킷이 광저우 리전에 있다면 \"},{\"text\":\"cos.ap-guangzhou.myqcloud.com\",\"code\":1},{\"text\":\"을 입력합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"VHryb9PjWiRrMD9fYLnHq\"},{\"type\":\"hint\",\"hintType\":\"info\",\"children\":[{\"type\":\"p\",\"children\":[{\"text\":\"주의\",\"b\":1},{\"b\":1,\"text\":\":\",\"color\":\"inherit\"}],\"id\":\"_WAFeOQuraY9fERg_tmbH\"},{\"type\":\"p\",\"id\":\"SXI3cpPQA5sfJCl9ygguy\",\"children\":[{\"text\":\"2024년 1월 1일 이후에 생성된 버킷은 경로 스타일 도메인 이름(형식: \"},{\"text\":\"cos..myqcloud.com\",\"code\":1},{\"text\":\") 사용을 지원하지 않습니다. 자세한 내용은 \"},{\"id\":\"9Ue1Fu0mqYs2XtjIwKJ5u\",\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/57456\"},\"children\":[{\"text\":\"COS 버킷 도메인 이름 보안 관리 공지(2024년 1월 시행)\"}]},{\"text\":\"를 참조하십시오.\"}]}],\"id\":\"0qbTqSy-orqgkE3_wwmqA\",\"indent\":2},{\"children\":[{\"text\":\"Access Key ID: SecretId를 입력합니다. \"},{\"children\":[{\"text\":\"API 키 관리\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/capi\"},\"type\":\"ref\",\"id\":\"XjgWcoXYc5MxqkmFTWZIl\"},{\"text\":\" 페이지에서 생성 및 획득할 수 있습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"uRwKXNJfPLzCsB4uQtcqj\"},{\"children\":[{\"text\":\"Secret Access Key: SecretKey를 입력합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"a5sPpjSOw1gQuOvhB0sOa\"},{\"children\":[{\"b\":1,\"text\":\"Add new account\"},{\"text\":\"를 클릭합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"fLOjSyIdwiiOGI4DscMeI\"},{\"children\":[{\"text\":\"TntDrive 인터페이스에서 \"},{\"b\":1,\"text\":\"Add New Mapped Drives\"},{\"text\":\"를 클릭해 Mapped Drives를 생성합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7fdaac83292211ef9aab5254004556a0.png\",\"id\":\"pCPpKhlQCBT6u5-sQTrRt\",\"naturalSize\":[673,446],\"size\":[673,446]},{\"text\":\"\\n주요 매개변수 정보는 다음과 같습니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"FopQ_66ZF9WVFIa6KoI_l\"},{\"children\":[{\"text\":\"Amazon S3 Bucket: 버킷 경로를 입력하거나 버킷 이름을 선택합니다. 우측 버튼을 클릭해 버킷을 선택할 수 있습니다. 2단계에서 설정한 광저우 리전의 버킷이 표시되며, 버킷 1개당 1개의 디스크가 독립적으로 매핑됩니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"RxWzpOY9che66hwpb1sbP\"},{\"children\":[{\"text\":\"Mapped drive letter: 디스크의 드라이브 문자를 설정합니다. 로컬의 C, D, E 드라이브 등과 중복되지 않아야 합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"DkJufcY1scD6WVxsXrCOL\"},{\"children\":[{\"text\":\"위의 정보를 확인하고 \"},{\"b\":1,\"text\":\"Add new drive\"},{\"text\":\"를 클릭합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"vBUrrYjPIaInkM1QJeMXD\"},{\"children\":[{\"text\":\"로컬 컴퓨터의 \"},{\"b\":1,\"text\":\"내 PC\"},{\"text\":\"에서 드라이브를 찾습니다. 모든 버킷을 Windows 서버에 매핑하려면 위의 단계를 반복합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"aUDbGql5gL50gahPOR9QY\"},{\"children\":[{\"text\":\"마운트 실패 원인\"}],\"type\":\"h2\",\"id\":\"1oAfN1F2G2awYrwVPywCT\",\"nodeId\":\"df7bcca9-ecd9-495c-adf2-f3bdbcb5e186\"},{\"children\":[{\"text\":\"다음 매개변수가 올바르게 구성되었는지 확인하세요:\"}],\"type\":\"oli\",\"id\":\"mI07pKgj8Dg2xWXqChA2-\"},{\"children\":[{\"text\":\"SecretId와 SecretKey가 올바르게 입력되었는지 확인합니다.\"}],\"type\":\"uli\",\"id\":\"EjutW19kUft96_uZ7-CD4\"},{\"children\":[{\"text\":\"Option Storage를 선택할 때 반드시 TencentCOS를 선택해야 합니다.\"}],\"type\":\"uli\",\"id\":\"Bh7lJJDxMHJ4AMXkmASDs\"},{\"type\":\"image\",\"alt\":\"\",\"inline\":false,\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/25f5ba6a831a11f0854e5254001c06ec.png\",\"children\":[{\"text\":\"\"}],\"id\":\"e1Wq8KpXuB1NVHxIl6z_N\",\"naturalSize\":[827,243],\"size\":[827,243],\"indent\":1},{\"type\":\"image\",\"alt\":\"\",\"inline\":false,\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/2e5cf8b5831a11f0a8ae5254005ef0f7.png\",\"children\":[{\"text\":\"\"}],\"id\":\"WP58W30nfRQJLlwSU-8mv\",\"naturalSize\":[355,168],\"size\":[355,168],\"indent\":1},{\"children\":[{\"text\":\"오류가 있는 경우 매개변수를 수정한 후 서버를 재부팅하여 다시 마운트합니다.\"}],\"type\":\"oli\",\"id\":\"pc8Kztz3Gfdb9VzrQHKmS\"},{\"children\":[{\"text\":\"비관리자 내장 관리자 계정을 사용하여 마운트 작업을 수행하는 경우 드라이브 문자나 디렉토리가 보이지 않는 문제가 발생할 수 있습니다. 비관리자 계정을 사용해야 하는 경우, Windows UAC 기능을 신중하게 비활성화하고 재부팅이 필요합니다. Windows UAC 기능을 비활성화하는 명령은 다음과 같습니다:\"}],\"type\":\"oli\",\"id\":\"B4XjqIzs7YJ3V_wnxZ-m5\"},{\"children\":[{\"children\":[{\"text\":\"reg add \\\"HKLM\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\\\\\\\" /v EnableLUA /t REG_DWORD /d 0 /f\"}],\"type\":\"code-line\",\"id\":\"DpWBErlcszXJvndKoX__H\"}],\"type\":\"code-block\",\"language\":\"java\",\"indent\":1,\"id\":\"sHd4cczkM-2H1YX6syFEN\",\"autoWrap\":false,\"executionContext\":{}},{\"indent\":0,\"type\":\"p\",\"id\":\"NT6NreqmQlyCsnFIOoegq\",\"children\":[{\"text\":\"\"}]}]"}},"43860":{"categoryId":436,"weight":60,"type":"page","extension":"","pid":32966,"id":43860,"lang":"ko","title":"COS 정적 웹 사이트 기능을 사용하여 프런트엔드 단일 페이지 애플리케이션 구축","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2022-02-14 18:51:56","recentReleaseTime":"2022-02-14 18:51:56","content":{"title":"COS 정적 웹 사이트 기능을 사용하여 프런트엔드 단일 페이지 애플리케이션 구축","body":"

단일 페이지 애플리케이션이란 무엇입니까?

단일 페이지 애플리케이션(single-page application, SPA)은 서버에서 전체 새 페이지를 다시 로딩하는 기존 방법 대신 현재 페이지를 동적으로 다시 작성하여 사용자와 상호 작용하는 웹 애플리케이션 또는 웹 사이트의 모델입니다. 이 접근 방식은 페이지 사이를 전환하여 사용자 경험이 중단되는 것을 방지하고 애플리케이션을 데스크톱 애플리케이션처럼 만들어 줍니다. SPA에서 필요한 모든 코드(HTML, JavaScript 및 CSS)는 단일 페이지 로딩으로 검색되거나 일반적으로 사용자 작업에 대한 응답으로 필요에 따라 적절한 리소스가 동적으로 로딩되고 페이지에 추가됩니다.
현재 프런트 엔드 개발 분야에서 일반적인 SPA 개발 프레임워크에는 React, Vue 및 Angular가 포함됩니다.
본문은 두 가지 인기 있는 프레임워크를 사용하여 **Tencent Cloud의 Cloud Object Storage(COS)**에서 제공하는 정적 웹 사이트 기능을 사용하여 온라인에서 사용 가능한 SPA를 빠르게 구축하는 방법을 설명하고 몇 가지 일반적인 문제에 대한 솔루션을 제공합니다.

준비 작업

1. Node.js 환경을 설치합니다.
2. Tencent Cloud 계정 가입 및 실명 인증을 완료하여 Tencent Cloud COS 콘솔에 정상적으로 로그인할 수 있도록 합니다.
3. 버킷을 생성합니다(테스트를 용이하게 하려면 버킷 권한을 공개 읽기/비공개 쓰기로 설정).

프런트 엔드 코드 작성

주의:
이미 코드를 직접 구현했다면 버킷 정적 웹 사이트 설정 활성화 단계로 건너뛰십시오.

Vue를 사용하여 단일 페이지 애플리케이션 빠르게 구축

1. 다음 명령어를 실행하여 vue-cli를 설치합니다.
npm install -g @vue/cli
2. vue-cli에서 다음 명령을 실행하여 vue 프로젝트를 빠르게 생성합니다. 자세한 내용은 공식 문서를 참고하십시오.
vue create vue-spa
3. 다음 명령어를 실행하여 프로젝트 루트 디렉터리에 vue-router를 설치합니다.
npm install vue-router -S (Vue2.x)
또는
npm install vue-router@4 -S (Vue3.x)
4. 프로젝트에서 main.js 및 App.vue 파일을 수정합니다.\nmain.js는 아래 이미지와 같습니다:\n
\"\"

\n주로 아래 이미지와 같이 App.vue 컴포넌트의 template을 수정합니다.\n
\"\"


설명:
본문에서는 일부 키 코드만 소개합니다. 전체 코드는 여기를 클릭하여 다운로드할 수 있습니다.
5. 코드 수정 후 다음 명령어를 실행하여 로컬 미리보기를 실행합니다.
npm run serve
6. 디버깅 및 미리보기에 오류 없음을 확인한 후, 다음 명령어를 실행하여 프로덕션 환경 코드를 패키징 합니다.
npm run build
이 때 프로젝트 루트 디렉터리에 dist 디렉터리가 생성되며 Vue 프로그램 코드가 준비됩니다.

React를 사용하여 단일 페이지 애플리케이션을 빠르게 구축

1. 다음 명령어를 실행하여 create-react-app을 설치합니다.
npm install -g create-react-app
2. create-react-app을 사용하여 react 프로젝트를 빠르게 생성합니다. 공식 홈페이지 문서를 참고하십시오.
3. 다음 명령어를 실행하여 프로젝트 루트 디렉터리에 react-router-dom을 설치합니다.
npm install react-router-dom -S
4. 프로젝트에서 App.js 파일을 수정합니다.\n
\"\"

</br>
설명:
본문에서는 일부 키 코드만 소개합니다. 전체 코드는 여기를 클릭하여 다운로드할 수 있습니다.
5. 코드 수정 후 다음 명령어를 실행하여 로컬 미리보기를 실행합니다.
npm run start
6. 디버깅 및 미리보기에 오류 없음을 확인한 후, 다음 명령어를 실행하여 프로덕션 환경 코드를 패키징 합니다.
npm run build
이 때 프로젝트 루트 디렉터리에 build 디렉터리가 생성되며 React 프로그램 코드가 준비됩니다.

버킷 정적 웹 사이트 설정 활성화

1. 생성된 버킷의 세부 정보 페이지로 이동하여 기본 구성 > 정적 웹 사이트를 선택합니다.
2. 정적 웹 사이트 관리 페이지에서 아래 이미지를 참고하여 설정합니다. 자세한 작업은 정적 웹 사이트 설정을 참고하십시오.

COS에 배포

1. 이전에 설정되어 있던 정적 웹 사이트의 버킷을 찾아서 파일 리스트 페이지로 들어갑니다.
2. 컴파일 디렉터리(Vue 기본값: dist 디렉터리, react 기본값: build 디렉터리)의 모든 파일을 버킷의 루트 디렉터리에 업로드합니다. 자세한 작업은 객체 업로드를 참고하십시오.
3. 버킷의 정적 웹 사이트 도메인(아래 이미지의 액세스 노드)에 액세스합니다.
배포된 애플리케이션의 메인 페이지를 볼 수 있습니다. 다음은 Vue 애플리케이션 예시입니다.\n
\"\"

\n4. 라우팅(Home, Foo, Bar)을 전환하고 페이지를 새로고침하여 예상에 부합하는지 확인합니다(즉, 라우팅에서 새로고침할 때 404 오류가 발생하지 않음).

FAQ

정적 웹사이트의 기본 도메인 이름을 사용하고 싶지 않으면 어떻게 하나요? 내 도메인 이름을 사용할 수 있나요?

상기 기본 정적 웹사이트 엔드포인트 외에도 COS를 사용하면 사용자 정의 CDN 가속 도메인 이름과 사용자 정의 엔드포인트를 설정할 수 있습니다. 구성 세부 정보는 도메인 관리 개요를 참고하십시오. 구성에 성공하면 원하는 도메인 이름을 사용하여 애플리케이션에 액세스할 수 있습니다.
CDN 가속 도메인 이름 구성을 선택한 경우 노드 캐시 유효성 구성을 참고하여 업데이트된 데이터를 얻으십시오.

애플리케이션 배포 후 라우팅 전환 시 렌더링이 성공적이지만 페이지 새로고침 시 404 오류 발생 원인이 무엇인가요?

가능한 원인은 정적 웹 사이트를 설정할 때 설정이 누락되었거나 오류 문서가 잘못 설정되었기 때문일 수 있습니다. 본문 시작 부분의 표준 설정 스크린샷에서 오류 문서와 인덱스 문서 모두 index.html 로 설정되어 있는 것을 확인할 수 있습니다.
단일 페이지 애플리케이션의 특성으로 인해 후속 라우팅을 위한 일련의 내부 로직을 트리거 하려면 어떤 상황에서도 애플리케이션 게이트(일반적으로 'index.html')에 성공적으로 액세스할 수 있는지 확인해야 합니다.

라우팅 전환 후 페이지가 정상적으로 표시되지만 HTTP 상태 코드는 여전히 404입니다. 어떻게 해야 정상적으로 200이 반환됩니까?

원인은 정적 웹 사이트를 설정할 때 설정 오류 문서 응답 코드가 부족하기 때문입니다. 본문 시작 부분의 표준 설정 스크린샷을 참고하여 200으로 설정하면 해결됩니다.

오류 문서 설정 후 오류 액세스 경로에 여전히 404 기능을 표시하려면 어떻게 처리해야 하나요?

프런트 엔드 코드에서 404 로직을 구현하는 것을 추천합니다. 라우팅 설정 하단에 하위 수준에 일치하는 규칙을 설정하고 이전의 모든 규칙이 일치하지 않을 때 404 컴포넌트가 렌더링됩니다. 컴포넌트 콘텐츠는 필요에 따라 설계 및 구현할 수 있습니다. 자세한 내용은 본문에서 제공하는 코드 demo의 라우팅 설정의 마지막 설정을 참고하십시오.

페이지 액세스 시 403 Access Denied 오류가 발생하는 이유는 무엇입니까?

버킷의 권한이 개인 읽기/쓰기로 설정되어 있을 수 있습니다. 공개 읽기/개인 쓰기로 수정하여 해결할 수 있습니다.
또한 CDN 가속 도메인을 사용하여 개인 읽기/쓰기 버킷에 액세스하는 경우 Origin-pull 인증 설정도 활성화해야 CDN에 COS 리소스 액세스 권한이 부여됩니다.
","recentReleaseTime":"2025-11-04 15:37:02","slate":"[{\"children\":[{\"text\":\"단일 페이지 애플리케이션이란 무엇입니까?\"}],\"nodeId\":\".EB.8B.A8.EC.9D.BC-.ED.8E.98.EC.9D.B4.EC.A7.80-.EC.95.A0.ED.94.8C.EB.A6.AC.EC.BC.80.EC.9D.B4.EC.85.98.EC.9D.B4.EB.9E.80-.EB.AC.B4.EC.97.87.EC.9E.85.EB.8B.88.EA.B9.8C.3F\",\"type\":\"h2\",\"id\":\"-nXyeT7koZkemWC025fTB\"},{\"children\":[{\"text\":\"단일 페이지 애플리케이션(single-page application, SPA)은 서버에서 전체 새 페이지를 다시 로딩하는 기존 방법 대신 현재 페이지를 동적으로 다시 작성하여 사용자와 상호 작용하는 웹 애플리케이션 또는 웹 사이트의 모델입니다. 이 접근 방식은 페이지 사이를 전환하여 사용자 경험이 중단되는 것을 방지하고 애플리케이션을 데스크톱 애플리케이션처럼 만들어 줍니다. SPA에서 필요한 모든 코드(HTML, JavaScript 및 CSS)는 단일 페이지 로딩으로 검색되거나 일반적으로 사용자 작업에 대한 응답으로 필요에 따라 적절한 리소스가 동적으로 로딩되고 페이지에 추가됩니다.\"}],\"type\":\"p\",\"id\":\"c1D3MSUFmQAuRfrbKvm3p\"},{\"children\":[{\"text\":\"현재 프런트 엔드 개발 분야에서 일반적인 SPA 개발 프레임워크에는 React, Vue 및 Angular가 포함됩니다.\"}],\"type\":\"p\",\"id\":\"f80-dbKBJSNmM-TbZoqtV\"},{\"children\":[{\"text\":\"본문은 두 가지 인기 있는 프레임워크를 사용하여 **Tencent Cloud의 Cloud Object Storage(COS)**에서 제공하는 \"},{\"b\":1,\"text\":\"정적 웹 사이트\"},{\"text\":\" 기능을 사용하여 온라인에서 사용 가능한 SPA를 빠르게 구축하는 방법을 설명하고 몇 가지 일반적인 문제에 대한 솔루션을 제공합니다.\"}],\"type\":\"p\",\"id\":\"7jBVpXNq8ZUCgA4zlCoxm\"},{\"children\":[{\"text\":\"준비 작업\"}],\"nodeId\":\".EC.A4.80.EB.B9.84-.EC.9E.91.EC.97.85\",\"type\":\"h2\",\"id\":\"om4_HzriZQXYtHuOjoXUw\"},{\"children\":[{\"text\":\"Node.js 환경을 설치합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"5sEtOxNnC4LRvtgdFiP_3\"},{\"children\":[{\"text\":\"Tencent Cloud 계정 가입 및 실명 인증을 완료하여 \"},{\"children\":[{\"text\":\"Tencent Cloud COS 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\",\"id\":\"6MUVcvVK9qCgr9yUwabVd\"},{\"text\":\"에 정상적으로 로그인할 수 있도록 합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"6N3uN8HXp2S6HhIionb0d\"},{\"children\":[{\"text\":\"버킷을 생성합니다(테스트를 용이하게 하려면 버킷 권한을 \"},{\"b\":1,\"text\":\"공개 읽기/비공개 쓰기\"},{\"text\":\"로 설정).\"}],\"start\":false,\"type\":\"oli\",\"id\":\"_jzgQC8YGXEPa7u93YJCW\"},{\"children\":[{\"text\":\"프런트 엔드 코드 작성\"}],\"nodeId\":\".ED.94.84.EB.9F.B0.ED.8A.B8-.EC.97.94.EB.93.9C-.EC.BD.94.EB.93.9C-.EC.9E.91.EC.84.B1\",\"type\":\"h2\",\"id\":\"wEPd2lgfd-OT7xqFY0EX0\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"cacQG5Ga-bOQnZVQ-1vZm\"},{\"children\":[{\"text\":\" 이미 코드를 직접 구현했다면 \"},{\"children\":[{\"text\":\"버킷 정적 웹 사이트 설정 활성화\"}],\"linkTarget\":\"self\",\"linkTitle\":\"#configuration\",\"props\":{\"type\":\"link\",\"url\":\"#configuration\"},\"type\":\"ref\",\"id\":\"2s5iEw_G0ic8WjdubYpGw\"},{\"text\":\" 단계로 건너뛰십시오.\"}],\"type\":\"p\",\"id\":\"GD19hLOqhYOp_PlhYjx4c\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"6YdA-snMULSLZjEtSQB1L\"},{\"children\":[{\"text\":\"Vue를 사용하여 단일 페이지 애플리케이션 빠르게 구축\"}],\"nodeId\":\"vue.EB.A5.BC-.EC.82.AC.EC.9A.A9.ED.95.98.EC.97.AC-.EB.8B.A8.EC.9D.BC-.ED.8E.98.EC.9D.B4.EC.A7.80-.EC.95.A0.ED.94.8C.EB.A6.AC.EC.BC.80.EC.9D.B4.EC.85.98-.EB.B9.A0.EB.A5.B4.EA.B2.8C-.EA.B5.AC.EC.B6.95\",\"type\":\"h3\",\"id\":\"jIgXolH2e1j0BhqllvAlw\"},{\"children\":[{\"text\":\"다음 명령어를 실행하여 vue-cli를 설치합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"olp3wBmAblvLuBita8DJ9\"},{\"children\":[{\"children\":[{\"text\":\"npm install -g @vue/cli\"}],\"type\":\"code-line\",\"id\":\"j6DrE7s92dnVjCYOT_-9P\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"ruDho7RkSAxNjUI2meUB_\",\"autoWrap\":false},{\"children\":[{\"text\":\"vue-cli에서 다음 명령을 실행하여 vue 프로젝트를 빠르게 생성합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"공식 문서\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create\",\"props\":{\"type\":\"link\",\"url\":\"https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create\"},\"type\":\"ref\",\"id\":\"ahjRSHs96HLKtj5bUI3ou\"},{\"text\":\"를 참고하십시오.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"OCw2MP6-7BTApqc9E8XOF\"},{\"children\":[{\"children\":[{\"text\":\"vue create vue-spa\"}],\"type\":\"code-line\",\"id\":\"qalo12gCoLaBNPI_Z1ZCX\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"W-YPgFdkwE2LhXxVXuBnq\",\"autoWrap\":false},{\"children\":[{\"text\":\"다음 명령어를 실행하여 프로젝트 루트 디렉터리에 vue-router를 설치합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"BHW197pvGfEjD2COY0mw9\"},{\"children\":[{\"children\":[{\"text\":\"npm install vue-router -S (Vue2.x)\"}],\"type\":\"code-line\",\"id\":\"YEl6riOCbvxamVRwOB1hN\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"RPpgkc8zlqe04yF9f0aQz\",\"autoWrap\":false},{\"children\":[{\"text\":\" 또는 \"}],\"indent\":1,\"type\":\"p\",\"id\":\"tJRAtQ4Xs3UbeRv_ErKOv\"},{\"children\":[{\"children\":[{\"text\":\"npm install vue-router@4 -S (Vue3.x)\"}],\"type\":\"code-line\",\"id\":\"rclFqASxR2jW5luUYgF_S\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"xQp-QE5twbr8dyKj68biX\",\"autoWrap\":false},{\"children\":[{\"text\":\"프로젝트에서 main.js 및 App.vue 파일을 수정합니다.\\nmain.js는 아래 이미지와 같습니다:\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/8aa4dbeb292111ef812f5254002a8f58.png\",\"id\":\"DcMlS1y_vkaHuwHNUutep\",\"naturalSize\":[1064,965],\"size\":[473,428]},{\"text\":\"\\n주로 아래 이미지와 같이 App.vue 컴포넌트의 template을 수정합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/97e9a82a292111efac39525400560de4.png\",\"id\":\"ajQ2zyjnl1kRyT46ALbT8\",\"naturalSize\":[910,755],\"size\":[468,388]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"qBzl4LPfcUH11xXb2QzdV\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"WuGK0b4LR6kW3LKSUAuY6\"},{\"children\":[{\"text\":\" 본문에서는 일부 키 코드만 소개합니다. 전체 코드는 \"},{\"children\":[{\"text\":\"여기를 클릭\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://cos-code-demo-1253960454.cos.ap-shanghai.myqcloud.com/vue-spa.zip\",\"props\":{\"type\":\"link\",\"url\":\"https://cos-code-demo-1253960454.cos.ap-shanghai.myqcloud.com/vue-spa.zip\"},\"type\":\"ref\",\"id\":\"HDdot9VWP4TwewK6yoZPH\"},{\"text\":\"하여 다운로드할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"17P7KDD1wj-2-V87exVcD\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\",\"id\":\"UWwrofb6TPljBYFy39g9B\"},{\"children\":[{\"text\":\"코드 수정 후 다음 명령어를 실행하여 로컬 미리보기를 실행합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"ERttt7ZuaEh24IKcWt0H6\"},{\"children\":[{\"children\":[{\"text\":\"npm run serve\"}],\"type\":\"code-line\",\"id\":\"eCfXgUW5uQe2cHsHTH-kX\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"-Dd8RkjABMw8EmPZkCPyq\",\"autoWrap\":false},{\"children\":[{\"text\":\"디버깅 및 미리보기에 오류 없음을 확인한 후, 다음 명령어를 실행하여 프로덕션 환경 코드를 패키징 합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"AzTcDOj2bYTPwrbC8Pc4e\"},{\"children\":[{\"children\":[{\"text\":\"npm run build\"}],\"type\":\"code-line\",\"id\":\"5MU9tPrSANs4ckHDY59Ss\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"AbcBGoiyh_2CeTEerII_T\",\"autoWrap\":false},{\"children\":[{\"text\":\"이 때 프로젝트 루트 디렉터리에 dist 디렉터리가 생성되며 Vue 프로그램 코드가 준비됩니다.\"}],\"indent\":1,\"type\":\"p\",\"id\":\"Ff4-QKS1aV73D7HdhPggO\"},{\"children\":[{\"text\":\"React를 사용하여 단일 페이지 애플리케이션을 빠르게 구축\"}],\"nodeId\":\"react.EB.A5.BC-.EC.82.AC.EC.9A.A9.ED.95.98.EC.97.AC-.EB.8B.A8.EC.9D.BC-.ED.8E.98.EC.9D.B4.EC.A7.80-.EC.95.A0.ED.94.8C.EB.A6.AC.EC.BC.80.EC.9D.B4.EC.85.98.EC.9D.84-.EB.B9.A0.EB.A5.B4.EA.B2.8C-.EA.B5.AC.EC.B6.95\",\"type\":\"h3\",\"id\":\"SOr2zB99zmvGkjN1YJ884\"},{\"children\":[{\"text\":\"다음 명령어를 실행하여 create-react-app을 설치합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"7mH5whpVVB-XZtoBvdbqT\"},{\"children\":[{\"children\":[{\"text\":\"npm install -g create-react-app\"}],\"type\":\"code-line\",\"id\":\"gooj31YXyy0q50LAoBm80\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"gj187Xnxcd1AvmZ9Wvepb\",\"autoWrap\":false},{\"children\":[{\"text\":\"create-react-app을 사용하여 react 프로젝트를 빠르게 생성합니다. \"},{\"children\":[{\"text\":\"공식 홈페이지 문서\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://create-react-app.dev/docs/getting-started\",\"props\":{\"type\":\"link\",\"url\":\"https://create-react-app.dev/docs/getting-started\"},\"type\":\"ref\",\"id\":\"OxEEZPN38ZbaNsPd9zE_e\"},{\"text\":\"를 참고하십시오.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"si9pfn129-5-SqfzyfGdU\"},{\"children\":[{\"text\":\"다음 명령어를 실행하여 프로젝트 루트 디렉터리에 react-router-dom을 설치합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"cl5cRj24kP_wy6rM4eVF7\"},{\"children\":[{\"children\":[{\"text\":\"npm install react-router-dom -S\"}],\"type\":\"code-line\",\"id\":\"EooxrjxasPvyE5AIqlB-X\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"wgXcZlXgE9KURP7FZlnXP\",\"autoWrap\":false},{\"children\":[{\"text\":\"프로젝트에서 App.js 파일을 수정합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/8aa5f810292111ef9dd5525400441de3.png\",\"id\":\"UtTpm-ZBFJEqiwZNnbKvv\",\"naturalSize\":[1399,1867],\"size\":[514,685]},{\"color\":\"red\",\"text\":\"
\"}],\"start\":false,\"type\":\"oli\",\"id\":\"8CQiXJNa0vFwVtAHTzheQ\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"Un4BJdaU2N7jNZ4Pon_Xl\"},{\"children\":[{\"text\":\" 본문에서는 일부 키 코드만 소개합니다. 전체 코드는 \"},{\"children\":[{\"text\":\"여기를 클릭\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://cos-code-demo-1253960454.cos.ap-shanghai.myqcloud.com/react-spa.zip\",\"props\":{\"type\":\"link\",\"url\":\"https://cos-code-demo-1253960454.cos.ap-shanghai.myqcloud.com/react-spa.zip\"},\"type\":\"ref\",\"id\":\"LqDqo-74sZYSzq2Sw2H-N\"},{\"text\":\"하여 다운로드할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"5wiZhVim4kikDiAl6XMo_\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\",\"id\":\"Q09kDG1WTd4GthVguK_Yo\"},{\"children\":[{\"text\":\"코드 수정 후 다음 명령어를 실행하여 로컬 미리보기를 실행합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"N_jBY6voyArUx6XgZZ2Ey\"},{\"children\":[{\"children\":[{\"text\":\"npm run start\"}],\"type\":\"code-line\",\"id\":\"91HIoXluI_ka8IrLa8RZL\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"QeUBKAH1Nkp6Ft2-IioCr\",\"autoWrap\":false},{\"children\":[{\"text\":\"디버깅 및 미리보기에 오류 없음을 확인한 후, 다음 명령어를 실행하여 프로덕션 환경 코드를 패키징 합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"-YfavZjm06ZqMHCMPaAYl\"},{\"children\":[{\"children\":[{\"text\":\"npm run build\"}],\"type\":\"code-line\",\"id\":\"SinsXqANvi8Zk_HQeQOeq\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\",\"id\":\"4E9f8_6vh_z5S8MVl50nU\",\"autoWrap\":false},{\"children\":[{\"text\":\"이 때 프로젝트 루트 디렉터리에 build 디렉터리가 생성되며 React 프로그램 코드가 준비됩니다.\"}],\"indent\":1,\"type\":\"p\",\"id\":\"udOGtVzEQnGERyn-qeC6Y\"},{\"children\":[{\"text\":\"버킷 정적 웹 사이트 설정 활성화\"}],\"nodeId\":\"configuration\",\"type\":\"h2\",\"id\":\"rSyfo9QVVyinX4oxPmeQ8\"},{\"children\":[{\"text\":\"생성된 버킷의 세부 정보 페이지로 이동하여 \"},{\"b\":1,\"text\":\"기본 구성\"},{\"text\":\" > \"},{\"b\":1,\"text\":\"정적 웹 사이트\"},{\"text\":\"를 선택합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"HFb7uY_GuEgn7olhwr1bS\"},{\"children\":[{\"text\":\"정적 웹 사이트 관리 페이지에서 아래 이미지를 참고하여 설정합니다. 자세한 작업은 \"},{\"children\":[{\"text\":\"정적 웹 사이트 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/14984\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/14984\"},\"type\":\"ref\",\"id\":\"R-pterIhCfqPLjabN4bAg\"},{\"text\":\"을 참고하십시오.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"IoP5y4ZfMnSYouXpJzuVe\"},{\"children\":[{\"text\":\"COS에 배포\"}],\"nodeId\":\"cos.EC.97.90-.EB.B0.B0.ED.8F.AC\",\"type\":\"h2\",\"id\":\"q2WUEhsrlCInmDa2QucY-\"},{\"children\":[{\"text\":\"이전에 설정되어 있던 정적 웹 사이트의 버킷을 찾아서 파일 리스트 페이지로 들어갑니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"imcPxC4p998SfPnkLKs0o\"},{\"children\":[{\"text\":\"컴파일 디렉터리(Vue 기본값: dist 디렉터리, react 기본값: build 디렉터리)의 모든 파일을 버킷의 루트 디렉터리에 업로드합니다. 자세한 작업은 \"},{\"children\":[{\"text\":\"객체 업로드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13321\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13321\"},\"type\":\"ref\",\"id\":\"oFZ6hf1AHuvm0TqskveOG\"},{\"text\":\"를 참고하십시오.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"5FKZeCyG0mA3Q2wgl1xlC\"},{\"children\":[{\"text\":\"버킷의 정적 웹 사이트 도메인(아래 이미지의 액세스 노드)에 액세스합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"H_ejXz2ULVKPtbfjdXE9b\"},{\"children\":[{\"text\":\"배포된 애플리케이션의 메인 페이지를 볼 수 있습니다. 다음은 Vue 애플리케이션 예시입니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/8a8efdc2292111ef94525254005f7176.png\",\"id\":\"BuTlC-04H4lsxKz1o-KYb\",\"naturalSize\":[1762,832],\"size\":[605,285]},{\"text\":\"\\n4. 라우팅(Home, Foo, Bar)을 전환하고 페이지를 새로고침하여 예상에 부합하는지 확인합니다(즉, 라우팅에서 새로고침할 때 404 오류가 발생하지 않음).\"}],\"type\":\"p\",\"id\":\"T8qdCQ0ANtpZ4ZUxJyuzf\"},{\"children\":[{\"text\":\"FAQ\"}],\"nodeId\":\"faq\",\"type\":\"h2\",\"id\":\"oVkdOXBlbOsAgKSUPioeH\"},{\"children\":[{\"text\":\"정적 웹사이트의 기본 도메인 이름을 사용하고 싶지 않으면 어떻게 하나요? 내 도메인 이름을 사용할 수 있나요?\"}],\"nodeId\":\".EC.A0.95.EC.A0.81-.EC.9B.B9.EC.82.AC.EC.9D.B4.ED.8A.B8.EC.9D.98-.EA.B8.B0.EB.B3.B8-.EB.8F.84.EB.A9.94.EC.9D.B8-.EC.9D.B4.EB.A6.84.EC.9D.84-.EC.82.AC.EC.9A.A9.ED.95.98.EA.B3.A0-.EC.8B.B6.EC.A7.80-.EC.95.8A.EC.9C.BC.EB.A9.B4-.EC.96.B4.EB.96.BB.EA.B2.8C-.ED.95.98.EB.82.98.EC.9A.94.3F-.EB.82.B4-.EB.8F.84.EB.A9.94.EC.9D.B8-.EC.9D.B4.EB.A6.84.EC.9D.84-.EC.82.AC.EC.9A.A9.ED.95.A0-.EC.88.98-.EC.9E.88.EB.82.98.EC.9A.94.3F\",\"type\":\"h3\",\"id\":\"Q-m4QrFRPRitxe-L1-vZZ\"},{\"children\":[{\"text\":\"상기 기본 정적 웹사이트 엔드포인트 외에도 COS를 사용하면 사용자 정의 CDN 가속 도메인 이름과 사용자 정의 엔드포인트를 설정할 수 있습니다. 구성 세부 정보는 \"},{\"children\":[{\"text\":\"도메인 관리 개요\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/18424\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/18424\"},\"type\":\"ref\",\"id\":\"09AtzYVfpAt5d8qaqwB_Y\"},{\"text\":\"를 참고하십시오. 구성에 성공하면 원하는 도메인 이름을 사용하여 애플리케이션에 액세스할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"SLnuQe4Ew73QitOjqUnkP\"},{\"children\":[{\"text\":\"CDN 가속 도메인 이름 구성을 선택한 경우 \"},{\"children\":[{\"text\":\"노드 캐시 유효성 구성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/228/38424\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/228/38424\"},\"type\":\"ref\",\"id\":\"C10IetMYvof9Vrv4etkJ3\"},{\"text\":\"을 참고하여 업데이트된 데이터를 얻으십시오.\"}],\"type\":\"p\",\"id\":\"u_gPMUA9A5REFT3awLJz9\"},{\"children\":[{\"text\":\"애플리케이션 배포 후 라우팅 전환 시 렌더링이 성공적이지만 페이지 새로고침 시 404 오류 발생 원인이 무엇인가요?\"}],\"nodeId\":\".EC.95.A0.ED.94.8C.EB.A6.AC.EC.BC.80.EC.9D.B4.EC.85.98-.EB.B0.B0.ED.8F.AC-.ED.9B.84-.EB.9D.BC.EC.9A.B0.ED.8C.85-.EC.A0.84.ED.99.98-.EC.8B.9C-.EB.A0.8C.EB.8D.94.EB.A7.81.EC.9D.B4-.EC.84.B1.EA.B3.B5.EC.A0.81.EC.9D.B4.EC.A7.80.EB.A7.8C-.ED.8E.98.EC.9D.B4.EC.A7.80-.EC.83.88.EB.A1.9C.EA.B3.A0.EC.B9.A8-.EC.8B.9C-404-.EC.98.A4.EB.A5.98-.EB.B0.9C.EC.83.9D-.EC.9B.90.EC.9D.B8.EC.9D.B4-.EB.AC.B4.EC.97.87.EC.9D.B8.EA.B0.80.EC.9A.94.3F\",\"type\":\"h3\",\"id\":\"LdK4AYEoGx-aAsseR285T\"},{\"children\":[{\"text\":\"가능한 원인은 정적 웹 사이트를 설정할 때 설정이 누락되었거나 \"},{\"b\":1,\"text\":\"오류 문서\"},{\"text\":\"가 잘못 설정되었기 때문일 수 있습니다. 본문 시작 부분의 표준 설정 스크린샷에서 오류 문서와 인덱스 문서 모두 \"},{\"code\":1,\"text\":\"index.html\"},{\"text\":\" 로 설정되어 있는 것을 확인할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"R7eO0Czb3DnKJ5-986PFi\"},{\"children\":[{\"text\":\"단일 페이지 애플리케이션의 특성으로 인해 후속 라우팅을 위한 일련의 내부 로직을 트리거 하려면 어떤 상황에서도 애플리케이션 게이트(일반적으로 'index.html')에 성공적으로 액세스할 수 있는지 확인해야 합니다.\"}],\"type\":\"p\",\"id\":\"9p9cKIw6I9IaFEP0mH7Or\"},{\"children\":[{\"text\":\"라우팅 전환 후 페이지가 정상적으로 표시되지만 HTTP 상태 코드는 여전히 404입니다. 어떻게 해야 정상적으로 200이 반환됩니까?\"}],\"nodeId\":\".EB.9D.BC.EC.9A.B0.ED.8C.85-.EC.A0.84.ED.99.98-.ED.9B.84-.ED.8E.98.EC.9D.B4.EC.A7.80.EA.B0.80-.EC.A0.95.EC.83.81.EC.A0.81.EC.9C.BC.EB.A1.9C-.ED.91.9C.EC.8B.9C.EB.90.98.EC.A7.80.EB.A7.8C-http-.EC.83.81.ED.83.9C-.EC.BD.94.EB.93.9C.EB.8A.94-.EC.97.AC.EC.A0.84.ED.9E.88-404.EC.9E.85.EB.8B.88.EB.8B.A4.-.EC.96.B4.EB.96.BB.EA.B2.8C-.ED.95.B4.EC.95.BC-.EC.A0.95.EC.83.81.EC.A0.81.EC.9C.BC.EB.A1.9C-200.EC.9D.B4-.EB.B0.98.ED.99.98.EB.90.A9.EB.8B.88.EA.B9.8C.3F\",\"type\":\"h3\",\"id\":\"vfZs5cj1NBvnHTzvwAazK\"},{\"children\":[{\"text\":\"원인은 정적 웹 사이트를 설정할 때 설정 \"},{\"b\":1,\"text\":\"오류 문서 응답 코드\"},{\"text\":\"가 부족하기 때문입니다. 본문 시작 부분의 표준 설정 스크린샷을 참고하여 200으로 설정하면 해결됩니다.\"}],\"type\":\"p\",\"id\":\"4Ikknz2XMI4Q_E9aW2nMi\"},{\"children\":[{\"text\":\"오류 문서 설정 후 오류 액세스 경로에 여전히 404 기능을 표시하려면 어떻게 처리해야 하나요?\"}],\"nodeId\":\".EC.98.A4.EB.A5.98-.EB.AC.B8.EC.84.9C-.EC.84.A4.EC.A0.95-.ED.9B.84-.EC.98.A4.EB.A5.98-.EC.95.A1.EC.84.B8.EC.8A.A4-.EA.B2.BD.EB.A1.9C.EC.97.90-.EC.97.AC.EC.A0.84.ED.9E.88-404-.EA.B8.B0.EB.8A.A5.EC.9D.84-.ED.91.9C.EC.8B.9C.ED.95.98.EB.A0.A4.EB.A9.B4-.EC.96.B4.EB.96.BB.EA.B2.8C-.EC.B2.98.EB.A6.AC.ED.95.B4.EC.95.BC-.ED.95.98.EB.82.98.EC.9A.94.3F\",\"type\":\"h3\",\"id\":\"5fgTHylbIY-UcF7FzDPDQ\"},{\"children\":[{\"text\":\"프런트 엔드 코드에서 404 로직을 구현하는 것을 추천합니다. 라우팅 설정 하단에 하위 수준에 일치하는 규칙을 설정하고 이전의 모든 규칙이 일치하지 않을 때 404 컴포넌트가 렌더링됩니다. 컴포넌트 콘텐츠는 필요에 따라 설계 및 구현할 수 있습니다. 자세한 내용은 본문에서 제공하는 코드 demo의 라우팅 설정의 마지막 설정을 참고하십시오.\"}],\"type\":\"p\",\"id\":\"xNtjztGF9M6kY0PNVUpzE\"},{\"children\":[{\"text\":\"페이지 액세스 시 403 Access Denied 오류가 발생하는 이유는 무엇입니까?\"}],\"nodeId\":\".ED.8E.98.EC.9D.B4.EC.A7.80-.EC.95.A1.EC.84.B8.EC.8A.A4-.EC.8B.9C-403-access-denied-.EC.98.A4.EB.A5.98.EA.B0.80-.EB.B0.9C.EC.83.9D.ED.95.98.EB.8A.94-.EC.9D.B4.EC.9C.A0.EB.8A.94-.EB.AC.B4.EC.97.87.EC.9E.85.EB.8B.88.EA.B9.8C.3F\",\"type\":\"h3\",\"id\":\"ETwVv3-cXejETi9OnSCyG\"},{\"children\":[{\"text\":\"버킷의 권한이 \"},{\"b\":1,\"text\":\"개인 읽기/쓰기\"},{\"text\":\"로 설정되어 있을 수 있습니다. \"},{\"b\":1,\"text\":\"공개 읽기/개인 쓰기\"},{\"text\":\"로 수정하여 해결할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"hnJhTW15EbujXtEBP1niy\"},{\"children\":[{\"text\":\"또한 CDN 가속 도메인을 사용하여 \"},{\"b\":1,\"text\":\"개인 읽기/쓰기\"},{\"text\":\" 버킷에 액세스하는 경우 \"},{\"b\":1,\"text\":\"Origin-pull 인증\"},{\"text\":\" 설정도 활성화해야 CDN에 COS 리소스 액세스 권한이 부여됩니다.\"}],\"type\":\"p\",\"id\":\"L0VcMwxted1yo8lxG1Yy0\"}]"}},"46206":{"categoryId":436,"weight":40,"type":"page","extension":"","pid":12473,"id":46206,"lang":"ko","title":"조건 키 설명 및 사용 예시","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2022-05-05 22:28:22","recentReleaseTime":"2022-05-05 22:28:22","content":{"title":"조건 키 설명 및 사용 예시","body":"
액세스 정책을 사용하여 권한을 부여할 때 정책 조건을 지정할 수 있습니다. 예를 들어 정책 조건을 사용하여 업로드할 파일의 스토리지 클래스와 사용자 액세스 소스를 제한할 수 있습니다.
이 문서는 버킷 정책에서 COS(Cloud Object Storage) 조건 키를 사용하는 일반적인 예시를 제공합니다. 조건 문서에서 COS 및 해당 요청이 지원하는 모든 조건 키를 볼 수 있습니다.
설명:
버킷 정책을 작성 시 조건 키를 사용할 때 최소 권한 원칙을 준수하고, 해당 조건 키를 해당 요청(action)에만 추가하며, 작업 지정(action) 시 “*” 와일드카드를 사용하지 마십시오. 와일드카드를 사용하면 요청이 실패합니다. 조건 키에 대한 자세한 내용은 조건 문서를 참고하십시오.
액세스 관리(CAM) 콘솔을 사용하여 정책을 생성할 때, version, principal, statement, effect, action, resource, condition 구문 요소는 모두 소문자로 작성해야 합니다.

사용자 액세스 IP 제한(qcs:ip)

조건 키 qcs:ip

조건 키 qcs:ip를 사용하여 사용자 액세스 IP를 제한할 수 있습니다. 조건 키는 모든 요청에 적용할 수 있습니다.

예시: 지정 IP의 사용자의 액세스만 허용

다음은 ID가 100000000001(APPID는 1250000000)인 루트 계정에 속하는 ID가 100000000002인 서브 계정이 베이징 리전의 버킷 examplebucket-bj와 광저우 리전의 버킷 examplebucket-gz의 객체 exampleobject에 대해, 액세스 IP가 IP 범위 192.168.1.0/24에 속하거나 액세스가 IP가 101.226.100.185 또는 101.226.100.186 대역인 경우 객체 업로드 및 객체 다운로드 권한을 부여하는 정책 예시입니다.
{
"version": "2.0",
"principal": {
"qcs": [
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"statement": [
{
"effect": "allow",
"action": [
"name/cos:PutObject",
"name/cos:GetObject"
],
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-bj-1250000000/*",
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-gz-1250000000/exampleobject"
],
"condition": {
"ip_equal": {
"qcs:ip": [
"192.168.1.0/24",
"101.226.100.185",
"101.226.100.186"
]
}
}
}
]
}

객체의 최신 버전 또는 지정 버전(cos:versionid) 액세스만 허용

요청 매개변수 versionid

요청 매개변수 versionid는 객체의 버전 번호를 지정합니다. 버전 관리에 대한 자세한 내용은 버전 제어 개요를 참고하십시오. 객체를 다운로드(GetObject)하거나 객체를 삭제할 때(DeleteObject) 요청 매개변수 versionid를 사용하여 작업할 객체 버전을 지정할 수 있습니다. versionid에는 세 가지 다른 경우가 있습니다.
versionid가 없음: 요청은 기본적으로 최신 버전의 객체에 적용됩니다.
versionid가 빈 문자열인 경우: versionid 요청 매개변수가 전달되지 않은 경우와 동일합니다.
versionid"null"인 경우: 버킷에 대해 버전 관리가 활성화되기 전에 업로드된 객체의 경우 버전 관리가 활성화된 후 버전 번호가 "null" 문자열이 됩니다.

조건 키 cos:versionid

조건 키 cos:versionid를 사용하여 요청 매개변수 versionid를 제한할 수 있습니다.

예시1: 사용자가 지정된 버전의 객체를 가져오도록 허용

examplebucket-1250000000 버킷을 소유하는 uin 100000000001의 루트 계정이 다음 버킷 정책을 사용하여 uin이 100000000000인 서브 계정이 지정된 버전의 객체만 가져오도록 허용한다고 가정합니다.
정책에 따르면 uin이 100000000002인 서브 계정으로 전송된 객체 다운로드 요청은 versionid 매개변수를 전달하고 versionid 값이 버전 번호 ‘MTg0NDUxNTc1NjIzMTQ1MDAwODg’인 경우에만 성공할 수 있습니다.
{
"version":"2.0",
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"name/cos:GetObject"
],
"condition":{
"string_equal":{
"cos:versionid":"MTg0NDUxNTc1NjIzMTQ1MDAwODg"
}
},
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
]
}
]
}

거부 정책 추가

상기 정책을 사용하여 서브 계정에게 권한을 부여하고 서브 계정이 다른 수단을 통해 조건을 부여하지 않고 동일한 권한을 얻는 경우 더 광범위한 권한 부여 정책이 적용됩니다. 예를 들어 서브 계정이 사용자 그룹에 있고 루트 계정이 아무런 조건 없이 사용자 그룹에 GetObject 권한을 부여하면 상기 정책의 버전 번호에 대한 제한이 적용되지 않습니다.
이에 대처하기 위해 위의 정책을 기반으로 명시적 거부 정책(deny)을 추가하여 더 엄격한 권한 제한을 달성할 수 있습니다. 다음 deny 정책은 서브 사용자가 versionid 매개변수를 포함하지 않는 객체 다운로드 요청을 시작하거나 versionid에 의해 지정된 버전 번호가 ‘MTg0NDUxNTc1NjIzMTQ1MDAwODg’가 아닌 경우 요청이 거부되도록 지정합니다. deny 정책의 우선 순위가 다른 정책보다 높기 때문에 거부 정책을 추가하면 권한 취약성을 최대한 방지할 수 있습니다.
{
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"name/cos:GetObject"
],
"condition":{
"string_equal":{
"cos:versionid":"MTg0NDUxNTc1NjIzMTQ1MDAwODg"
}
},
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
]
},
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"deny",
"action":[
"name/cos:GetObject"
],
"condition":{
"string_not_equal_if_exist":{
"cos:versionid":"MTg0NDUxNTc1NjIzMTQ1MDAwODg"
}
},
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
]
}
],
"version":"2.0"
}

예시2: 사용자가 최신 버전의 객체만 가져올 수 있도록 허용

버킷 examplebucket-1250000000을 소유하는 uin 100000000001의 루트 계정이 다음 버킷 정책을 사용하여 uin이 100000000002인 서브 계정이 최신 버전의 객체만 가져오도록 허용한다고 가정합니다.
정책에 따라 versionid가 전달되지 않거나 해당 값이 빈 문자열인 경우 GetObject 요청은 기본적으로 최신 버전의 객체를 다운로드합니다. 따라서 다음 조건에서 string_equal_if_exist를 사용할 수 있습니다.
1. versionid가 전달되지 않으면 기본적으로 조건이 충족된 것으로 간주(true)되어 allow 정책이 적용되어 요청이 allow됩니다.
2. versionid가 빈 문자열(“”)인 경우 allow 정책도 적용되며 최신 버전의 객체 다운로드 요청만 승인됩니다.
"condition":{
"string_equal_if_exist": {
"cos:versionid": ""
}
}
명시적 거부 정책이 추가된 후 전체 버킷 정책은 다음과 같습니다.
{
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"name/cos:GetObject"
],
"condition":{
"string_equal_if_exist":{
"cos:versionid":""
}
},
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
]
},
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"deny",
"action":[
"name/cos:GetObject"
],
"condition":{
"string_not_equal":{
"cos:versionid":""
}
},
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
]
}
],
"version":"2.0"
}

예시3: 버전 관리 활성화 전 업로드된 객체를 사용자가 삭제하는 것을 허용하지 않음

버전 관리가 활성화되기 전에 버킷에 업로드된 일부 객체가 있을 수 있으며 이러한 객체의 버전 번호는 버전 관리가 활성화된 후에 "null"이 됩니다. 경우에 따라 이러한 객체에 대한 추가 보호를 활성화해야 할 수 있습니다. 예를 들어 사용자가 이러한 객체를 영구적으로 삭제하지 못하도록 하는 것, 즉 버전 번호가 있는 객체의 삭제를 거부하는 것입니다.
아래 예시에는 두 가지 버킷 정책이 있습니다.
1. 서브 계정에 DeleteObject 요청을 사용하여 버킷의 객체를 삭제할 수 있는 권한을 부여합니다.
2. DeleteObject 요청에 대한 조건을 제한합니다. DeleteObject 요청이 값이 "null"인 요청 매개변수 versionid를 전달하면 요청이 거부됩니다.
따라서 버전 관리가 활성화되기 전에 객체 A가 버킷 examplebucket-1250000000에 업로드된 경우 버전 관리가 활성화된 후 객체 A의 버전 번호는 "null" 문자열이 됩니다.
버킷 정책이 추가되면 객체 A가 보호됩니다. 서브 사용자가 객체 A를 삭제하기 위해 시작한 DeleteObject 요청에 버전 번호가 없으면 버전 관리가 활성화되어 있기 때문에 객체 A가 영구적으로 삭제되지 않습니다. 대신 객체 A에 대한 삭제 표시가 추가됩니다. 요청에 객체 A의 "null" 버전 번호가 포함되어 있으면 요청이 거부되고 객체 A는 영구적으로 삭제되지 않습니다.
{
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"name/cos:DeleteObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
]
},
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"deny",
"action":[
"name/cos:DeleteObject"
],
"condition":{
"string_equal":{
"cos:versionid":"null"
}
},
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
]
}
],
"version":"2.0"
}

업로드 파일 크기 제한(cos:content-length)

요청 헤더 Content-Length

RFC 2616에 정의된 바이트 단위의 HTTP 요청 콘텐츠 길이는 PUT 및 POST 요청에서 자주 사용됩니다. 자세한 내용은 Common Request Headers를 참고하십시오.

조건 키 cos:content-length

객체를 업로드할 때 조건 키 cos:content-length를 사용하여 요청 헤더 Content-Length를 제한하고 업로드할 객체의 파일 크기를 제한할 수 있습니다. 이러한 방식으로 저장 공간을 유연하게 관리하고 너무 크거나 작은 파일을 업로드하여 저장 공간과 네트워크 대역폭을 낭비하지 않도록 할 수 있습니다.
아래 두 예시에서는 루트 계정(uin: 100000000001)이 버킷 examplebucket-1250000000을 소유하고 있다고 가정하며, cos:content-length 조건 키를 사용하여 서브 계정(uin: 100000000002)에서 업로드한 요청의 Content-Length 헤더 값을 제한할 수 있습니다.

예시1: 요청 헤더 Content-Length의 최대값 제한

PutObject 및 PostObject 업로드 요청이 10 바이트 이하의 값을 가진 Content-Length 헤더를 전달해야 한다고 제한합니다.
{
"version":"2.0",
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"name/cos:PutObject",
"name/cos:PostObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"numeric_less_than_equal":{
"cos:content-length":10
}
}
},
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"deny",
"action":[
"name/cos:PutObject",
"name/cos:PostObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"numeric_greater_than_if_exist":{
"cos:content-length":10
}
}
}
]
}

예시2: 요청 헤더 Content-Length의 최소값 제한

PutObject 및 PostObject 업로드 요청이 2 바이트 이상의 값을 가진 Content-Length 헤더를 전달해야 한다고 제한합니다.
{
"version":"2.0",
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"name/cos:PutObject",
"name/cos:PostObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"numeric_greater_than_equal":{
"cos:content-length":2
}
}
},
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"deny",
"action":[
"name/cos:PutObject",
"name/cos:PostObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"numeric_less_than_if_exist":{
"cos:content-length":2
}
}
}
]
}

업로드할 파일 형식 제한(cos:content-type)

요청 헤더 Content-Type

Content-Type은 application/xmlimage/jpeg와 같이 RFC 2616(MIME)에 정의된 HTTP 요청 콘텐츠 유형이어야 합니다. 자세한 내용은 Common Request Headers를 참고하십시오.

조건 키 cos:content-type

조건 키 cos:content-type을 사용하여 요청 헤더 Content-Type을 제한할 수 있습니다.

예시: PutObject 요청의 Content-Type을 "image/jpeg"로 제한

버킷 examplebucket-1250000000을 소유하는 uin이 100000000001인 루트 계정이 cos:content-type 조건 키를 사용하여 uin이 100000000002인 서브 계정이 시작한 업로드 요청에서 Content-Type 헤더의 콘텐츠를 제한한다고 가정합니다.
이 예시의 버킷 정책은 객체 업로드 요청(PutObject)이 Content-Type 헤더와 ‘image/jpeg’ 값을 포함해야 하는 것을 제한하는 것입니다.
string_equal은 요청이 지정된 값과 정확히 동일한 값을 가진 Content-Type 헤더를 전달해야 함을 요구합니다. 실제 요청에서는 요청의 Content-Type 헤더를 명시적으로 지정해야 합니다. 그렇지 않고 요청에 Content-Type 헤더가 없으면 요청이 실패합니다. 또한 특정 도구를 사용하여 요청을 시작하고 Content-Type을 명시적으로 지정하지 않으면 도구에서 예기치 않은 Content-Type 헤더를 요청에 자동으로 추가할 수 있으며 요청도 실패할 수 있습니다.
또한 대소문자를 구분하지 않는 조건 연산자인 string_equal_ignore_casestring_not_equal_ignore_case의 사용을 권장합니다. 그 이유는 string_equal 또는 string_not_equal을 사용할 경우, text/html 형식의 파일 업로드를 제한하려 할 때 text/Html, tExt/html 등 대소문자가 혼합된 Content-Type은 엄격히 차단되지 못하기 때문입니다. 대소문자를 무시하는 연산자를 사용하면 이러한 경우까지 철저히 차단할 수 있습니다. 조건 연산자에 대한 자세한 내용은 조건 연산자를 참고하십시오.
{
"version":"2.0",
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"name/cos:PutObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"string_equal_ignore_case":{
"cos:content-type":"image/jpeg"
}
}
},
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"deny",
"action":[
"name/cos:PutObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"string_not_equal_ignore_case_if_exist":{
"cos:content-type":"image/jpeg"
}
}
}
]
}

다운로드 요청에서 반환되는 파일 형식 제한(cos:response-content-type)

요청 매개변수 response-content-type

GetObject API를 사용하면 요청 매개변수인 response-content-type을 추가하여 응답의 Content-Type 헤더 값을 지정할 수 있습니다.

조건 키 cos:response-content-type

cos:response-content-type 조건 키를 사용하여 요청이 요청 매개변수인 response-content-type을 전달해야 하는지 여부를 지정할 수 있습니다.

예시: GetObject 요청 매개변수 response-content-type을 ‘image/jpeg’로 제한

버킷 examplebucket-1250000000을 소유하고 uin이 100000000001인 루트 계정이 다음 버킷 정책을 사용하여 uin이 100000000002인 서브 사용자가 시작한 GetObject 요청이 “image/jpeg” 값과 함께 response-content-type 요청 매개변수를 전달해야 한다고 가정합니다. response-content-type 매개변수는 요청 매개변수이며 요청이 시작될 때 urlencode가 필요합니다(urlencode된 값: response-content-type=image%2Fjpeg). 따라서 Policy를 설정할 때 "image/jpeg"도 인코딩(urlencode)해야 하며 "image%2Fjpeg"를 입력해야 합니다.
{
"version":"2.0",
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"name/cos:GetObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"string_equal":{
"cos:response-content-type":"image%2Fjpeg"
}
}
},
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"deny",
"action":[
"name/cos:GetObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"string_not_equal_if_exist":{
"cos:response-content-type":"image%2Fjpeg"
}
}
}
]
}

HTTPS 요청만 허용(cos:secure-transport)

조건 키 cos:secure-transport

조건 키 cos:secure-transport를 사용하여 HTTPS 프로토콜 사용 요청 제한

예시1: HTTPS를 사용하도록 다운로드 요청 제한

버킷 examplebucket-1250000000을 소유하고 uin이 100000000001인 루트 계정이 다음 버킷 정책을 사용하여 uin이 100000000002인 서브 계정에서 보낸 HTTPS 기반 GetObject 요청만 허용한다고 가정합니다.
{
"version":"2.0",
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"name/cos:GetObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"bool_equal":{
"cos:secure-transport":"true"
}
}
}
]
}

예시2: 비 HTTPS 요청 거부

버킷 examplebucket-1250000000을 소유하고 uin이 100000000001인 루트 계정이 다음 버킷 정책을 사용하여 uin이 1000000000002인 서브 계정에서 보낸 비 HTTPS 요청을 거부한다고 가정합니다.
{
"version":"2.0",
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"deny",
"action":[
"*"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"bool_equal":{
"cos:secure-transport":"false"
}
}
}
]
}

지정된 스토리지 클래스 설정 허용(cos:x-cos-storage-class)

요청 헤더 x-cos-storage-class

요청 헤더 x-cos-storage-class를 사용하여 객체를 업로드할 때 객체의 스토리지 클래스를 지정하거나 수정할 수 있습니다.

조건 키 cos:x-cos-storage-class

조건 키 cos:x-cos-storage-class를 사용하여 요청 헤더 x-cos-storage-class를 제한하여 스토리지 클래스 수정 요청을 제한할 수 있습니다.
COS의 스토리지 클래스 필드에는 STANDARD, MAZ_STANDARD, STANDARD_IA, MAZ_STANDARD_IA, INTELLIGENT_TIERING, MAZ_INTELLIGENT_TIERING, ARCHIVE 및 DEEP_ARCHIVE가 있습니다.

예시: PutObject 요청 시 스토리지 클래스를 반드시 STANDARD로 설정

버킷 examplebucket-1250000000을 소유하는 uin이 100000000001인 루트 계정이 다음 버킷 정책을 사용하여 값이 STANDARD인 x-cos-storage-class 헤더를 전달하기 위해 uin이 100000000002인 서브 계정에서 보낸 PutObject 요청을 제한한다고 가정합니다.
{
"version":"2.0",
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"name/cos:PutObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"string_equal":{
"cos:x-cos-storage-class":"STANDARD"
}
}
},
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"deny",
"action":[
"name/cos:PutObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"string_not_equal_if_exist":{
"cos:x-cos-storage-class":"STANDARD"
}
}
}
]
}

지정된 버킷/객체 ACL 설정 허용(cos:x-cos-acl)

요청 헤더 x-cos-acl

객체를 업로드하거나 버킷을 생성할 때 요청 헤더 x-cos-acl을 사용하여 ACL을 지정하거나 객체 또는 버킷 ACL을 수정할 수 있습니다. ACL에 대한 자세한 내용은 ACL을 참고하십시오.
버킷용 사전 설정 ACL: private, public-read, public-read-write, authenticated-read.
객체에 대한 사전 설정 ACL: default, private, public-read, authenticated-read, bucket-owner-read, bucket-owner-full-control.

조건 키 cos:x-cos-acl

조건 키 cos:x-cos-acl을 사용하여 요청 헤더 x-cos-acl을 제한하고 객체/버킷 ACL 수정 요청을 제한할 수 있습니다.

예시: PutObject 요청에서 객체 ACL을 비공개로 설정 필요

examplebucket-1250000000 버킷을 소유하는 uin 100000000001의 루트 계정이 다음 버킷 정책을 사용하여 uin이 100000000002인 서브 계정을 제한하여 프라이빗 객체만 업로드한다고 가정합니다. 정책은 모든 PutObject 요청이 private 값을 가진 x-cos-acl 헤더를 전달하도록 요구합니다.
{
"version":"2.0",
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"name/cos:PutObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"string_equal":{
"cos:x-cos-acl":"private"
}
}
},
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"deny",
"action":[
"name/cos:PutObject"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"string_not_equal_if_exist":{
"cos:x-cos-acl":"private"
}
}
}
]
}

지정된 디렉터리에서만 객체 나열 허용(cos:prefix)

조건 키 cos:prefix

조건 키 cos:prefix를 사용하여 요청 매개변수 prefix를 제한할 수 있습니다.
주의:
prefix 값에 중국어 및 /와 같은 특수 문자가 포함된 경우 버킷 정책에 쓰기 전에 값을 인코딩(urlencode)해야 합니다.

예시: 버킷의 지정된 디렉터리에 있는 객체만 나열 허용

버킷 examplebucket-1250000000을 소유하는 uin이 100000000001인 루트 계정이 다음 버킷 정책을 사용하여 버킷의 folder1 디렉터리에 있는 객체만 나열하도록 uin이 100000000002인 서브 계정을 제한한다고 가정합니다. 다음 버킷 정책은 서브 사용자가 GetBucket 요청을 할 때 반드시 prefix 매개변수를 포함해야 하며, 그 값은 folder1/여야 함을 규정합니다. prefix 값에 특수 문자 /가 포함되어 있으므로, 정책을 작성하기 전에 해당 값을 urlencode 처리해야 하며, 따라서 정책 구문에서는 folder1%2F로 표현됩니다.
{
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"name/cos:GetBucket"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"string_equal":{
"cos:prefix":"folder1%2F"
}
}
},
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"deny",
"action":[
"name/cos:GetBucket"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"string_not_equal_if_exist":{
"cos:prefix":"folder1%2F"
}
}
}
],
"version":"2.0"
}

지정된 버전의 TLS 프로토콜만 사용 허용(cos:tls-version)

조건 키 cos:tls-version

조건 키 cos:tls-version을 사용하여 HTTPS 요청의 TLS 버전을 제한할 수 있습니다. 해당 값은 Numric 유형이며 1.0, 1.1 또는 1.2와 같은 부동 소수점을 지원합니다.

예시1: TLS v1.2를 사용하는 HTTP 요청만 승인

요청 시나리오
예상 결과
TLS v1.0을 사용한 HTTPS 요청
403, 실패
TLS v1.2를 사용한 HTTPS 요청
200, 성공
정책 예시는 다음과 같습니다.
{
"version":"2.0",
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"*"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"numeric_equal":{
"cos:tls-version":1.2
}
}
}
]
}

예시2: v1.2 이전의 TLS를 사용하는 HTTP 요청 거부

요청 시나리오
예상 결과
TLS v1.0을 사용한 HTTPS 요청
403, 실패
TLS v1.2를 사용한 HTTPS 요청
200, 성공
정책 예시는 다음과 같습니다.
{
"version":"2.0",
"statement":[
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"allow",
"action":[
"*"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"numeric_greater_than_equal":{
"cos:tls-version":1.2
}
}
},
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect":"deny",
"action":[
"*"
],
"resource":[
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition":{
"numeric_less_than_if_exist":{
"cos:tls-version":1.2
}
}
}
]
}

버킷 생성 시 지정된 버킷 태그 강제 설정(qcs:request_tag)

설명:\nrequest_tag 조건 키는 PutBucket 및 PutBucketTagging 작업에만 적용되며 GetService, PutObject 또는 PutObjectTagging에는 적용되지 않습니다.

조건 키 qcs:request_tag

조건 키 qcs:request_tag를 사용하여 PutBucket 또는 PutBucketTagging 요청을 시작할 때 사용자가 지정된 버킷 태그를 포함하도록 제한할 수 있습니다.

예시: 사용자가 버킷을 생성할 때 지정된 버킷 태그를 포함하도록 제한

많은 사용자가 버킷 태그를 사용하여 버킷을 관리할 수 있습니다. 다음 정책 예시는 사용자가 버킷 생성 시 지정된 버킷 태그 <a,b><c,d>를 설정한 후에만 권한을 얻을 수 있음을 나타냅니다.
여러 버킷 태그를 설정할 수 있습니다. 각기 다른 버킷 태그 키/값 및 태그 수량은 각각 다른 조합으로 사용됩니다. 요청 양식 세트 A에서 사용자가 여러 매개변수 값을 가지고 있고 조건 양식 세트 B에 지정된 여러 매개변수 값을 가지고 있다고 가정합니다. 이 조건 키를 통해 사용자는 for_any_value 및 for_all_value 한정어의 다양한 조합을 사용하여 다른 의미를 나타낼 수 있습니다.
for_any_value:string_equal은 A와 B가 교차하는 경우 요청이 적용됨을 나타냅니다.
for_all_value:string_equal은 A가 B의 subset인 경우 요청이 적용됨을 나타냅니다.
for_any_value:string_equal을 사용하는 경우 해당 정책 및 요청은 다음과 같습니다.
요청 시나리오
예상 결과
PutBucket, 요청 헤더 x-cos-tagging: a=b&c=d
200, 성공
PutBucket, 요청 헤더 x-cos-tagging: a=b
200, 성공
PutBucket, 요청 헤더 x-cos-tagging: a=b&c=d&e=f
200, 성공
정책 예시는 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect": "allow",
"action":[
"name/cos:PutBucket"
],
"resource": "*",
"condition":{
"for_any_value:string_equal":{
"qcs:request_tag": [
"a&b",
"c&d"
]
}
}
}
]
}
for_all_value:string_equal을 사용하는 경우 해당 정책 및 요청은 다음과 같습니다.
요청 시나리오
예상 결과
PutBucket, 요청 헤더 x-cos-tagging: a=b&c=d
200, 성공
PutBucket, 요청 헤더 x-cos-tagging: a=b
200, 성공
PutBucket, 요청 헤더 x-cos-tagging: a=b&c=d&e=f
403, 실패
정책 예시는 다음과 같습니다.
{
"version": "2.0",
"statement": [
{
"principal":{
"qcs":[
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect": "allow",
"action":[
"name/cos:PutBucket"
],
"resource": "*",
"condition":{
"for_all_value:string_equal": {
"qcs:request_tag": [
"a&b",
"c&d"
]
}
}
}
]
}

파일 업로드 시 파일 덮어쓰기를 금지하는 요청 헤더(cos:x-cos-forbid-overwrite) 필수 포함

조건 키 cos:x-cos-forbid-overwrite

조건 키 cos:x-cos-forbid-overwrite를 사용하면 업로드 요청(PutObject, PutObject-Copy, InitiateMultipartUpload, CompleteMultipartUpload)에 반드시 요청 헤더 x-cos-forbid-overwrite를 포함하도록 제한할 수 있으며, 이를 통해 기존 객체를 덮어쓸 수 있는 요청을 엄격히 금지할 수 있습니다.

예시: 파일 업로드 요청 시 x-cos-forbid-overwrite를 true로 지정해야 함

예를 들어, 루트 계정(uin:100000000001)이 버킷 examplebucket-1250000000을 소유하고 있고, 서브 사용자(uin:100000000002)가 객체를 업로드할 때 기존과 같은 이름의 객체를 덮어쓰지 못하도록 제한해야 한다고 가정합니다. 다음 정책은 서브 사용자가 업로드 요청(PutObject, PutObject-Copy, InitiateMultipartUpload, CompleteMultipartUpload)을 수행할 때 x-cos-forbid-overwrite 헤더를 반드시 포함하고, 그 값이 문자열 true여야 한다는 조건을 설정합니다.
{
\t"version": "2.0",
\t"statement": [{
\t\t\t"principal": {
\t\t\t\t"qcs": [
\t\t\t\t\t"qcs::cam::uin/100000000001:uin/100000000002"
\t\t\t\t]
\t\t\t},
\t\t\t"effect": "allow",
\t\t\t"action": [
\t\t\t\t"name/cos:PutObject"
\t\t\t],
\t\t\t"resource": [
\t\t\t\t"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
\t\t\t],
\t\t\t"condition": {
\t\t\t\t"string_equal": {
\t\t\t\t\t"cos:x-cos-forbid-overwrite": "true"
\t\t\t\t}
\t\t\t}
\t\t},
\t\t{
\t\t\t"principal": {
\t\t\t\t"qcs": [
\t\t\t\t\t"qcs::cam::uin/100000000001:uin/100000000002"
\t\t\t\t]
\t\t\t},
\t\t\t"effect": "deny",
\t\t\t"action": [
\t\t\t\t"name/cos:PutObject"
\t\t\t],
\t\t\t"resource": [
\t\t\t\t"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
\t\t\t],
\t\t\t"condition": {
\t\t\t\t"string_not_equal_if_exist": {
\t\t\t\t\t"cos:x-cos-forbid-overwrite": "true"
\t\t\t\t}
\t\t\t}
\t\t}
\t]
}

요청 도메인 제한(cos:host)

조건 키 cos:host

조건 키 cos:host를 통해 요청 헤더 Host를 제한하여, 접근 가능한 도메인을 제어할 수 있습니다.

예시1: 특정 도메인을 통한 COS 접근 금지

다음 정책은 사용자가 기본 도메인 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com을 통해 COS에 접근하는 것을 금지하고, 다른 도메인을 통해서는 접근이 가능하도록 설정하는 것입니다.
{
"version": "2.0",
"statement": [{
"principal": {
"qcs": [
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect": "deny",
"action": [
"*"
],
"resource": [
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition": {
"string_equal": {
"cos:host": "examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com"
}
}
},
{
"principal": {
"qcs": [
"qcs::cam::uin/100000000001:uin/100000000002"
]
},
"effect": "allow",
"action": [
"*"
],
"resource": [
"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"
],
"condition": {
"string_not_equal": {
"cos:host": "examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com"
}
}
}
]
}

예시2: 사용자 정의 도메인을 통해서만 객체 다운로드 허용

다음 정책은 사용자가 mydomain1.com이라는 사용자 정의 도메인을 통해서만 버킷 디렉터리 folder1에서 객체를 다운로드(GetObject)할 수 있도록 제한하는 것입니다.
{
\t"version": "2.0",
\t"statement": [{
\t\t\t"principal": {
\t\t\t\t"qcs": [
\t\t\t\t\t"qcs::cam::uin/100000000001:uin/100000000002"
\t\t\t\t]
\t\t\t},
\t\t\t"effect": "allow",
\t\t\t"action": [
\t\t\t\t"name/cos:GetObject"
\t\t\t],
\t\t\t"resource": [
\t\t\t\t"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/folder1/*"
\t\t\t],
\t\t\t"condition": {
\t\t\t\t"string_equal": {
\t\t\t\t\t"cos:host": "mydomain1.com"
\t\t\t\t}
\t\t\t}
\t\t},
\t\t{
\t\t\t"principal": {
\t\t\t\t"qcs": [
\t\t\t\t\t"qcs::cam::uin/100000000001:uin/100000000002"
\t\t\t\t]
\t\t\t},
\t\t\t"effect": "deny",
\t\t\t"action": [
\t\t\t\t"name/cos:GetObject"
\t\t\t],
\t\t\t"resource": [
\t\t\t\t"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/folder1/*"
\t\t\t],
\t\t\t"condition": {
\t\t\t\t"string_not_equal": {
\t\t\t\t\t"cos:host": "mydomain1.com"
\t\t\t\t}
\t\t\t}
\t\t}
\t]
}

객체 잠금 모드 제한(cos:object-lock-mode)

조건 키 cos:object-lock-mode

조건 키 cos:object-lock-mode를 통해 사용자가 객체를 업로드할 때 반드시 객체 잠금을 설정하고, 고정된 모드를 사용하도록 제한할 수 있습니다.

예시: COMPLIANCE 모드 설정만 허용

{
"statement": [
{
"action": [
"name/cos:PutObject",
"name/cos:InitiateMultipartUpload",
"name/cos:PutObjectRetention"
],
"effect": "allow",
"principal": {
"qcs": [
"qcs::cam::uin/1250000000:uin/1250000001"
]
},
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*"
],
"condition": {
"string_equal": {
"cos:object-lock-mode": "COMPLIANCE"
}
}
}
],
"version": "2.0"
}

객체 잠금 보존 일수 제한(cos:object-lock-remaining-retention-days)

조건 키 cos:object-lock-remaining-retention-days

조건 키 cos:object-lock-remaining-retention-days를 통해 사용자가 객체를 업로드할 때 반드시 객체 잠금을 설정하고, 고정된 일수를 지정하도록 제한할 수 있습니다.
보존 일수 검증 원리
이 조건 키에 전달되는 값은 정수(A)만 지원되며, 실제 요청의 retain-until-date 타임스탬프를 ts1(초), 현재 시간의 타임스탬프를 ts2(초)라고 할 때, 보존 일수는 (B)로 환산됩니다.
보존 일수(B) = 내림[(ts1 - ts2) / (3600*24)]
예시1: retain-until-date가 2022-11-17T10:10:11이고, 현재 시간이 2022-11-15T09:00:00인 경우, 보존 일수(B)는 2일입니다.
예시2: retain-until-date가 2022-11-17T10:10:11이고, 현재 시간이 2022-11-15T12:00:00인 경우, 보존 일수(B)는 1일입니다.
조건을 만족하는지 여부는 A와 B 두 값을 비교하여 판단합니다.

예시: PutObject로 객체를 업로드할 때 잠금 일수는 N일을 초과해야 함

예를 들어, 잠금의 남은 일수는 3일(3일 제외)을 초과해야 합니다.
설명:
조건 키에 규정된 남은 일수는 3일보다 커야 하며, 즉 4일 이상이어야 합니다. 요청 시간이 2022년 10월 1일 16:00:00이라면, 사용자가 설정한 RetainUntilDate는 2022년 10월 5일 16:00:00 이후여야 합니다.
{
"statement": [
{
"action": [
"name/cos:PutObject",
"name/cos:InitiateMultipartUpload",
"name/cos:PutObjectRetention"
],
"effect": "allow",
"principal": {
"qcs": [
"qcs::cam::uin/1250000000:uin/1250000001"
]
},
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*"
],
"condition": {
"numeric_greater_than": {
"cos:object-lock-remaining-retention-days": 3
}
}
}
],
"version": "2.0"
}
조건 연산자에 따라 유효한 RetainUntilDate는 다음과 같습니다.
조건 키
의미
현재 요청 시간
입력값: retain-until-date의 유효한 시간
비고
"numeric_equal":
{
"cos: x-cos-object-lock-remaining-retention-days": 3
}
3일
2022-11-01T12:00:00Z
[ 2022-11-04T12:00:00Z, 2022-11-05T11:59:59Z ]
닫힌 구간
"numeric_greater_than":
{
"cos: x-cos-object-lock-remaining-retention-days": 3
}
3일 초과(3일 제외)
2022-11-01T12:00:00Z
[ 2022-11-05T12:00:00Z, 이후 ]
닫힌 구간
"numeric_less_than":
{
"cos: x-cos-object-lock-remaining-retention-days": 3
}
3일 미만(3일 제외)
2022-11-01T12:00:00Z
[ 2022-11-01T12:00:01Z, 2022-11-04T11:59:59Z ]
닫힌 구간

객체 잠금 보존 날짜에 따른 접근 제한(cos:object-lock-retain-until-date)

조건 키 cos:object-lock-retain-until-date

조건 키 cos:object-lock-retain-until-date를 통해 사용자가 객체를 업로드할 때 객체 잠금을 설정하고, 초 단위까지 설정 가능한 지정 날짜를 반드시 설정하도록 제한할 수 있습니다.

예시: PutObject로 객체를 업로드할 때 지정된 잠금 날짜 제한

다음 요청은 RetainUntilDate가 2022-11-11T12:00:00Z 이후여야 함을 의미합니다.
{
"statement": [
{
"action": [
"name/cos:PutObject",
"name/cos:InitiateMultipartUpload",
"name/cos:PutObjectRetention"
],
"effect": "allow",
"principal": {
"qcs": [
"qcs::cam::uin/1250000000:uin/1250000001"
]
},
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*"
],
"condition": {
"date_greater_than": {
"cos:object-lock-retain-until-date": "2022-11-11T12:00:00Z"
}
}
}
],
"version": "2.0"
}

요청에 포함된 ACL 권한 부여 헤더 제한

조건 키

요청 헤더 x-cos-grant-full-control, x-cos-grant-read, x-cos-grant-write, x-cos-grant-read-acp, x-cos-grant-write-acp는 객체 업로드, 복사 또는 ACL 수정 요청 시 ACL 권한 정보를 지정하는 데 사용됩니다. 자세한 내용은 PutObject의 요청 헤더를 참고하십시오. 아래 표에 명시된 조건 키는 해당 요청 헤더의 포함 여부 또는 헤더 값의 제한 조건을 정의하는 데 사용됩니다.
조건 키
해당 요청 헤더
cos:x-cos-grant-full-control
x-cos-grant-full-control
cos:x-cos-grant-read
x-cos-grant-read
cos:x-cos-grant-write
x-cos-grant-write
cos:x-cos-grant-read-acp
x-cos-grant-read-acp
cos:x-cos-grant-write-acp
x-cos-grant-write-acp
다음은 cos:x-cos-grant-full-control을 예로 들어 ACL 권한 관련 헤더 사용을 제한하는 방법을 설명한 것입니다. 다른 조건 키의 사용 방식도 유사하며, 이러한 조건 키는 주로 다음 두 가지 사용 시나리오에 적용됩니다.
해당 헤더를 특정 계정에만 권한을 부여하는 데 사용할 수 있도록 제한합니다. 자세한 내용은 예시1을 참고하십시오.
해당 헤더를 통한 권한 부여를 금지하여 일부 사용자가 PutObject 권한을 이용해 객체의 ACL을 변경하는 것을 방지합니다. 자세한 내용은 예시2를 참고하십시오.

예시1: x-cos-grant-full-control로 권한을 부여할 수 있는 계정 제한

다음 정책은 서브 계정에 객체 업로드 권한을 부여하지만, 사용자가 객체를 업로드할 때 반드시 x-cos-grant-full-control 헤더를 포함해야 하며, 권한을 부여할 계정은 반드시 루트 계정 100000000001이어야 함을 의미합니다. x-cos-grant-full-control 헤더에는 " 문자가 포함될 수 있으므로, 정책에서 문자열로 사용할 때는 \\"로 이스케이프 처리해야 합니다.
{
\t"statement": [{
\t\t\t"action": [
\t\t\t\t"name/cos:PutObject",
\t\t\t\t"name/cos:PostObject",
\t\t\t\t"name/cos:AppendObject",
\t\t\t\t"name/cos:InitiateMultipartUpload"
\t\t\t],
\t\t\t"effect": "allow",
\t\t\t"principal": {
\t\t\t\t"qcs": [
\t\t\t\t\t"qcs::cam::uin/1250000000:uin/1250000001"
\t\t\t\t]
\t\t\t},
\t\t\t"resource": [
\t\t\t\t"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*"
\t\t\t],
\t\t\t"condition": {
\t\t\t\t"string_equal": {
\t\t\t\t\t"cos:x-cos-grant-full-control": "id=\\"100000000001\\""
\t\t\t\t}
\t\t\t}
\t\t},
\t\t{
\t\t\t"action": [
\t\t\t\t"name/cos:PutObject",
\t\t\t\t"name/cos:PostObject",
\t\t\t\t"name/cos:AppendObject",
\t\t\t\t"name/cos:InitiateMultipartUpload"
\t\t\t],
\t\t\t"effect": "deny",
\t\t\t"principal": {
\t\t\t\t"qcs": [
\t\t\t\t\t"qcs::cam::uin/1250000000:uin/1250000001"
\t\t\t\t]
\t\t\t},
\t\t\t"resource": [
\t\t\t\t"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*"
\t\t\t],
\t\t\t"condition": {
\t\t\t\t"string_not_equal_if_exist": {
\t\t\t\t\t"cos:x-cos-grant-full-control": "id=\\"100000000001\\""
\t\t\t\t}
\t\t\t}
\t\t}
\t],
\t"version": "2.0"
}

예시2: x-cos-grant-full-control로 권한 부여 금지

다음 정책은 서브 계정에 객체 업로드 권한을 부여하지만, 사용자가 객체를 업로드할 때 x-cos-grant-full-control 헤더를 포함하지 않거나 헤더 값을 비워야 합니다.
{
\t"statement": [{
\t\t\t"action": [
\t\t\t\t"name/cos:PutObject",
\t\t\t\t"name/cos:PostObject",
\t\t\t\t"name/cos:AppendObject",
\t\t\t\t"name/cos:InitiateMultipartUpload"
\t\t\t],
\t\t\t"effect": "allow",
\t\t\t"principal": {
\t\t\t\t"qcs": [
\t\t\t\t\t"qcs::cam::uin/1250000000:uin/1250000001"
\t\t\t\t]
\t\t\t},
\t\t\t"resource": [
\t\t\t\t"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*"
\t\t\t],
\t\t\t"condition": {
\t\t\t\t"string_equal_if_exist": {
\t\t\t\t\t"cos:x-cos-grant-full-control": ""
\t\t\t\t}
\t\t\t}
\t\t},
\t\t{
\t\t\t"action": [
\t\t\t\t"name/cos:PutObject",
\t\t\t\t"name/cos:PostObject",
\t\t\t\t"name/cos:AppendObject",
\t\t\t\t"name/cos:InitiateMultipartUpload"
\t\t\t],
\t\t\t"effect": "deny",
\t\t\t"principal": {
\t\t\t\t"qcs": [
\t\t\t\t\t"qcs::cam::uin/1250000000:uin/1250000001"
\t\t\t\t]
\t\t\t},
\t\t\t"resource": [
\t\t\t\t"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*"
\t\t\t],
\t\t\t"condition": {
\t\t\t\t"string_not_equal": {
\t\t\t\t\t"cos:x-cos-grant-full-control": ""
\t\t\t\t}
\t\t\t}
\t\t}
\t],
\t"version": "2.0"
}

","recentReleaseTime":"2025-10-09 14:41:23","slate":"[{\"children\":[{\"text\":\"액세스 정책을 사용하여 권한을 부여할 때 정책 \"},{\"children\":[{\"text\":\"조건\"}],\"id\":\"UsXiDTUBir7zH3p6nexe7\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/18023\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/18023\"},\"type\":\"ref\"},{\"text\":\"을 지정할 수 있습니다. 예를 들어 정책 조건을 사용하여 업로드할 파일의 스토리지 클래스와 사용자 액세스 소스를 제한할 수 있습니다.\"}],\"id\":\"bFlbuLdBZaqbxj7NTnn8D\",\"type\":\"p\"},{\"children\":[{\"text\":\"이 문서는 버킷 정책에서 COS(Cloud Object Storage) 조건 키를 사용하는 일반적인 예시를 제공합니다. \"},{\"children\":[{\"text\":\"조건\"}],\"id\":\"e3YtNSoXu7mhoRCvSw6pF\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/46205\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/46205\"},\"type\":\"ref\"},{\"text\":\" 문서에서 COS 및 해당 요청이 지원하는 모든 조건 키를 볼 수 있습니다.\"}],\"id\":\"dk8fk2zFS9wetssPiI2WN\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"id\":\"15YgDD73yhH6uGEJ_Wkw6\",\"type\":\"p\"},{\"children\":[{\"text\":\"버킷 정책을 작성 시 조건 키를 사용할 때 최소 권한 원칙을 준수하고, 해당 조건 키를 해당 요청(action)에만 추가하며, 작업 지정(action) 시 “\"},{\"text\":\"*\"},{\"text\":\"” 와일드카드를 사용하지 마십시오. 와일드카드를 사용하면 요청이 실패합니다. 조건 키에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"조건\"}],\"id\":\"mAxpJ4DKRwkgNpy6tpHeR\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/46205\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/46205\"},\"type\":\"ref\"},{\"text\":\" 문서를 참고하십시오.\"}],\"id\":\"RwhLuCyLHQ4c2XTWtsUmm\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"액세스 관리(CAM) 콘솔을 사용하여 정책을 생성할 때, version, principal, statement, effect, action, resource, condition 구문 요소는 모두 소문자로 작성해야 합니다.\"}],\"id\":\"HVvcYug-VLY31XM3P6ZBq\",\"start\":false,\"type\":\"uli\"}],\"hintType\":\"info\",\"id\":\"fn5ZWGRQxeEL8NVQWM34V\",\"type\":\"hint\"},{\"children\":[{\"text\":\"사용자 액세스 IP 제한(qcs:ip)\"}],\"id\":\"XpylwQlf7JWoVCfM8ATr8\",\"nodeId\":\"RestrictUserAccessIP\",\"type\":\"h2\"},{\"children\":[{\"text\":\"조건 키 qcs:ip\"}],\"id\":\"sIhXzm4xmFipWkS47YuQY\",\"nodeId\":\".EC.A1.B0.EA.B1.B4-.ED.82.A4-qcs.3Aip\",\"type\":\"h4\"},{\"children\":[{\"text\":\"조건 키 \"},{\"code\":1,\"text\":\"qcs:ip\"},{\"text\":\"를 사용하여 사용자 액세스 IP를 제한할 수 있습니다. 조건 키는 모든 요청에 적용할 수 있습니다.\"}],\"id\":\"6mZzSdy5qpz3a1_7dllfn\",\"type\":\"p\"},{\"children\":[{\"text\":\"예시: 지정 IP의 사용자의 액세스만 허용\"}],\"id\":\"ww7RbJupTznWNoygbs3se\",\"nodeId\":\".EC.98.88.EC.8B.9C.3A-.EC.A7.80.EC.A0.95-ip.EC.9D.98-.EC.82.AC.EC.9A.A9.EC.9E.90.EC.9D.98-.EC.95.A1.EC.84.B8.EC.8A.A4.EB.A7.8C-.ED.97.88.EC.9A.A9\",\"type\":\"h4\"},{\"children\":[{\"text\":\"다음은 ID가 100000000001(APPID는 1250000000)인 루트 계정에 속하는 ID가 100000000002인 서브 계정이 베이징 리전의 버킷 examplebucket-bj와 광저우 리전의 버킷 examplebucket-gz의 객체 exampleobject에 대해, 액세스 IP가 IP 범위 \"},{\"code\":1,\"text\":\"192.168.1.0/24\"},{\"text\":\"에 속하거나 액세스가 IP가 \"},{\"code\":1,\"text\":\"101.226.100.185\"},{\"text\":\" 또는 \"},{\"code\":1,\"text\":\"101.226.100.186\"},{\"text\":\" 대역인 경우 객체 업로드 및 객체 다운로드 권한을 부여하는 정책 예시입니다.\"}],\"id\":\"sThs8XC6qBtfmbj19U-Q_\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"LmjIOSfD2ZwEebFd-BJj7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"id\":\"qMVRSkBYZoX5wYGvnreXX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\": {\"}],\"id\":\"X0toOi_IwZRCRcpJxHVQl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\": [\"}],\"id\":\"xvRlrsCJbln-eAn0RqRxp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"1cPTifSCqpEfA-YwWbWBU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"URNUZtAlaEa5f28HEPu79\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"jRj2njYGjf-7exXPnzlKN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"id\":\"v8hTkX15qeVdE2yy2p65v\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"5X1z7QeN2doDsTXUo_T2j\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"ijNCQoCVPE1mQiaO5krQY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"id\":\"6_LddHyKGmLdbEn8lPIve\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"id\":\"H_CEfcGaTsaicvNrkVnp-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"id\":\"Z__ShS3P-tQFxMxLfWlzm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"gFBbXsN3go-41xid0DvHr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"id\":\"NoMwn52SL5eOc8jVFLeca\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:examplebucket-bj-1250000000/*\\\",\"}],\"id\":\"PicUq6CXfJkKvVQRUraM3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-gz-1250000000/exampleobject\\\"\"}],\"id\":\"YKGoYqOb24htL-0GnR9Gd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"zvBHB9-wrF3g9oxyjDh0U\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\": {\"}],\"id\":\"lZOpI-3A9Zw8xnUC2FMhQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"ip_equal\\\": {\"}],\"id\":\"OvyECSBcPyyoEZ2rQlFnG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs:ip\\\": [\"}],\"id\":\"6RTrlkgxitqz8xCH-FjtN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"192.168.1.0/24\\\",\"}],\"id\":\"qD8D4FtedNxVEG5EmyEkS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"101.226.100.185\\\",\"}],\"id\":\"ny-1ApNVWQ3aaMowUqixb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"101.226.100.186\\\"\"}],\"id\":\"4iB_CEUEmBOyubRQFhARk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"Njw51c2TWGQDm7p4wHBwZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"2B-yBeqfBSagQowiYVNbv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"F2HUs8sEH2oEoSsvLEOtK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"Pb5nLqoGEjTfz1yfjaoSh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"8ctLY0WVBSFxJomaXcdQX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"wjQpOfjwhOxHRRSISFo95\",\"type\":\"code-line\"}],\"id\":\"WiqtumJ3vTPdycKScB6mD\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"객체의 최신 버전 또는 지정 버전(cos:versionid) 액세스만 허용\"}],\"id\":\"5dkVCmNFxZ7IaUUv-r6Yq\",\"nodeId\":\"versionid\",\"type\":\"h2\"},{\"children\":[{\"text\":\"요청 매개변수 versionid\"}],\"id\":\"d811X8dfLMwp58DzneDkQ\",\"nodeId\":\".EC.9A.94.EC.B2.AD-.EB.A7.A4.EA.B0.9C.EB.B3.80.EC.88.98-versionid\",\"type\":\"h4\"},{\"children\":[{\"text\":\"요청 매개변수 \"},{\"code\":1,\"text\":\"versionid\"},{\"text\":\"는 객체의 버전 번호를 지정합니다. 버전 관리에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"버전 제어 개요\"}],\"id\":\"7cZ_ssclnuAD5eX4d5SWd\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/19883\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/19883\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오. 객체를 다운로드(GetObject)하거나 객체를 삭제할 때(DeleteObject) 요청 매개변수 \"},{\"code\":1,\"text\":\"versionid\"},{\"text\":\"를 사용하여 작업할 객체 버전을 지정할 수 있습니다. versionid에는 세 가지 다른 경우가 있습니다.\"}],\"id\":\"gZFuCTmqVOevD_p8w2ths\",\"type\":\"p\"},{\"children\":[{\"code\":1,\"text\":\"versionid\"},{\"text\":\"가 없음: 요청은 기본적으로 최신 버전의 객체에 적용됩니다.\"}],\"id\":\"OzomnejpkRzyd6Yrc29jo\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"code\":1,\"text\":\"versionid\"},{\"text\":\"가 빈 문자열인 경우: \"},{\"code\":1,\"text\":\"versionid\"},{\"text\":\" 요청 매개변수가 전달되지 않은 경우와 동일합니다.\"}],\"id\":\"jHEPs4rsJLCMomu68Vl7B\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"code\":1,\"text\":\"versionid\"},{\"text\":\"가 \"},{\"code\":1,\"text\":\"\\\"null\\\"\"},{\"text\":\"인 경우: 버킷에 대해 버전 관리가 활성화되기 전에 업로드된 객체의 경우 버전 관리가 활성화된 후 버전 번호가 \"},{\"code\":1,\"text\":\"\\\"null\\\"\"},{\"text\":\" 문자열이 됩니다.\"}],\"id\":\"mmMx-4vZGxoOPMfHeaWBY\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"조건 키 cos:versionid\"}],\"id\":\"zcli8LWueTp6muKSqkQaM\",\"nodeId\":\".EC.A1.B0.EA.B1.B4-.ED.82.A4-cos.3Aversionid\",\"type\":\"h4\"},{\"children\":[{\"text\":\"조건 키 \"},{\"code\":1,\"text\":\"cos:versionid\"},{\"text\":\"를 사용하여 요청 매개변수 \"},{\"code\":1,\"text\":\"versionid\"},{\"text\":\"를 제한할 수 있습니다.\"}],\"id\":\"OpQskuH6jIi8piasD8ECu\",\"type\":\"p\"},{\"children\":[{\"text\":\"예시1: 사용자가 지정된 버전의 객체를 가져오도록 허용\"}],\"id\":\"wc9XhpQ1HgNd0jMU8k-bY\",\"nodeId\":\".EC.98.88.EC.8B.9C1.3A-.EC.82.AC.EC.9A.A9.EC.9E.90.EA.B0.80-.EC.A7.80.EC.A0.95.EB.90.9C-.EB.B2.84.EC.A0.84.EC.9D.98-.EA.B0.9D.EC.B2.B4.EB.A5.BC-.EA.B0.80.EC.A0.B8.EC.98.A4.EB.8F.84.EB.A1.9D-.ED.97.88.EC.9A.A9\",\"type\":\"h4\"},{\"children\":[{\"text\":\"examplebucket-1250000000 버킷을 소유하는 uin 100000000001의 루트 계정이 다음 버킷 정책을 사용하여 uin이 100000000000인 서브 계정이 지정된 버전의 객체만 가져오도록 허용한다고 가정합니다.\"}],\"id\":\"QqS8aavUw4xpNxyjMFZv9\",\"type\":\"p\"},{\"children\":[{\"text\":\"정책에 따르면 uin이 100000000002인 서브 계정으로 전송된 객체 다운로드 요청은 versionid 매개변수를 전달하고 versionid 값이 버전 번호 ‘MTg0NDUxNTc1NjIzMTQ1MDAwODg’인 경우에만 성공할 수 있습니다.\"}],\"id\":\"rz0sWhY_7Gk9P-9yLvtN5\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"-qUxQZ1Tplh4TEh0oQf4T\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\",\"}],\"id\":\"BVHTlKxK7WpfTG4t5Ie2c\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"2GjggxyfZUlCo0rJimN0F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"8zRw7RfMiLaHvgNZDPxtT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"Jpz4X2xCMo3H278ZdSBkQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"0X3ClrGEcsJa_hzFWwGJy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"pkBDQTphC18Cob6gY08jc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"EPopc6U0ow3YLMJfY0hFl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"J9mhHdWDw6SjjPVpXQ9YK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"K7veCw8sTe17otg8MjAdC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"gq1N2zW89M9xtzyStOI-D\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"id\":\"ZHx19upzRRVrTkaami6gZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"ShrfFhbAaL87kuBMO74WD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"_2oBZK6TNTV8n5i6TJaWd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_equal\\\":{\"}],\"id\":\"CWx00xeNCrTRRwvYHsvhO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:versionid\\\":\\\"MTg0NDUxNTc1NjIzMTQ1MDAwODg\\\"\"}],\"id\":\"orTWYzlZ6iHNPLlRaqhx0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"oSzvC9vPFv0vaANlCcuQm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"WSS7zYo4VhrbKld_8JdwX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"twqp1VWZ5MAsU3TxJVQpY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"DVE0iOsNRo0w4SgPRnLkN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"qvzlJj51zdVoP_lDugvDJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"i5Zkj7uYZTyu6bNiCA7Ed\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"1yilZbrELfLplhvL4xeLX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"yDg0rE8zajFdOW3xp8bp4\",\"type\":\"code-line\"}],\"id\":\"Wh06ReEGRpuc-uICYOl1p\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"거부 정책 추가\"}],\"id\":\"0NQeKnIahJqQmHThYQ33G\",\"nodeId\":\".EA.B1.B0.EB.B6.80-.EC.A0.95.EC.B1.85-.EC.B6.94.EA.B0.80\",\"type\":\"h4\"},{\"children\":[{\"text\":\"상기 정책을 사용하여 서브 계정에게 권한을 부여하고 서브 계정이 다른 수단을 통해 조건을 부여하지 않고 동일한 권한을 얻는 경우 더 광범위한 권한 부여 정책이 적용됩니다. 예를 들어 서브 계정이 사용자 그룹에 있고 루트 계정이 아무런 조건 없이 사용자 그룹에 GetObject 권한을 부여하면 상기 정책의 버전 번호에 대한 제한이 적용되지 않습니다.\"}],\"id\":\"ZuAbyEC8xjN0Xh9OyhnVe\",\"type\":\"p\"},{\"children\":[{\"text\":\"이에 대처하기 위해 위의 정책을 기반으로 명시적 거부 정책(deny)을 추가하여 더 엄격한 권한 제한을 달성할 수 있습니다. 다음 deny 정책은 서브 사용자가 versionid 매개변수를 포함하지 않는 객체 다운로드 요청을 시작하거나 versionid에 의해 지정된 버전 번호가 ‘MTg0NDUxNTc1NjIzMTQ1MDAwODg’가 아닌 경우 요청이 거부되도록 지정합니다. deny 정책의 우선 순위가 다른 정책보다 높기 때문에 거부 정책을 추가하면 권한 취약성을 최대한 방지할 수 있습니다.\"}],\"id\":\"gBc7MjkOFkotWjTkKHFMX\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"8JNdW0Tr-uRtYWKKV6k12\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"8N5V36oIj06Sv2C2lglby\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"rYMQTYPodSMcBMEUxpiRV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"O6vb8Hb9n1cMNrSzICwS7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"El26ZvigNw5karSZ8k49L\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"8Y6nkolgBo7qx1l0vo79o\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"tfkga3FGd6BSnOrjucSmY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"EdhwhnFK4ii-wjH5WsRoK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"n6nAlESztvODspACe-mPy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"gLmBTu1EHIimO8fZ3kVvS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"id\":\"YZsT0wiL4ZW6SVxJGDtkG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"qPEWnbq7OL_MqIEHvRsYQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"0nOfU5Nb5zk3dTr9L-Nbh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_equal\\\":{\"}],\"id\":\"LFAzNwW79R7Bb7fUdJxKN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:versionid\\\":\\\"MTg0NDUxNTc1NjIzMTQ1MDAwODg\\\"\"}],\"id\":\"dlmtUWp288p_Zmkm_LyTQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"CGBPtdwi2cVNV4pk5yHSc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"LL33O_d0GJ-iY7IbLS5JY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"RIP3DbkRemkDoE0gr9KPy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"aTwUmwV3aRtZxWYEXerlj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"Zy0CFL3ZhcPVyUIPNAmcF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"H5-5BANRUBvFlgO9YPmg0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"Ua85LRpWmEuDP9KJi-5WB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"79I_dQ8MXNYln-XtC_E06\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"dHGlSRt_IlEeCay6FSLuy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"9r3-MONSz3OAEfEITFnrd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"nkJ1Ht3_gB1zq-OQvEwXC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"CnThMh_tM3ZAFw_SIhHT5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"deny\\\",\"}],\"id\":\"lzrpEplFVmyxghqUvJw1H\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"l7Dl0-OWoG7AYqm2az5iW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"id\":\"q_KFDCTbosDMRFTk7l1O8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"TzeKH8gbnKdioujrKLy-2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"6nvZs_QmgDfXNUY1Pp7Dt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_not_equal_if_exist\\\":{\"}],\"id\":\"7TUn0hS5cR8x-01b28gIP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:versionid\\\":\\\"MTg0NDUxNTc1NjIzMTQ1MDAwODg\\\"\"}],\"id\":\"5ESrOP-R8iVpBSGKwmF7O\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"85YF2eVJnHcH4N3yAu4y2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"njvt7ROT77xP3sGdotH09\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"N8dWG4zciVaOEych_Q92Z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"B5_9qwAaKLEmnlpCbAyBf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"AxRjVdnzyfGp_HtuMs1Yx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"_MSv2DcqF71SgJBTcurqy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"NUSdbZbzRcCnWJrF02_ZD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\"\"}],\"id\":\"qoenlnaIIaV100hDrd_MM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"Zocdbd-OBlW5HhhDRm9nP\",\"type\":\"code-line\"}],\"id\":\"IrMlqRRzrXQbyTAjJMZQL\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"예시2: 사용자가 최신 버전의 객체만 가져올 수 있도록 허용\"}],\"id\":\"1wW92f-LTDmErLxp6VBOp\",\"nodeId\":\".EC.98.88.EC.8B.9C2.3A-.EC.82.AC.EC.9A.A9.EC.9E.90.EA.B0.80-.EC.B5.9C.EC.8B.A0-.EB.B2.84.EC.A0.84.EC.9D.98-.EA.B0.9D.EC.B2.B4.EB.A7.8C-.EA.B0.80.EC.A0.B8.EC.98.AC-.EC.88.98-.EC.9E.88.EB.8F.84.EB.A1.9D-.ED.97.88.EC.9A.A9\",\"type\":\"h4\"},{\"children\":[{\"text\":\"버킷 examplebucket-1250000000을 소유하는 uin 100000000001의 루트 계정이 다음 버킷 정책을 사용하여 uin이 100000000002인 서브 계정이 최신 버전의 객체만 가져오도록 허용한다고 가정합니다.\"}],\"id\":\"kfsr6CLcsc-V109Qru8vM\",\"type\":\"p\"},{\"children\":[{\"text\":\"정책에 따라 \"},{\"code\":1,\"text\":\"versionid\"},{\"text\":\"가 전달되지 않거나 해당 값이 빈 문자열인 경우 GetObject 요청은 기본적으로 최신 버전의 객체를 다운로드합니다. 따라서 다음 조건에서 string_equal_if_exist를 사용할 수 있습니다.\"}],\"id\":\"URABpKNxvl0jVoKftfkbm\",\"type\":\"p\"},{\"children\":[{\"text\":\"versionid가 전달되지 않으면 기본적으로 조건이 충족된 것으로 간주(true)되어 allow 정책이 적용되어 요청이 allow됩니다.\"}],\"id\":\"knPSUbZWVTEvzu2t5EEEt\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"versionid가 빈 문자열(\"},{\"code\":1,\"text\":\"“”\"},{\"text\":\")인 경우 allow 정책도 적용되며 최신 버전의 객체 다운로드 요청만 승인됩니다.\"}],\"id\":\"SXyN_eV8Lc1ZE9S5_jzDR\",\"start\":false,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"iBFE8Gx-lS2wTc8xQDiW8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_equal_if_exist\\\": {\"}],\"id\":\"x3r0uvH5zNrffm7yGetlG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:versionid\\\": \\\"\\\"\"}],\"id\":\"iL6J_b8lrHr9ILOgypGtP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"pAD3PtH6ZdbsCzP7YnYsU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"l9OT2fZ4JMrAwlMW2S0nQ\",\"type\":\"code-line\"}],\"id\":\"0L8w1tUEvohZjYrNAlcly\",\"indent\":1,\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"명시적 거부 정책이 추가된 후 전체 버킷 정책은 다음과 같습니다.\"}],\"id\":\"1S8c4EfZG55m6Q5tM9CMn\",\"indent\":1,\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"_F7ouwQb3YhUBykcCrmGa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"ZP0GWVMJCRdMKUFTsiNSd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"SEpj3cb-bzuZ5mDxEnQz0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"0l6Ja9kPD25BeGhZXgU7I\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"szqHwD9bma1bg9diHerPe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"a08wHcw4gmnPbvbOlOKRT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"hkrBjNr2n-skc3aHuQfn5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"26hwe68aDFn5awyWJm7fa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"vgHnhXEinTEZwasMkvEb-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"3DcrLbxa58xmTYMVGLlO8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"id\":\"6vaqzpjpJSk3MDibFH48n\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"xuu2Zy5hFbBS7A5qQ0ZIm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"vRp2SEZRX-PQPt022FcD-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_equal_if_exist\\\":{\"}],\"id\":\"VL-dPsQVaENrlG-4_52yV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:versionid\\\":\\\"\\\"\"}],\"id\":\"xgXT4CrrvNFClDI9KO9Hw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"wUd0WD7_2JMcbvMvObSC5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"mzTd5th9-ul3EAPMLu6hd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"Lucwu0l_aSWyz20xP4_Ie\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"KGrNC1YDZw4bFwrHbleI0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"jYW5eHRlt8wEkO0q6PAC1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"dKn0xJHxRt2E2vWwmBkFm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"FCHkrPQqGqel27BA-cEqL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"G5tFlRtutEwhAFJKLq0Qd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"X_wAbutd-oEPUujCncyVy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"cEcaiQAZkQxqHBl9dgqxp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"SLs96uvtsa6wXckKssSul\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"c_wvCyyr024GjVm0m1RGY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"deny\\\",\"}],\"id\":\"WE0xzAHYHOBp8TESqSEut\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"pXe3zrjPwItRiFN8xPAeh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"id\":\"5nigz9jmTUZgATJFWw0RS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"i2QP8F0iXbk59_qqnEhMD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"MioDq0wBccLJI0ZpU2hO5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_not_equal\\\":{\"}],\"id\":\"YFn-JITxBeHnthhjHDcVs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:versionid\\\":\\\"\\\"\"}],\"id\":\"SYd51FzDjuT38hDKSKrgb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"0lX2FPBkEo9x94IOvhu43\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"0FKunor6S_wKqZEU8cXyY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"13gs851WECXbyo-VlU0yy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"PsJBpqSLrLkdyQ7mcX_Mx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"Ilk8B2i-YlppOixnn3m3m\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"PtM_UYJ-f4uI7SJ3i_HBR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"RU9ashF1Z7dhcZikHuZSa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\"\"}],\"id\":\"V5Lo1TZIIqWzRCxG6uFlZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"98bvO-nxY5OWEiu-Ugqrf\",\"type\":\"code-line\"}],\"id\":\"QzOuT_u5GASbtYRqvrukA\",\"indent\":1,\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"예시3: 버전 관리 활성화 전 업로드된 객체를 사용자가 삭제하는 것을 허용하지 않음\"}],\"id\":\"sokspJ--cN35kdI0pVovF\",\"nodeId\":\".EC.98.88.EC.8B.9C3.3A-.EB.B2.84.EC.A0.84-.EA.B4.80.EB.A6.AC-.ED.99.9C.EC.84.B1.ED.99.94-.EC.A0.84-.EC.97.85.EB.A1.9C.EB.93.9C.EB.90.9C-.EA.B0.9D.EC.B2.B4.EB.A5.BC-.EC.82.AC.EC.9A.A9.EC.9E.90.EA.B0.80-.EC.82.AD.EC.A0.9C.ED.95.98.EB.8A.94-.EA.B2.83.EC.9D.84-.ED.97.88.EC.9A.A9.ED.95.98.EC.A7.80-.EC.95.8A.EC.9D.8C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"버전 관리가 활성화되기 전에 버킷에 업로드된 일부 객체가 있을 수 있으며 이러한 객체의 버전 번호는 버전 관리가 활성화된 후에 \\\"null\\\"이 됩니다. 경우에 따라 이러한 객체에 대한 추가 보호를 활성화해야 할 수 있습니다. 예를 들어 사용자가 이러한 객체를 영구적으로 삭제하지 못하도록 하는 것, 즉 버전 번호가 있는 객체의 삭제를 거부하는 것입니다.\"}],\"id\":\"ImgP9NYu4MGvnKqp6-xwO\",\"type\":\"p\"},{\"children\":[{\"text\":\"아래 예시에는 두 가지 버킷 정책이 있습니다.\"}],\"id\":\"nRupF8_RCMhmVmT_ZvWS2\",\"type\":\"p\"},{\"children\":[{\"text\":\"서브 계정에 DeleteObject 요청을 사용하여 버킷의 객체를 삭제할 수 있는 권한을 부여합니다.\"}],\"id\":\"nGxxBZrh6iQslFwMpEixM\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"DeleteObject 요청에 대한 조건을 제한합니다. DeleteObject 요청이 값이 \\\"null\\\"인 요청 매개변수 versionid를 전달하면 요청이 거부됩니다.\"}],\"id\":\"3OoB_u9Biadfa3ezCrRbT\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"따라서 버전 관리가 활성화되기 전에 객체 A가 버킷 examplebucket-1250000000에 업로드된 경우 버전 관리가 활성화된 후 객체 A의 버전 번호는 \\\"null\\\" 문자열이 됩니다.\"}],\"id\":\"3A2ptqjCN2KTB1K1ZM9qD\",\"type\":\"p\"},{\"children\":[{\"text\":\"버킷 정책이 추가되면 객체 A가 보호됩니다. 서브 사용자가 객체 A를 삭제하기 위해 시작한 DeleteObject 요청에 버전 번호가 없으면 버전 관리가 활성화되어 있기 때문에 객체 A가 영구적으로 삭제되지 않습니다. 대신 객체 A에 대한 삭제 표시가 추가됩니다. 요청에 객체 A의 \\\"null\\\" 버전 번호가 포함되어 있으면 요청이 거부되고 객체 A는 영구적으로 삭제되지 않습니다.\"}],\"id\":\"EwDUulZbGcWRWpExk5WTm\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"PtnEPN4n9G-6Ywc8vIp14\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"oYDVjEinidPZQpF6PD2b_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"gw5Of4HB2o-U-vBdRU2aL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"duJzo3rCJPi2uPtpOpkhq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"LQkGoT3ZSIhpWE-4Pxs6z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"j0-LdTscmZwxsZFczks7f\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"xVHdOM67-ElM7i47ZtBUg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"h01V45UCHZxZUkuPP79ga\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"PQ9EOXxs_GjkeO9s8tj47\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"jQP5YlvELhbJvUxptn7aK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:DeleteObject\\\"\"}],\"id\":\"1R038vMwGXwKBkWR2hoDf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"hgKUBAN9nmfceHxuO93ml\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"B1bSTGsuEP93HP8vTMw6C\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"8cnv8XImIIHq2ppIFxL7Q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"i9CnA8ksgRJ9-lU1wMvRx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"BxmZR56aqT51Vl2U15V5w\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"YIkdeAaOV53dGuKxRE7Jl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"rnBHwXj8K-wu-kwYFQZc8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"wwU9IoFBWeYUWwfJWYbYR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"MzNxsxZzV1sVngvn9JtJH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"hbVURXKAswzUpW9WisBIP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"vKZWUpa0usMhRIusHg485\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"deny\\\",\"}],\"id\":\"eqQOStL21aOWVF7cf8QLa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"UTVuqhUXeTEiVa0QdrLpz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:DeleteObject\\\"\"}],\"id\":\"-6gOU9Tr4VrdEXNpvGynS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"_8QcIoNedefVa2IP9UKaJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"bZiupWrJNA5Xu1bzaLPet\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_equal\\\":{\"}],\"id\":\"eSuaVY3BzD15n5AGAVSpt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:versionid\\\":\\\"null\\\"\"}],\"id\":\"-AmQ7EkRFKzpxWCP40BZw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"rIbP_gkAX2QhOxX40WRbX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"NLd_qSxV8L7AKa6wHiE8_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"VIGFmQPHgV3ECw2SoxfW-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"tU6W5gdSw3glLHHkuoCtI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"jUl_xlDvRpevtVMoaYMAw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"kKqjH85zvDK2tvmHlE_tA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"plidmxm892nU-Wg3w5dEM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\"\"}],\"id\":\"tDxycXToLnJDtWAoaIz0j\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"wtm2SOzvWSxiVGDuHRsOX\",\"type\":\"code-line\"}],\"id\":\"KQSBueabIoBHDLqPexY1v\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"업로드 파일 크기 제한(cos:content-length)\"}],\"id\":\"uLM0HXmiLhr8-nyW7vyiN\",\"nodeId\":\"content-length\",\"type\":\"h2\"},{\"children\":[{\"text\":\"요청 헤더 Content-Length\"}],\"id\":\"UdKO1rkRqnvLSBGiud2WB\",\"nodeId\":\".EC.9A.94.EC.B2.AD-.ED.97.A4.EB.8D.94-content-length\",\"type\":\"h4\"},{\"children\":[{\"text\":\"RFC 2616에 정의된 바이트 단위의 HTTP 요청 콘텐츠 길이는 PUT 및 POST 요청에서 자주 사용됩니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"Common Request Headers\"}],\"id\":\"DKT6MPXq0R-brGMru8pEM\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7728\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7728\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"a4OxOYzsIQl_yv2iPgeSg\",\"type\":\"p\"},{\"children\":[{\"text\":\"조건 키 cos:content-length\"}],\"id\":\"GHYwo-zV9j3ns8NM9Mvxc\",\"nodeId\":\".EC.A1.B0.EA.B1.B4-.ED.82.A4-cos.3Acontent-length\",\"type\":\"h4\"},{\"children\":[{\"text\":\"객체를 업로드할 때 조건 키 \"},{\"code\":1,\"text\":\"cos:content-length\"},{\"text\":\"를 사용하여 요청 헤더 \"},{\"code\":1,\"text\":\"Content-Length\"},{\"text\":\"를 제한하고 업로드할 객체의 파일 크기를 제한할 수 있습니다. 이러한 방식으로 저장 공간을 유연하게 관리하고 너무 크거나 작은 파일을 업로드하여 저장 공간과 네트워크 대역폭을 낭비하지 않도록 할 수 있습니다.\"}],\"id\":\"uMFFT4rudr5VgUJ1ut-iw\",\"type\":\"p\"},{\"children\":[{\"text\":\"아래 두 예시에서는 루트 계정(uin: 100000000001)이 버킷 examplebucket-1250000000을 소유하고 있다고 가정하며, \"},{\"code\":1,\"text\":\"cos:content-length\"},{\"text\":\" 조건 키를 사용하여 서브 계정(uin: 100000000002)에서 업로드한 요청의 Content-Length 헤더 값을 제한할 수 있습니다.\"}],\"id\":\"4SaYvC5sRvJO8x_-Q9sCN\",\"type\":\"p\"},{\"children\":[{\"text\":\"예시1: 요청 헤더 Content-Length의 최대값 제한\"}],\"id\":\"nW0FtASGckoEhbFCzpge6\",\"nodeId\":\".EC.98.88.EC.8B.9C1.3A-.EC.9A.94.EC.B2.AD-.ED.97.A4.EB.8D.94-content-length.EC.9D.98-.EC.B5.9C.EB.8C.80.EA.B0.92-.EC.A0.9C.ED.95.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"PutObject 및 PostObject 업로드 요청이 10 바이트 이하의 값을 가진 Content-Length 헤더를 전달해야 한다고 제한합니다.\"}],\"id\":\"h3d3vGV3uvRlIG8X1LlgL\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"pYSjs1ho4omlPcnCjgYOg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\",\"}],\"id\":\"Z3TUgHEIr6lEVHHblpy3g\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"053QgZzc4D5FNc-PkEC3J\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"sab78WS8kwxZKosQY5A04\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"Ti3xcNYGZ1V7dXnbFOQQ2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"yVhY-NXIeObhV48uYzU1z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"BOfifIvnA16EppCFEvNqn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"G0wlAtGTdF0FDKxwnFdAR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"-jzO7BIamNOFJy0GupHfo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"SvSMNLiem6IPrI9oAE7Ft\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"gjwHKI0l5gTE0DdzhDQO8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"id\":\"UyzpFOIVgw9-XKj4FD8qi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PostObject\\\"\"}],\"id\":\"YfXlPT8fFlxuJL8PuIMG-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"Zdj35NrDs11icLggjwO4O\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"JOIdSm2ROU5V_16x2lGoA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"khdsrf5wm5hyP1PXtPngw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"bDu05e_T5-U5lY__b-GQu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"7Ip4o4TLsMFJD1YXX5FT0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"numeric_less_than_equal\\\":{\"}],\"id\":\"YWVv-7VAMgd18pKYBKQuU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:content-length\\\":10\"}],\"id\":\"ZFpKAVh1Rek-cV5ivlUyq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"bA4BjgC7gDDgpo2Wp7Vlz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"xSPFC2kGog-y1uOw9kPls\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"Ior4m7QxCngmFV_PsGhxw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"-OgYzpQuIy-LZDVT65SnP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"gJUKtY5z-uBOviRCvwU0C\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"v5yFCujb8oxFl77mWVuYf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"wHYw-0qIWonTpsIpIgYqj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"0OVeXkdZMMJCnTFbK79-z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"UMU7tfMR66gWyMncSYkty\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"deny\\\",\"}],\"id\":\"CwSfqJ8uXKnyHiJS4BJEt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"CfKIMl4c1tLPliYB0U7SY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"id\":\"zyviixal9mTMWB5DG_7k2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PostObject\\\"\"}],\"id\":\"fXaOewc0iNDcYoLVB1yPB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"FjRsO7DQGonQ55OQCDS9p\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"gPRjB0NvknjbPwpcvXOGZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"Kb0umqhwXXqp6xsB9Rcpm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"VTKWEgF0bBqVFCmbW2nU2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"79zZFVkkmwrlfwPxbB9d8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"numeric_greater_than_if_exist\\\":{\"}],\"id\":\"MbwAwQun25YqsrWRKe7_Y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:content-length\\\":10\"}],\"id\":\"CG1_KCBynKyaqWcx0SjGR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"a5UXKPp0jR32ottqRC4la\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"jD8wbeko6LMYoa0nsz64o\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"QCytkR4q7DA5eDgVfTIUH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"mbIgi8-g4uxCNQ2WfIL6d\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"q3HLKoOY1HRG3NMqCasoQ\",\"type\":\"code-line\"}],\"id\":\"zOzaMy-8cmievTuzOoinT\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"예시2: 요청 헤더 Content-Length의 최소값 제한\"}],\"id\":\"6n5lbZ9j87vhUedoMnH0P\",\"nodeId\":\".EC.98.88.EC.8B.9C2.3A-.EC.9A.94.EC.B2.AD-.ED.97.A4.EB.8D.94-content-length.EC.9D.98-.EC.B5.9C.EC.86.8C.EA.B0.92-.EC.A0.9C.ED.95.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"PutObject 및 PostObject 업로드 요청이 2 바이트 이상의 값을 가진 Content-Length 헤더를 전달해야 한다고 제한합니다.\"}],\"id\":\"cEvH3OmS6RFssYU_hu6P0\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"6W4B0S9gCWGsF5r4EIPJ7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\",\"}],\"id\":\"1Vl6TrpJDyGtEYS2PBsV5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"TdLWNdiqUPWN0zHdAXIK4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"trREfvE08QaylcL_p80_q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"MVdFsOP1At-Bn2Mxasi5Z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"Z2TQuw-oFDKntFjJnGbmB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"ipHblQjIR-k80d0ZknxUx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"UClw0rtTz48rVDqcyrPPd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"IQkTw5OzFd01LVJEi7q2G\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"CT-7oLd6nDb0jGhQpAiRC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"CPpU7lYvAPD2mGV91CgXc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"id\":\"LrHz03VZnzF0USz4BUnZP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PostObject\\\"\"}],\"id\":\"2R13Y9EEZpjClbTiMSvx-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"_zqqnxAmOwP4KxZvY8nFR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"yLFkZ7MZOSvKc0iGijltU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"V2E3dYWoT-V2Efk8FgeuF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"rUPKJd1jJ_BkqasGoo1n3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"C_bli32K9GUbBPxmvYKB5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"numeric_greater_than_equal\\\":{\"}],\"id\":\"UKrYIhiJWe5wY7_EeYIxz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:content-length\\\":2\"}],\"id\":\"U7MGaX06NQ0ykw8ka5XHt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"mljJdtHnPaWyNBKm0O0Mf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"K-UD1DrRAWkTeGeNg162f\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"EZXquuOVWJ6qjrd29MQX_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"ZDSQVNLZ6bd2c-ESpJRxk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"DxgZxNnMFYg_TXQVi3Ncu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"-uIBjwSmfGN6V_jI_JAxS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"2IG79-TNCqfd9jBFtedf8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"C4NERiSxgCpCfLbOEBixD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"IRjv4Y4rpyHABJA6vsfTs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"deny\\\",\"}],\"id\":\"wKA9G706ib5aSy2y6Cjdk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"CgdjxOf99H-7WvMYoWLfE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"id\":\"Jl4q0R6OutMNvxALt4swo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PostObject\\\"\"}],\"id\":\"Xe8lik5Xt7V2cb6-2fccG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"x2fgoeX9INWsD9txzEdv-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"mDIEE4sKVPJPo4c-Hmt5b\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"tQXAZ2pJGOu6fCp4nH3PB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"fyIDlFpgoBYLbFcyMUvHl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"3CKKn-FcTvGua1w47IEh9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"numeric_less_than_if_exist\\\":{\"}],\"id\":\"Wfxel65szxUf4_7-uukFh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:content-length\\\":2\"}],\"id\":\"z8RLXsZflNCF8OB-yWyTn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"Bd46cq_W0KcmCLV2izSRZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"nucqE5F9bEVIq-Zp7IjmC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"YWakFTOd3rtoo84bWSZte\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"xySc5KM7EH2zOnHlSHiwg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"k1Gr7U64pzzmjctPhlOmy\",\"type\":\"code-line\"}],\"id\":\"Bl8XEkIQrByD0ccuMejox\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"업로드할 파일 형식 제한(cos:content-type)\"}],\"id\":\"lsNWaiNz90tHBNUle-k9f\",\"nodeId\":\"content-type\",\"type\":\"h2\"},{\"children\":[{\"text\":\"요청 헤더 Content-Type\"}],\"id\":\"NhFTkP7MKCNdQGghcHV69\",\"nodeId\":\".EC.9A.94.EC.B2.AD-.ED.97.A4.EB.8D.94-content-type\",\"type\":\"h4\"},{\"children\":[{\"text\":\"Content-Type은 \"},{\"code\":1,\"text\":\"application/xml\"},{\"text\":\" 및 \"},{\"code\":1,\"text\":\"image/jpeg\"},{\"text\":\"와 같이 RFC 2616(MIME)에 정의된 HTTP 요청 콘텐츠 유형이어야 합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"Common Request Headers\"}],\"id\":\"AJWezgQRMrbI8xEOTUWyR\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7728\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7728\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"HQrQ5rFqozcZ8pQdn2R8X\",\"type\":\"p\"},{\"children\":[{\"text\":\"조건 키 cos:content-type\"}],\"id\":\"yZPU1h3g0Qn8cq181d6BL\",\"nodeId\":\".EC.A1.B0.EA.B1.B4-.ED.82.A4-cos.3Acontent-type\",\"type\":\"h4\"},{\"children\":[{\"text\":\"조건 키 \"},{\"code\":1,\"text\":\"cos:content-type\"},{\"text\":\"을 사용하여 요청 헤더 \"},{\"code\":1,\"text\":\"Content-Type\"},{\"text\":\"을 제한할 수 있습니다.\"}],\"id\":\"KGvzHSzEMpnD4hA9c1wIM\",\"type\":\"p\"},{\"children\":[{\"text\":\"예시: PutObject 요청의 Content-Type을 \\\"image/jpeg\\\"로 제한\"}],\"id\":\"vZ6xYqigZq7IOGg3IETdv\",\"nodeId\":\".EC.98.88.EC.8B.9C1.3A-putobject-.EC.9A.94.EC.B2.AD.EC.9D.98-content-type.EC.9D.84-.22image.2Fjpeg.22.EB.A1.9C-.EC.A0.9C.ED.95.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"버킷 examplebucket-1250000000을 소유하는 uin이 100000000001인 루트 계정이 \"},{\"code\":1,\"text\":\"cos:content-type\"},{\"text\":\" 조건 키를 사용하여 uin이 100000000002인 서브 계정이 시작한 업로드 요청에서 Content-Type 헤더의 콘텐츠를 제한한다고 가정합니다.\"}],\"id\":\"Cu-dYKS7xWudmLwbH_v75\",\"type\":\"p\"},{\"children\":[{\"text\":\"이 예시의 버킷 정책은 객체 업로드 요청(PutObject)이 Content-Type 헤더와 ‘image/jpeg’ 값을 포함해야 하는 것을 제한하는 것입니다.\"}],\"id\":\"e4aRpQkfJcLvmcch0SfeK\",\"type\":\"p\"},{\"children\":[{\"text\":\"string_equal은 요청이 지정된 값과 정확히 동일한 값을 가진 Content-Type 헤더를 전달해야 함을 요구합니다. 실제 요청에서는 \"},{\"b\":1,\"text\":\"요청의 Content-Type 헤더를 명시적으로 지정해야 합니다\"},{\"text\":\". 그렇지 않고 요청에 Content-Type 헤더가 없으면 요청이 실패합니다. 또한 특정 도구를 사용하여 요청을 시작하고 Content-Type을 명시적으로 지정하지 않으면 도구에서 예기치 않은 Content-Type 헤더를 요청에 자동으로 추가할 수 있으며 요청도 실패할 수 있습니다.\"}],\"id\":\"4-EXAWBprRfisNeMh0fdW\",\"type\":\"p\"},{\"children\":[{\"text\":\"또한 대소문자를 구분하지 않는 조건 연산자인 \"},{\"code\":1,\"text\":\"string_equal_ignore_case\"},{\"text\":\" 및 \"},{\"code\":1,\"text\":\"string_not_equal_ignore_case\"},{\"text\":\"의 사용을 권장합니다. 그 이유는 \"},{\"code\":1,\"text\":\"string_equal\"},{\"text\":\" 또는 \"},{\"code\":1,\"text\":\"string_not_equal\"},{\"text\":\"을 사용할 경우, \"},{\"code\":1,\"text\":\"text/html\"},{\"text\":\" 형식의 파일 업로드를 제한하려 할 때 \"},{\"code\":1,\"text\":\"text/Html\"},{\"text\":\", \"},{\"code\":1,\"text\":\"tExt/html\"},{\"text\":\" 등 대소문자가 혼합된 Content-Type은 엄격히 차단되지 못하기 때문입니다. 대소문자를 무시하는 연산자를 사용하면 이러한 경우까지 철저히 차단할 수 있습니다. 조건 연산자에 대한 자세한 내용은 \"},{\"__nid\":\"a631c87b6939a29dd26b83cc84ee4e5edae8d223\",\"children\":[{\"text\":\"조건 연산자\"}],\"id\":\"6qASH4OSV2ThBLciND4OT\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/598/58420#.E8.BF.90.E7.AE.97.E7.AC.A6\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"h7Am3IqebD5FW532eDYb9\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"M-6XedmwpAQm2YY-r0MpK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\",\"}],\"id\":\"1N9FexX-Uv5hujiaUWaVL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"sYnrX52kpGaFCwJOsk7N2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"DzRElDBmSmZ3O7HO7PALe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"u3SulfddRNWYyxzefeLgR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"qZXh4WctM2OArYQfpL2eX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"Vd6pH9EcIaPzZzzW8Ns6R\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"C5TwgpxZWxy7kb9zHVeLe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"iOKw60VSFD5DsSx_EWM23\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"6lekFNLfMn-fU6dpDI4H1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"_FjnkkLESqhXcj-rzq_Y-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\"\"}],\"id\":\"1tPOsWDd1Ov8FDV5xM58A\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"SdMThfntR0Bkpt1KS0E1y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"yLMrfBivwYF1atbSpdD9Y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"aEzOyPcqXAzI7sOiWyT2y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"HUqA42Ty0ba5sXPXsH-sf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"Ll4bExhCbuguc0iy38z9T\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_equal_ignore_case\\\":{\"}],\"id\":\"v2DyOPKSFbnbba--EtsdU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:content-type\\\":\\\"image/jpeg\\\"\"}],\"id\":\"VOIh8cDJCny2gAtx7fvr1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"0vHZSzUB_C3tOpqgkp2sT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"CHxF4rs0OucY2Koi3dzhZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"GWrknpHgjhIZdLF4TkikE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"ML8xt3p7JLA5ocTswCfyd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"8w74Nbr-Nr8eve3ICGHM5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"-QJs7vfdTdiZ625LjCKAD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"4sI4Zg16rbvIxkaBegd0p\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"Yol0u4oBMInqLRA0U5Hkn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"HMgDt-JKzfnRHDfJ-VvfZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"deny\\\",\"}],\"id\":\"isD1fk5w3dZTh_EwhP2bk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"F2zkXpZlZikEcV6AJvK6a\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\"\"}],\"id\":\"UWS-BHcLeTYqyNr3iUn8N\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"8bd_79lYsVBxSQ0C10N6p\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"CbZiwYqcOES2Z6_mAUF-F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"ViIHnuvGmezYdFyjAlxrw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"jgefohWXgUZoZLB2LWY72\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"LSVWK1V0mtdm562lPDUP6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_not_equal_ignore_case_if_exist\\\":{\"}],\"id\":\"U0zlmQDKEBXj5dNVzI-QH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:content-type\\\":\\\"image/jpeg\\\"\"}],\"id\":\"ouA6ymADXnh2nx8W43PNY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"hHfZOgEEq70ojIwGUi95f\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"AL9rKqG5_yRG4VisrgAJZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"WQHJO_wSAWedlJfPK4Ilc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"l8qk_QVTGRTLmGr8pp2fz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"AqzLKSwhzUuvis6-sL9nc\",\"type\":\"code-line\"}],\"id\":\"KKCzM-LlAeo6oPOsLFqTt\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"다운로드 요청에서 반환되는 파일 형식 제한(cos:response-content-type)\"}],\"id\":\"yQAPi_AOjnX1XJ51t8efZ\",\"nodeId\":\"response-content-type\",\"type\":\"h2\"},{\"children\":[{\"text\":\"요청 매개변수 response-content-type\"}],\"id\":\"MU245FRiomN2DwT9Xm-oX\",\"nodeId\":\".EC.9A.94.EC.B2.AD-.EB.A7.A4.EA.B0.9C.EB.B3.80.EC.88.98-response-content-type\",\"type\":\"h4\"},{\"children\":[{\"text\":\"GetObject API를 사용하면 요청 매개변수인 \"},{\"code\":1,\"text\":\"response-content-type\"},{\"text\":\"을 추가하여 응답의 Content-Type 헤더 값을 지정할 수 있습니다.\"}],\"id\":\"XhTFePudoYOKFeNvUJHRy\",\"type\":\"p\"},{\"children\":[{\"text\":\"조건 키 cos:response-content-type\"}],\"id\":\"N04EI0DT8lTfph1TZsW88\",\"nodeId\":\".EC.A1.B0.EA.B1.B4-.ED.82.A4-cos.3Aresponse-content-type\",\"type\":\"h4\"},{\"children\":[{\"code\":1,\"text\":\"cos:response-content-type\"},{\"text\":\" 조건 키를 사용하여 요청이 요청 매개변수인 \"},{\"code\":1,\"text\":\"response-content-type\"},{\"text\":\"을 전달해야 하는지 여부를 지정할 수 있습니다.\"}],\"id\":\"Yz4IQT9enN4ixXGZ0cuOq\",\"type\":\"p\"},{\"children\":[{\"text\":\"예시: GetObject 요청 매개변수 response-content-type을 ‘image/jpeg’로 제한\"}],\"id\":\"g5uDzAQbYHryNYeaw8Ag-\",\"nodeId\":\".EC.98.88.EC.8B.9C1.3A-getobject-.EC.9A.94.EC.B2.AD-.EB.A7.A4.EA.B0.9C.EB.B3.80.EC.88.98-response-content-type.EC.9D.84-.E2.80.98image.2Fjpeg.E2.80.99.EB.A1.9C-.EC.A0.9C.ED.95.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"버킷 examplebucket-1250000000을 소유하고 uin이 100000000001인 루트 계정이 다음 버킷 정책을 사용하여 uin이 100000000002인 서브 사용자가 시작한 GetObject 요청이 “image/jpeg” 값과 함께 response-content-type 요청 매개변수를 전달해야 한다고 가정합니다. \"},{\"code\":1,\"text\":\"response-content-type\"},{\"text\":\" 매개변수는 요청 매개변수이며 요청이 시작될 때 urlencode가 필요합니다(urlencode된 값: \"},{\"code\":1,\"text\":\"response-content-type=image%2Fjpeg\"},{\"text\":\"). 따라서 Policy를 설정할 때 \\\"image/jpeg\\\"도 인코딩(urlencode)해야 하며 \\\"image%2Fjpeg\\\"를 입력해야 합니다.\"}],\"id\":\"mdfBtebZPzoQE6PpYWP-W\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"RvkFzwg8i2L00OWldGH9d\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\",\"}],\"id\":\"fqCoBx9wGUzWVChVfZbhN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"3VlP8QdkUVAtuDhuOeqsn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"Qc7o3Z6NmgSynzuKY3Da6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"qDgn6Cmgc8I26klMPRl0v\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"x8y6gCa85BG7KEFbyz3pi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"LrabOnFiynfKKhUwGx7dg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"8c0dzAqMtUTVksdN5z--u\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"IEBFX6EFDEOlwqGnB1pxp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"O_6WNj-t7QGb5h725Nu_k\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"0IQUvzYcDwAGJmpLFkGxn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"id\":\"UPGlLREjq7b52Bbx7N1LO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"k87hmxE0lCkm2JMfE3Xgf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"qXVs_zsckGvEyt_wPs3Mp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"myFFkVFJEjbIFeOXLBZj5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"gmlM5AHIHwvhplxQPuwmH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"0WEhjP1hrJP15SIQBMDYT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_equal\\\":{\"}],\"id\":\"RVITFWBKrFs3BMJZ_bqGt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:response-content-type\\\":\\\"image%2Fjpeg\\\"\"}],\"id\":\"sQuc2CDEDpS4--XNFs_EW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"b4uF30guYICDGfYSujgXi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"5C763NU5oUFsoZUS6A1CR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"wj0VCm-MvHGSVNyApDNbS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"XeyN1JhnwMP3g8IaVOA6M\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"Hh-7DXLPO672wzcJJZG18\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"mMLPlIgTDFIyMryqeTh90\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"YhCJfcRWvsrgEjDUGUkQL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"uLeRSCAKbgJBICDebXFiQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"zHeywp93bIjIlM7cnr-6U\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"deny\\\",\"}],\"id\":\"34ya_n8AZaNQX9VXc3H_K\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"tJXSGB2pvzhmraLLijI0h\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"id\":\"Ee-q-aIlMf_cU_A8bSvjd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"fPNR40Zh1H36ktt7EOrTZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"WDl_h68cFWQHQiz13A9sr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"8nDwtg4D0Ed-E5J1DjVWf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"LnFEojGKK8pu3pwrmMFk-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"OvY3RNsJ35WdKocRMdxTH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_not_equal_if_exist\\\":{\"}],\"id\":\"Xi0ADKfJQHE-96FpewoIY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:response-content-type\\\":\\\"image%2Fjpeg\\\"\"}],\"id\":\"5WGnAJ9r3HYCCiFska9d3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"QSjoEwXu7pOmhULDor_Gb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"L3p--F2v1iQv4DiglvP12\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"-NENtQtZL5-DGsGIIKBlU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"ppiwnO0m7IX-dBP0ta5za\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"X2hC4Rubp7ElWrAOxe62G\",\"type\":\"code-line\"}],\"id\":\"SPiO0946-d283C2ckaUYf\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"HTTPS 요청만 허용(cos:secure-transport)\"}],\"id\":\"MgUvfFnI93tSY0_E9QT-A\",\"nodeId\":\"secure-transport\",\"type\":\"h2\"},{\"children\":[{\"text\":\"조건 키 cos:secure-transport\"}],\"id\":\"A7tKgZLVWmPdagNQUvaAd\",\"nodeId\":\".EC.A1.B0.EA.B1.B4-.ED.82.A4-cos.3Asecure-transport\",\"type\":\"h4\"},{\"children\":[{\"text\":\"조건 키 \"},{\"code\":1,\"text\":\"cos:secure-transport\"},{\"text\":\"를 사용하여 HTTPS 프로토콜 사용 요청 제한\"}],\"id\":\"knMcfbZrTuqKLWBMcsNLf\",\"type\":\"p\"},{\"children\":[{\"text\":\"예시1: HTTPS를 사용하도록 다운로드 요청 제한\"}],\"id\":\"BgnT4KuesFupv9OQXceQ4\",\"nodeId\":\".EC.98.88.EC.8B.9C1.3A-https.EB.A5.BC-.EC.82.AC.EC.9A.A9.ED.95.98.EB.8F.84.EB.A1.9D-.EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C-.EC.9A.94.EC.B2.AD-.EC.A0.9C.ED.95.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"버킷 examplebucket-1250000000을 소유하고 uin이 100000000001인 루트 계정이 다음 버킷 정책을 사용하여 uin이 100000000002인 서브 계정에서 보낸 HTTPS 기반 GetObject 요청만 허용한다고 가정합니다.\"}],\"id\":\"tVmbbSmZGh562ttwE_wxi\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"Ahon_SijXeMaD63pr41lY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\",\"}],\"id\":\"dBpUc_Vf7UK96gKbvbvx-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"Z9u8L-NGfu6w95AF-l2Gu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"OP08KAF4G1tSKm3HlzOMe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"FRGGs-4bONSCjhL1BXoNV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"cK6ZwB_owsux5ECPzQ_87\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"AmT6jp_o8zALGkjTEW_aO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"Rs2M9peg4ubJGnXD8sIm3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"uN59PbXpWzRaBf_h6YS8F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"QJQfrHMZOsVAvMu-LuEMk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"O0c0pZ5yIc-sU0iDNwetj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetObject\\\"\"}],\"id\":\"SqQrTzXq5EPJQZt-216S1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"sw9hac3-7z3etplsyDDu7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"9MAnIE0Y1RnbL4wm_8qZZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"fsJBk2j3BIWM3teDAFI4N\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"dm3oqXYLv67xRgEN9IEgs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"mQIrB9KHOJrTXNsIhTf3X\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"bool_equal\\\":{\"}],\"id\":\"cFoES4caJaEmlBBOHSKJr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:secure-transport\\\":\\\"true\\\"\"}],\"id\":\"MWLu1yo2QBavv4U97Zhgl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"KkNDZULt8bqccZURwY_Gp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"T4XC_grfP8Yxg704o5Si2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"wmRF3CiLG9xT0WYu0h3u8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"BqvfIMhzip4bJYuGzKE9O\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"3ZNXeHSpNA6UvZfPWLVai\",\"type\":\"code-line\"}],\"id\":\"91iGIXtbtYUcFHSTYJFl0\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"예시2: 비 HTTPS 요청 거부\"}],\"id\":\"-_3c1onOK0sIjxCcmr1is\",\"nodeId\":\".EC.98.88.EC.8B.9C2.3A-.EB.B9.84-https-.EC.9A.94.EC.B2.AD-.EA.B1.B0.EB.B6.80\",\"type\":\"h4\"},{\"children\":[{\"text\":\"버킷 examplebucket-1250000000을 소유하고 uin이 100000000001인 루트 계정이 다음 버킷 정책을 사용하여 uin이 1000000000002인 서브 계정에서 보낸 비 HTTPS 요청을 거부한다고 가정합니다.\"}],\"id\":\"KqVfbe0mjKFsbsQxXHrP0\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"TKeakp6ovr1Cd5VN3ohG7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\",\"}],\"id\":\"ekzAbPxDeLeh3PYpT2OUP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"FTLOttg4GxF32uPOB6JUT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"NSobszc2uy1VuTE5ULN56\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"WG8DytutwoHXxsHqp_8xi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"wopaiDgAFhne_wvSURTvs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"lYm2UAdjB0_qSrr9ANTIA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"DwuixIPxX1Ry1kVTk8bBM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"KiQE4-2A0CpDNUA6wI-Xu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"deny\\\",\"}],\"id\":\"GJn9yGuUKl3QMfGwJyTNz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"giuT0vd1pBtH8lyVKACDH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"*\\\"\"}],\"id\":\"MZwO_HXWx4Fmk6rS4vqMh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"fibOyk5BJl2RY-MXIWX-C\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"hfHLU2-ZwhkTTnT0vaEHF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"uuAfpKSzhLfoJIitasoO_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"Kz8D3Fzkaw9LVovG8k1Za\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"TBn7ZDWEptEWugfPHyG5H\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"bool_equal\\\":{\"}],\"id\":\"Rx5sNGPjkUJjRxdm8R8zm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:secure-transport\\\":\\\"false\\\"\"}],\"id\":\"jX93D3fGcTykHnILSHZW7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"15NGULXm1HLsVzKgbIEB9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"ATs2heUieNUMZ5MPzpkjE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"AE6YnGtjHHcwKav_68L9j\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"FD2Pj4xcu7r2LzXUp0dzK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"7tj1cJCYbqwDhyKyzEmLX\",\"type\":\"code-line\"}],\"id\":\"w5MrVIyVWVmHDgZyPNoHU\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"지정된 스토리지 클래스 설정 허용(cos:x-cos-storage-class)\"}],\"id\":\"CqDHbzfntzAfdQI0JbWRk\",\"nodeId\":\"x-cos-storage-class\",\"type\":\"h2\"},{\"children\":[{\"text\":\"요청 헤더 x-cos-storage-class\"}],\"id\":\"-uGdi661A9sA45bZMgB9m\",\"nodeId\":\".EC.9A.94.EC.B2.AD-.ED.97.A4.EB.8D.94-x-cos-storage-class\",\"type\":\"h4\"},{\"children\":[{\"text\":\"요청 헤더 \"},{\"code\":1,\"text\":\"x-cos-storage-class\"},{\"text\":\"를 사용하여 객체를 업로드할 때 객체의 스토리지 클래스를 지정하거나 수정할 수 있습니다.\"}],\"id\":\"r7tn_Le12G7bz9D8zeEfu\",\"type\":\"p\"},{\"children\":[{\"text\":\"조건 키 cos:x-cos-storage-class\"}],\"id\":\"3A2dMU1qbrpcFvyczXg_T\",\"nodeId\":\".EC.A1.B0.EA.B1.B4-.ED.82.A4-cos.3Ax-cos-storage-class\",\"type\":\"h4\"},{\"children\":[{\"text\":\"조건 키 \"},{\"code\":1,\"text\":\"cos:x-cos-storage-class\"},{\"text\":\"를 사용하여 요청 헤더 \"},{\"code\":1,\"text\":\"x-cos-storage-class\"},{\"text\":\"를 제한하여 스토리지 클래스 수정 요청을 제한할 수 있습니다.\"}],\"id\":\"YMQgMKun-923ZEp8Ijflm\",\"type\":\"p\"},{\"children\":[{\"text\":\"COS의 스토리지 클래스 필드에는 STANDARD, MAZ_STANDARD, STANDARD_IA, MAZ_STANDARD_IA, INTELLIGENT_TIERING, MAZ_INTELLIGENT_TIERING, ARCHIVE 및 DEEP_ARCHIVE가 있습니다.\"}],\"id\":\"8Fx3xghQNH0CXbdf-EWqH\",\"type\":\"p\"},{\"children\":[{\"text\":\"예시: PutObject 요청 시 스토리지 클래스를 반드시 STANDARD로 설정\"}],\"id\":\"ewddfivn-DAqMWvVBbEEB\",\"nodeId\":\".EC.98.88.EC.8B.9C1.3A-putobject-.EC.9A.94.EC.B2.AD-.EC.8B.9C-.EC.8A.A4.ED.86.A0.EB.A6.AC.EC.A7.80-.ED.81.B4.EB.9E.98.EC.8A.A4.EB.A5.BC-.EB.B0.98.EB.93.9C.EC.8B.9C-standard.EB.A1.9C-.EC.84.A4.EC.A0.95\",\"type\":\"h4\"},{\"children\":[{\"text\":\"버킷 examplebucket-1250000000을 소유하는 uin이 100000000001인 루트 계정이 다음 버킷 정책을 사용하여 값이 STANDARD인 x-cos-storage-class 헤더를 전달하기 위해 uin이 100000000002인 서브 계정에서 보낸 PutObject 요청을 제한한다고 가정합니다.\"}],\"id\":\"jmo-lNj-Im_cal5wfxaLi\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"43DFq04-SjvezwLuRhgx3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\",\"}],\"id\":\"LzMyNV5xbJJQcYoIzueV9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"G20sMPA0GfGcPU1jjy2wY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"uYZq5i3QdMr8BXq5MsjB3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"QlFH1_s98Rwnvt9GUvU9l\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"7r3f44mHA0f-auRIOvS98\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"staYQW4Yl2l9UaayT2pAs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"oGKUkaNE2b_7ADzyRbfBy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"4FmioUyBqwoRkfKyJ2EWg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"8U6YwyMEB-qJeI-Set8vO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"jg9PX1yexW3oiTVn9N9sN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\"\"}],\"id\":\"hGc7y65AtPGE8FJaE_JeP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"4J1Ime9A6o8gPGhjdoIqc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"cvzCSVvHzZ0X4VyFOUYYp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"Rq7yxf3m5M2fxKO95LQ7m\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"eaNN-crHbP9N_v9Dsgvqc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"CEm_C6bESOXFIdFeZ7SJZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_equal\\\":{\"}],\"id\":\"i28csHRXSiJmi-q3iE45-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:x-cos-storage-class\\\":\\\"STANDARD\\\"\"}],\"id\":\"rsYYlCDTaQ8DVDaB2E0hL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"ZUCbJVOt_h_d2mIV6pjgo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"StOzl7Rh3_oVHZ7N0B08W\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"gLshVH-zSFtqb9eswvpjD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"sbNOtuC-wLE0D0coRGwuS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"ebw6nYDuCp4AMG9tDp_-z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"QZ5YsgouEIGPkVXTn7Oya\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"3AQETb_3idfIt2BkfqSwO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"biEq3H1UtGkauSGxbgDUT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"fhWUgrdeSrS91CI1vVdWp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"deny\\\",\"}],\"id\":\"nTJf4a0uOiCAwpGT8BCEh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"Y4m_GlyFzZUeM0HfPYBpW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\"\"}],\"id\":\"9o_CY9iRETCJSBuIdInsg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"uB3JD7p4IEMG1bFkKqTbY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"GTOyr97igf_NHDlyBInqL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"pXCjfhwLKCvQxhyO6vYA9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"6HrdU1le8Rv-NzpuyDyOQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"uPpKmqGLDUmUvSjd54nwR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_not_equal_if_exist\\\":{\"}],\"id\":\"_pBRk6L2xPnPn7PRNjL8d\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:x-cos-storage-class\\\":\\\"STANDARD\\\"\"}],\"id\":\"JOz9whNzDKzqletZMGjX1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"grBvG-4jzr1hml0m1EOIy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"SG_xVgZQKjZ2EGsEswvKF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"7eBTlyjBHgWZGV5zwr5x6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"wBTGR5oZta0Nr8SAS1UCC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"QKamdSutlo8jaaJDiPsWE\",\"type\":\"code-line\"}],\"id\":\"os4CRQ-c8m_7iqRTF6T81\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"지정된 버킷/객체 ACL 설정 허용(cos:x-cos-acl)\"}],\"id\":\"tl8zTh4uxxulq71PevlDT\",\"nodeId\":\"x-cos-acl\",\"type\":\"h2\"},{\"children\":[{\"text\":\"요청 헤더 x-cos-acl\"}],\"id\":\"w8eOH-Amq154O9X0ShRDl\",\"nodeId\":\".EC.9A.94.EC.B2.AD-.ED.97.A4.EB.8D.94-x-cos-acl\",\"type\":\"h4\"},{\"children\":[{\"text\":\"객체를 업로드하거나 버킷을 생성할 때 요청 헤더 \"},{\"code\":1,\"text\":\"x-cos-acl\"},{\"text\":\"을 사용하여 ACL을 지정하거나 객체 또는 버킷 ACL을 수정할 수 있습니다. ACL에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"ACL\"}],\"id\":\"YRngAR2sB_Ovnb4Ls8km3\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/30583\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/30583\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"KAAKa1gazl7p2HMJC3Yeb\",\"type\":\"p\"},{\"children\":[{\"text\":\"버킷용 사전 설정 ACL: \"},{\"code\":1,\"text\":\"private\"},{\"text\":\", \"},{\"code\":1,\"text\":\"public-read\"},{\"text\":\", \"},{\"code\":1,\"text\":\"public-read-write\"},{\"text\":\", \"},{\"code\":1,\"text\":\"authenticated-read\"},{\"text\":\".\"}],\"id\":\"54dDn9bhLEhhY7BIAwIVp\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"객체에 대한 사전 설정 ACL: \"},{\"code\":1,\"text\":\"default\"},{\"text\":\", \"},{\"code\":1,\"text\":\"private\"},{\"text\":\", \"},{\"code\":1,\"text\":\"public-read\"},{\"text\":\", \"},{\"code\":1,\"text\":\"authenticated-read\"},{\"text\":\", \"},{\"code\":1,\"text\":\"bucket-owner-read\"},{\"text\":\", \"},{\"code\":1,\"text\":\"bucket-owner-full-control\"},{\"text\":\".\"}],\"id\":\"aL89jfSuT5FZU5f2aUIJk\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"조건 키 cos:x-cos-acl\"}],\"id\":\"oUlDIInaQ6-bU2z57RxXA\",\"nodeId\":\".EC.A1.B0.EA.B1.B4-.ED.82.A4-cos.3Ax-cos-acl\",\"type\":\"h4\"},{\"children\":[{\"text\":\"조건 키 \"},{\"code\":1,\"text\":\"cos:x-cos-acl\"},{\"text\":\"을 사용하여 요청 헤더 \"},{\"code\":1,\"text\":\"x-cos-acl\"},{\"text\":\"을 제한하고 객체/버킷 ACL 수정 요청을 제한할 수 있습니다.\"}],\"id\":\"W_kmSsmvv-Pf4f78OXC2m\",\"type\":\"p\"},{\"children\":[{\"text\":\"예시: PutObject 요청에서 객체 ACL을 비공개로 설정 필요\"}],\"id\":\"JcIuzrKYxdc7YDZpL6uPj\",\"nodeId\":\".EC.98.88.EC.8B.9C1.3A-putobject-.EC.9A.94.EC.B2.AD.EC.97.90.EC.84.9C-.EA.B0.9D.EC.B2.B4-acl.EC.9D.84-.EB.B9.84.EA.B3.B5.EA.B0.9C.EB.A1.9C-.EC.84.A4.EC.A0.95-.ED.95.84.EC.9A.94\",\"type\":\"h4\"},{\"children\":[{\"text\":\"examplebucket-1250000000 버킷을 소유하는 uin 100000000001의 루트 계정이 다음 버킷 정책을 사용하여 uin이 100000000002인 서브 계정을 제한하여 프라이빗 객체만 업로드한다고 가정합니다. 정책은 모든 PutObject 요청이 \"},{\"code\":1,\"text\":\"private\"},{\"text\":\" 값을 가진 x-cos-acl 헤더를 전달하도록 요구합니다.\"}],\"id\":\"FaEP8l7EoIW_RRALz6w67\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"FHHnNEZ3FZt936wppS7on\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\",\"}],\"id\":\"o7UJ8JjR4HCr3OHlxXFPK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"UxhOE-ZVxQBbLT4rLEV_S\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"cb8N3Fw988_1BH5PJ5jCE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"ynU30zMurZbOV6BejDaRC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"QjqsbX4l3S0Z_xuSZGrM-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"n6P9vI-87TNgERHTQisj1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"CZkZgwQx67D0gIt9Ik0Aj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"nmRAh6-zkvPgk-5tg6gA9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"hH1paoAV9qkWcPncNEaDx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"oBetLkk0ivIZNt1Cjxdzf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\"\"}],\"id\":\"7EYn0aFXOGKBF-PJ6mbnP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"BZnMnOiLHrH-5vTd2z_tz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"OEoUxklL9aBd0A9DdvjnR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"4UU5FzhIHcA29-1juXpAK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"XoFDjQNgD6i4cQo78mqXe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"-4gjXILqAn0n45JhtSSGr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_equal\\\":{\"}],\"id\":\"JUVEHxzcYRpvY0rcKYnsR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:x-cos-acl\\\":\\\"private\\\"\"}],\"id\":\"w5c1nDfETjlQhKCgS3u5Z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"AcDauFglrv1A6JqiClV0e\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"QqSxaNiqrNs2fxWEtGMvm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"Q3qIXyAaFftF5K3uWkp6X\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"1VJDCXEzFFjK6y94olX66\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"ecO0Hk3boe3Z4JQTvwx83\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"LKj7If5USawITdzGn11Fz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"_9Umq_f0WhIYZqb9-LJ4H\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"v1BWTzGPXpvJaiBgJ_u35\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"P24AeDINZA-_V2h5Q9RL5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"deny\\\",\"}],\"id\":\"f72Oui1Shjotx3t9gw86Q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"NwJVt3GH6s8O5T6KaCh2B\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\"\"}],\"id\":\"BPfwZ9Qw_ZYkVuDos8Igm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"mTDcVtHV6ixNbhZbu0m0S\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"vlUZzXi-wyZB-67IoJtpS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"l1oOY1vhEwkJnxAvoRDIN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"ardfzpTkN5uZ3kl2rTl6l\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"MPf9IvwXWh43rwuwI2Gcr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_not_equal_if_exist\\\":{\"}],\"id\":\"kNePfvephnQAgnYpr-dPA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:x-cos-acl\\\":\\\"private\\\"\"}],\"id\":\"p1nOphvCYDYWsKUrgmV9X\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"14dvbVdrFweKmsj95dBlJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"MLkjltN4UVG-ctbMIHegp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"Sp2_cJb09WoHfqb-LTaoy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"OqCWZbBs5--_IjngZ8E6d\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"36P-y4w_cA4G1zahufKpI\",\"type\":\"code-line\"}],\"id\":\"upjHFVJJ8JyjZWqaHnUpp\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"지정된 디렉터리에서만 객체 나열 허용(cos:prefix)\"}],\"id\":\"2a5sDY3rKb1lyeNMMPdMM\",\"nodeId\":\"prefix\",\"type\":\"h2\"},{\"children\":[{\"text\":\"조건 키 cos:prefix\"}],\"id\":\"GPB2enWXVSvmY73ctesb1\",\"nodeId\":\".EC.A1.B0.EA.B1.B4-.ED.82.A4-cos.3Aprefix\",\"type\":\"h4\"},{\"children\":[{\"text\":\"조건 키 \"},{\"code\":1,\"text\":\"cos:prefix\"},{\"text\":\"를 사용하여 요청 매개변수 prefix를 제한할 수 있습니다.\"}],\"id\":\"WipKTC0qZzD6O8_sc0WPg\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"id\":\"GxhiHzeGjyKB7MHdPeSoY\",\"type\":\"p\"},{\"children\":[{\"text\":\" prefix 값에 중국어 및 \"},{\"code\":1,\"text\":\"/\"},{\"text\":\"와 같은 특수 문자가 포함된 경우 버킷 정책에 쓰기 전에 값을 인코딩(urlencode)해야 합니다.\"}],\"id\":\"-IQiXHqUgajbMYB7cq-Vr\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"xUyR4qT7mu2TBLVQpjdPP\",\"type\":\"hint\"},{\"children\":[{\"text\":\"예시: 버킷의 지정된 디렉터리에 있는 객체만 나열 허용\"}],\"id\":\"ScKeUQH4V24gTIDwg7Umu\",\"nodeId\":\".EC.98.88.EC.8B.9C1.3A-.EB.B2.84.ED.82.B7.EC.9D.98-.EC.A7.80.EC.A0.95.EB.90.9C-.EB.94.94.EB.A0.89.ED.84.B0.EB.A6.AC.EC.97.90-.EC.9E.88.EB.8A.94-.EA.B0.9D.EC.B2.B4.EB.A7.8C-.EB.82.98.EC.97.B4-.ED.97.88.EC.9A.A9\",\"type\":\"h4\"},{\"children\":[{\"text\":\"버킷 examplebucket-1250000000을 소유하는 uin이 100000000001인 루트 계정이 다음 버킷 정책을 사용하여 버킷의 folder1 디렉터리에 있는 객체만 나열하도록 uin이 100000000002인 서브 계정을 제한한다고 가정합니다. 다음 버킷 정책은 서브 사용자가 GetBucket 요청을 할 때 반드시 prefix 매개변수를 포함해야 하며, 그 값은 \"},{\"code\":1,\"text\":\"folder1/\"},{\"text\":\"여야 함을 규정합니다. prefix 값에 특수 문자 \"},{\"code\":1,\"text\":\"/\"},{\"text\":\"가 포함되어 있으므로, 정책을 작성하기 전에 해당 값을 urlencode 처리해야 하며, 따라서 정책 구문에서는 \"},{\"code\":1,\"text\":\"folder1%2F\"},{\"text\":\"로 표현됩니다.\"}],\"id\":\"CW0gb3sqPqTrozpA6FFHF\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"fLSyUwWwtBjaWQBSRpqtB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"8rth8Uk9m-matf5kXFdKh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"UqUy8_6JN5PSwGx9o0qhR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"3QFTwaHtFxw_jf71wAtTr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"LDpau3imaFonaYfW6Xdgw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"3HZ6lOYATibT7FcJtNmuZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"XK4aBkm-AhtjjPBDmY9rO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"7wknpgObIlrZe1aJMMEw3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"XfqZf-SM9KMPBpFYzIWk_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"AXE8YTr-_nQkBdJqXK5un\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetBucket\\\"\"}],\"id\":\"odval-s8isagEOso75UYM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"GIuk3GIdam0iSsEM3TRUQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"tMKQzyweXZqBUkKkqXMit\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"96vqNkUc4mZ1Xl0rcEU3B\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"7JgS3bl_AKKbEYSgIYFW-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"LHsjWBAWK4vpoRCdyBxm0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_equal\\\":{\"}],\"id\":\"SbM-oo0e7ZKlpdONT8mOu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:prefix\\\":\\\"folder1%2F\\\"\"}],\"id\":\"dGYs3djvJzccYJsOGXqVg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"u7r3s2zSpg8FXIO6XZm9b\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"LKzde5lkX8e4Zl_Z8pP2F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"OVr7_Ff-O50MNenYqzjJ8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"fPB12D-cV1YDwLmpbYChP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"96wK9Xntsg0hM95kg4hhn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"67VwvGk1C8BCKxxJWP9zd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"57jhl1mK3BN4MnyicTt60\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"IfRA-D-cO-IiZ-nsJ8L4E\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"Ksg-anDgh0tVdiYMxxCkk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"deny\\\",\"}],\"id\":\"psKqybJWEi91W5i9URng3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"Y-2AF1S-QnbIppCcJB5JA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:GetBucket\\\"\"}],\"id\":\"Y8gbjZ4MJBpAX8QIZGYyt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"u9My_F-4Z8vUiF_aEFh9E\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"7c7MIrKuc0onI7uY1MR9q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"rPausIS6fRjAl-rDkBnS6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"htX0o308aeQBHMJLIghrA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"gnrGADQHYrfLTdUXLYZo0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_not_equal_if_exist\\\":{\"}],\"id\":\"8x53ne83dpr4hYRwZvMb0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:prefix\\\":\\\"folder1%2F\\\"\"}],\"id\":\"W-1yqdIyZyZhCKuEy4ZzX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"JW0bjIO_mffx99gAMfz5t\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"F8Ce8nJb_Pq3LA61vFaO1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"N1nlJbkEqc9j0mh7Kcq0W\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"-Tf3v2ph7vXTeaBlQofY8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\"\"}],\"id\":\"PGtIWtnaBqYr_ZLw83lHg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"f4zWw-CablNjlWEXjiKqb\",\"type\":\"code-line\"}],\"id\":\"wCa9e1_ZEi31voMDKUVkX\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"지정된 버전의 TLS 프로토콜만 사용 허용(cos:tls-version)\"}],\"id\":\"hiECEzKHWXuw-tpU1iacd\",\"nodeId\":\"tls-version\",\"type\":\"h2\"},{\"children\":[{\"text\":\"조건 키 cos:tls-version\"}],\"id\":\"8CIi8F_uv3znkMlKD8mm1\",\"nodeId\":\".EC.A1.B0.EA.B1.B4-.ED.82.A4-cos.3Atls-version\",\"type\":\"h4\"},{\"children\":[{\"text\":\"조건 키 \"},{\"code\":1,\"text\":\"cos:tls-version\"},{\"text\":\"을 사용하여 HTTPS 요청의 TLS 버전을 제한할 수 있습니다. 해당 값은 Numric 유형이며 1.0, 1.1 또는 1.2와 같은 부동 소수점을 지원합니다.\"}],\"id\":\"QoUgjqG2KpuaueY6ej2ti\",\"type\":\"p\"},{\"children\":[{\"text\":\"예시1: TLS v1.2를 사용하는 HTTP 요청만 승인\"}],\"id\":\"cARfGhkQdTTU5pYROhz2R\",\"nodeId\":\".EC.98.88.EC.8B.9C1.3A-tls-v1.2.EB.A5.BC-.EC.82.AC.EC.9A.A9.ED.95.98.EB.8A.94-http-.EC.9A.94.EC.B2.AD.EB.A7.8C-.EC.8A.B9.EC.9D.B8\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"요청 시나리오\"}],\"id\":\"ydEM4urSuOoqfJ2Th4xAv\",\"type\":\"p\"}],\"id\":\"CODrN6VNGicFJNfKyAWqg\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"예상 결과\"}],\"id\":\"3sx2T9JTkZw9xcWbfIvvm\",\"type\":\"p\"}],\"id\":\"KWWXL2CZtdBvj1VcuYOH_\",\"type\":\"cell\"}],\"id\":\"Bi5fo9QfrT575r03jyhmx\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"TLS v1.0을 사용한 HTTPS 요청\"}],\"id\":\"cG9C-X7kxyz417BCoju-4\",\"type\":\"p\"}],\"id\":\"dVyeuNz3rZzuADSj5uu_5\",\"type\":\"p\"}],\"id\":\"WOf41GD0YwpzUzOCuT-5u\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"403, 실패\"}],\"id\":\"b4o8YVx7pFeC_UXu8WdlW\",\"type\":\"p\"}],\"id\":\"ozV5zKTIu2ew7QhL4fKuR\",\"type\":\"p\"}],\"id\":\"1NAr5crpMQtM4UytbVu5q\",\"type\":\"cell\"}],\"id\":\"B6XtF9ExrdgYq29lW0n30\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"TLS v1.2를 사용한 HTTPS 요청\"}],\"id\":\"RS5cSwRfrlQM6cFpRswyF\",\"type\":\"p\"}],\"id\":\"gUVTlDH6j25BkCuEfZqnQ\",\"type\":\"p\"}],\"id\":\"O4ulJKS0qL9vNmIym_5sx\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"200, 성공\"}],\"id\":\"LM3HLoZkaCkcAIAntcjRR\",\"type\":\"p\"}],\"id\":\"nxG7N-MamlKvjt83N_A94\",\"type\":\"p\"}],\"id\":\"bRmFhkRSzDrM0zMCw97pW\",\"type\":\"cell\"}],\"id\":\"WRzU0gOSJngImPURGUaPf\",\"type\":\"row\"}],\"columnHeader\":false,\"id\":\"6QFldWzjfB9I3NYp_VWrJ\",\"rowHeader\":true,\"type\":\"table\"},{\"children\":[{\"text\":\"정책 예시는 다음과 같습니다.\"}],\"id\":\"uifgiRdT4roaAXXM-1tuZ\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"TC597NvUrryYmEqZpUCHU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\",\"}],\"id\":\"FBEtiqNapN4bm9r-firW7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"xyhIZCaK7F1h-lzMs7EVN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"MAYDCVNI6PCMEGLor8PKw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"p5Eo86Mvn5v2anSW4d5Uc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"4yipQxsSV5UQqQ7SKqVYm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"GXA4xRB2nkB39HdY3Pk9r\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"Z8f2kG1bc4usg9tv4D1M_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"Mgs4y6KvBicxMjZfiUXAc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"hRHfAMehBiWnzttK1rnIW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"ua9xcHFkC0JMlC_niMwnC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"*\\\"\"}],\"id\":\"5hfLekWR6q_SlCbTQ8VZo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"1O1Jn60jYhh48oDqv-vhj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"sAjDqUaGD3GS9ktJsibJt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"0zecMpwZrz7-DHXo2YtQg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"qVsoYd8GvBM_SmE9moJb1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"KRC7308P7habx1kjfpPQh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"numeric_equal\\\":{\"}],\"id\":\"kSnGW2MacZ-HQUOVas5oL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:tls-version\\\":1.2\"}],\"id\":\"sgtl7NSIhOfv0VohaSgO5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"f6ag8PagEJkdqSITC8CCW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"FI51mWl5nMEfTGCgL4-Ho\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"TOsYiUxxrrjnIekYtmghf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"y6CcknChTpN6yfAuCxeI-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"HRqVueTshpaQZ1lGyUzNK\",\"type\":\"code-line\"}],\"id\":\"tvUGgKilWzk4uiz9yUxKz\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"예시2: v1.2 이전의 TLS를 사용하는 HTTP 요청 거부\"}],\"id\":\"oy-mGCIIGpHYORR4OW4dF\",\"nodeId\":\".EC.98.88.EC.8B.9C2.3A-v1.2-.EC.9D.B4.EC.A0.84.EC.9D.98-tls.EB.A5.BC-.EC.82.AC.EC.9A.A9.ED.95.98.EB.8A.94-http-.EC.9A.94.EC.B2.AD-.EA.B1.B0.EB.B6.80\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"요청 시나리오\"}],\"id\":\"ZoJJuY-pA2_lf_sUb6Us-\",\"type\":\"p\"}],\"id\":\"sA8gr-tjVgF85nInccVFJ\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"예상 결과\"}],\"id\":\"ZfplrwQ3B6DWwMQ_Xvl1X\",\"type\":\"p\"}],\"id\":\"s25HC0UaR5Qdyx3bxYpmd\",\"type\":\"cell\"}],\"id\":\"NDYiaqf98ERaz6Ga7b6eK\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"TLS v1.0을 사용한 HTTPS 요청\"}],\"id\":\"MvdCsrSa2l8mzNi-9Mhu-\",\"type\":\"p\"}],\"id\":\"4q6A8PzvASQn-rOVzl6Tz\",\"type\":\"p\"}],\"id\":\"p8PV4JjlyTb3qmarmZD9a\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"403, 실패\"}],\"id\":\"oxfwA41mKtcWWgwbnAvJz\",\"type\":\"p\"}],\"id\":\"aiFGgg9hWFyxQLFs0mByf\",\"type\":\"p\"}],\"id\":\"2cFiY6i1qxo1LGOQDqUFj\",\"type\":\"cell\"}],\"id\":\"M1AVcTyYKfzEg60x_z8cP\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"TLS v1.2를 사용한 HTTPS 요청\"}],\"id\":\"SUWm2P4UBCnSleiveSlz5\",\"type\":\"p\"}],\"id\":\"dsdiv9B7emBNhRkgdCiX7\",\"type\":\"p\"}],\"id\":\"SazhzD2DAZ8fCbRPx438l\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"200, 성공\"}],\"id\":\"3_a846-ve1C6eeVUUqCqy\",\"type\":\"p\"}],\"id\":\"oxf1WBiY5Qqyw6a5z6hgZ\",\"type\":\"p\"}],\"id\":\"YwyS5L3MpxHyVUkqZ3NJ1\",\"type\":\"cell\"}],\"id\":\"pkgCOAmXy2YG0hvu0OL_5\",\"type\":\"row\"}],\"columnHeader\":false,\"id\":\"O-2UoMTkzmfLkOCJfjKwa\",\"rowHeader\":true,\"type\":\"table\"},{\"children\":[{\"text\":\"정책 예시는 다음과 같습니다.\"}],\"id\":\"gVn17IoiBD4IyrtytmaTP\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"ouxXNPHPU7NCdbCJbtd3C\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\":\\\"2.0\\\",\"}],\"id\":\"6hPBgl4WX0wJndsQJlCp4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\":[\"}],\"id\":\"1HD-BTzYbOAT9XVaGHx85\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"k3oWmsp72lAZOhc15ytA2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"DHvc9DbIZ_u_4AWoS-cXW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"y5ahcqu_QHjAf3ZL1T8Ow\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"dPC-lDWOJ1lec-izwimTx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"SncOkhwIJo-pB2oRJAayN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"FQNzgVVix_mo-LXQpK3GX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"allow\\\",\"}],\"id\":\"MOEAdkBh-EqP6ukg8Mz0V\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"b6_Htnv2QVDYxTCasNsby\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"*\\\"\"}],\"id\":\"tCTWez_GyGDfdwq18cyVu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"2Q0ac927AP1bS5pBg5QsO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"h5NsJYHMpguMbdssu-0U8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"kCH-vMWc5k_xFPtzhAm7d\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"hrahAxjMYVYjTfYnwrMyc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"FyB1JyIxZVqodSD9fjJ_V\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"numeric_greater_than_equal\\\":{\"}],\"id\":\"kn2Rp6hc-0jtrpHyFjMlB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:tls-version\\\":1.2\"}],\"id\":\"RViORmTpukLLz19AYnA0J\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"wXlmUnqKE9urL_0qALV7x\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"zAP4ky1KtcoSJkxm3vdut\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"Ww44C9duGm0hkslhzy6Yn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"Be_l0QyrRellSi4inxkG2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"kIFfyXcTwRPv8tzRjrzPi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"g8p_AeCYOc8cghl1b_eR9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"4vCiW5y-KcsFM0chpDUoE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"j7y38zdtNod0Y5IdBADrO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"66vvlt9bS9Z8s240sCc5E\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\":\\\"deny\\\",\"}],\"id\":\"hQBxWn7Rq2Dle8MBVFkh4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"-j5j9SW2oDoYif2CDmMkS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"*\\\"\"}],\"id\":\"udQ9869dQR1_1GYeyVXqr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"TzKbAPbr_OEiJvHVqZXTc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\":[\"}],\"id\":\"1LJRKtKhNN6fnasAoP48T\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"ZP5yfthFO-lfGF8Y0Qz3l\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"k0HazBJCGWsOWkk1o6YBx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"HMXBq5uU8VFZ0SK61AcLA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"numeric_less_than_if_exist\\\":{\"}],\"id\":\"qnGiSO2mAYgU_b5uFYQgH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:tls-version\\\":1.2\"}],\"id\":\"UbPmCVMrTi297IaXmoFuA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"YQusGQZB1LSLWvEw2YGk1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"A5J-Vn5t6myvbHAEaJt2K\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"XTwkf5OT7SUYkV1e75Mes\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"7nJ6wmEDc4suIMzykwfFa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"FqvnHBvzrd-RAidOCU8Xy\",\"type\":\"code-line\"}],\"id\":\"BXRAmrbxoqrVGL0jsVSSv\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"버킷 생성 시 지정된 버킷 태그 강제 설정(qcs:request_tag)\"}],\"id\":\"BGnqMpU9lHM7sQ-ICGWKg\",\"nodeId\":\"request_tag\",\"type\":\"h2\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"},{\"text\":\"\\nrequest_tag 조건 키는 PutBucket 및 PutBucketTagging 작업에만 적용되며 GetService, PutObject 또는 PutObjectTagging에는 적용되지 않습니다.\"}],\"id\":\"Y_Yx0ZpmJZN5P9oh1aS_5\",\"type\":\"p\"}],\"hintType\":\"info\",\"id\":\"XWLLCHTEIUl4ymklxd7nI\",\"type\":\"hint\"},{\"children\":[{\"text\":\"조건 키 qcs:request_tag\"}],\"id\":\"I6ztAF1NHu6U6ewDXDkXK\",\"nodeId\":\".EC.A1.B0.EA.B1.B4-.ED.82.A4-qcs.3Arequest_tag\",\"type\":\"h4\"},{\"children\":[{\"text\":\"조건 키 \"},{\"code\":1,\"text\":\"qcs:request_tag\"},{\"text\":\"를 사용하여 PutBucket 또는 PutBucketTagging 요청을 시작할 때 사용자가 지정된 버킷 태그를 포함하도록 제한할 수 있습니다.\"}],\"id\":\"9nRUKV9BQ4Ioh54zvZbiC\",\"type\":\"p\"},{\"children\":[{\"text\":\"예시: 사용자가 버킷을 생성할 때 지정된 버킷 태그를 포함하도록 제한\"}],\"id\":\"KW7UPp8dlvzrK74_vP1js\",\"nodeId\":\".EC.98.88.EC.8B.9C.3A-.EC.82.AC.EC.9A.A9.EC.9E.90.EA.B0.80-.EB.B2.84.ED.82.B7.EC.9D.84-.EC.83.9D.EC.84.B1.ED.95.A0-.EB.95.8C-.EC.A7.80.EC.A0.95.EB.90.9C-.EB.B2.84.ED.82.B7-.ED.83.9C.EA.B7.B8.EB.A5.BC-.ED.8F.AC.ED.95.A8.ED.95.98.EB.8F.84.EB.A1.9D-.EC.A0.9C.ED.95.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"많은 사용자가 버킷 태그를 사용하여 버킷을 관리할 수 있습니다. 다음 정책 예시는 사용자가 버킷 생성 시 지정된 버킷 태그 \"},{\"code\":1,\"text\":\"\\u003ca,b\\u003e\"},{\"text\":\" 및 \"},{\"code\":1,\"text\":\"\\u003cc,d\\u003e\"},{\"text\":\"를 설정한 후에만 권한을 얻을 수 있음을 나타냅니다.\"}],\"id\":\"V0sts9pfmb7SEBuZJLy4k\",\"type\":\"p\"},{\"children\":[{\"text\":\"여러 버킷 태그를 설정할 수 있습니다. 각기 다른 버킷 태그 키/값 및 태그 수량은 각각 다른 조합으로 사용됩니다. 요청 양식 세트 A에서 사용자가 여러 매개변수 값을 가지고 있고 조건 양식 세트 B에 지정된 여러 매개변수 값을 가지고 있다고 가정합니다. 이 조건 키를 통해 사용자는 for_any_value 및 for_all_value 한정어의 다양한 조합을 사용하여 다른 의미를 나타낼 수 있습니다.\"}],\"id\":\"QUYbmhk-pxCtacZQIVuJM\",\"type\":\"p\"},{\"children\":[{\"code\":1,\"text\":\"for_any_value:string_equal\"},{\"text\":\"은 A와 B가 교차하는 경우 요청이 적용됨을 나타냅니다.\"}],\"id\":\"DLPoEelHLEgPdDZQUXYzT\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"code\":1,\"text\":\"for_all_value:string_equal\"},{\"text\":\"은 A가 B의 subset인 경우 요청이 적용됨을 나타냅니다.\"}],\"id\":\"zC8ea3MASNopHZYTMvmAw\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"code\":1,\"text\":\"for_any_value:string_equal\"},{\"text\":\"을 사용하는 경우 해당 정책 및 요청은 다음과 같습니다.\"}],\"id\":\"gkurlaBtgImpp5MDDAwLJ\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"요청 시나리오\"}],\"id\":\"LLWnajfQjRL0i_e4Iwgjv\",\"type\":\"p\"}],\"id\":\"A7Ytd1T0vMIxqD7F_BMmL\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"예상 결과\"}],\"id\":\"PtpMN--SdmZ8Wf6sKbL-v\",\"type\":\"p\"}],\"id\":\"eVfb-jCouAmzIrcWaH9jY\",\"type\":\"cell\"}],\"id\":\"fA-0wJkiwsB3zl0MI1J95\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"PutBucket, 요청 헤더 \"},{\"code\":1,\"text\":\"x-cos-tagging: a=b\\u0026c=d\"}],\"id\":\"5GhaKbj3V-WRe3SIBBrXe\",\"type\":\"p\"}],\"id\":\"IXRiDTSo2WWFVoA6DCM8t\",\"type\":\"p\"}],\"id\":\"y7kFKnRnP6EeU4fGk05SU\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"200, 성공\"}],\"id\":\"vORboGcSuViUwJrr4tEob\",\"type\":\"p\"}],\"id\":\"jrsZPqRp_NUtPO7mSkgLb\",\"type\":\"p\"}],\"id\":\"fm_6ttcrDaMhiiIxBtMlf\",\"type\":\"cell\"}],\"id\":\"zzI3Yw9WZAShKG8Bk5OMj\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"PutBucket, 요청 헤더 \"},{\"code\":1,\"text\":\"x-cos-tagging: a=b\"}],\"id\":\"zQ3cwtiRWpM_dy4hs8Py5\",\"type\":\"p\"}],\"id\":\"h-_8qmIzvoJzvPVj83W68\",\"type\":\"p\"}],\"id\":\"_UXdkXUUeoqJkPGKbyNbX\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"200, 성공\"}],\"id\":\"MUI1tpEbHs6TLts9df4bP\",\"type\":\"p\"}],\"id\":\"dVfrBeWq1bB8v9qnSicLT\",\"type\":\"p\"}],\"id\":\"gDTP_rsXfDKprRS90Futh\",\"type\":\"cell\"}],\"id\":\"h6JjhSMRB_LLttbGZ_IP-\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"PutBucket, 요청 헤더 \"},{\"code\":1,\"text\":\"x-cos-tagging: a=b\\u0026c=d\\u0026e=f\"}],\"id\":\"rmeTCO1npE3Bd2IVMWd4x\",\"type\":\"p\"}],\"id\":\"HZ-Hjx-rdfEl0gJaAahZg\",\"type\":\"p\"}],\"id\":\"X99_tHQXOd93P4MGkMF7W\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"200, 성공\"}],\"id\":\"JK498K2zXuuHiZT9kQvJn\",\"type\":\"p\"}],\"id\":\"4YUuUAlS-37joRsCQYCC2\",\"type\":\"p\"}],\"id\":\"uv5-_DLv5jlCa7IcTO9Ra\",\"type\":\"cell\"}],\"id\":\"q9mHf8MfHoCWl4aZPiFoq\",\"type\":\"row\"}],\"columnHeader\":false,\"id\":\"8UpQF2l1RUXsctBrH6CPI\",\"rowHeader\":true,\"type\":\"table\"},{\"children\":[{\"text\":\"정책 예시는 다음과 같습니다.\"}],\"id\":\"Qikg4dAblIQ1hjVbvfHTj\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"2U5lOXRkrjKqNY2yvHT_n\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"id\":\"g0LJv3MHRmy9cs6RPZbcY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"id\":\"DZLLWBp099IcM_-p73RbW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"4V-GjtXTIezo-gZhuDqDr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"kXYZ6A-jKrs_WFgovU4Tf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"-_OD3z-FnnqnOKFfGuA6O\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"CEMw79oSQbOawK31-q8jB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"E5ZrZjA7Yo_spJVyeyShZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"8AfCDBeUEmr59_Sak1_5H\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"k8GQkGI1KVTqPROi8Vvcj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"V0xJq1Huh4z6ix8c2IVi4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutBucket\\\"\"}],\"id\":\"Z0925q5oNE4XH8oSERGFW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"S9fIVHAbVndPBRGSSAwfa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": \\\"*\\\",\"}],\"id\":\"6LWQ3Xoz01V87Y7aUspAT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"EumhbsZ7r8yKlv6yqeZ2n\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"for_any_value:string_equal\\\":{\"}],\"id\":\"7ngsp_c24Aj2ovs99-2ep\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs:request_tag\\\": [\"}],\"id\":\"oaJtkfIpp2bbn8y3VHgh-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"a\\u0026b\\\",\"}],\"id\":\"eRnJZdE08p_5vAh6t1YF-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"c\\u0026d\\\"\"}],\"id\":\"SPZ_jKZ3CiBf0wvBCTxAn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"PRhYLZZSg7uWl0EstCkwh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"ScaqunRMVmf-Tb79hrztg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"YnZhIRlH9nAGHNbDE9dUB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"5R4oLZsVPFMtjr9m7v7GN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"pfQ3XfodXGYBh23oRcsFv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"8hJJg8cWjAu7qNfG5fzNL\",\"type\":\"code-line\"}],\"id\":\"6xzP1rlpfspokLX-8rl6J\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"code\":1,\"text\":\"for_all_value:string_equal\"},{\"text\":\"을 사용하는 경우 해당 정책 및 요청은 다음과 같습니다.\"}],\"id\":\"zDlKH-19wA8589y7hEGT_\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"요청 시나리오\"}],\"id\":\"_XARhHEsoBaXz-lxo_B-J\",\"type\":\"p\"}],\"id\":\"LIAyWE2oz2k4-scrA5nZB\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"예상 결과\"}],\"id\":\"qLTe52cU0A-T3tsFVFl5j\",\"type\":\"p\"}],\"id\":\"6e2L_zlW8JXmqODAJOhSc\",\"type\":\"cell\"}],\"id\":\"In4nkGpAiYYDBYzYRmoNM\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"PutBucket, 요청 헤더 \"},{\"code\":1,\"text\":\"x-cos-tagging: a=b\\u0026c=d\"}],\"id\":\"9Khj_EHyh6ZIF7fvP0m8O\",\"type\":\"p\"}],\"id\":\"1IBqM5Te0TuZALy-ZDSbt\",\"type\":\"p\"}],\"id\":\"IPgpGQS6Bvc4ToV5b7g3x\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"200, 성공\"}],\"id\":\"lcM9ywiJEeGrltDR6_0k9\",\"type\":\"p\"}],\"id\":\"jqEvLWxrBA81bDASuKe0y\",\"type\":\"p\"}],\"id\":\"-EenhKLBsrf7LYqX7H3ql\",\"type\":\"cell\"}],\"id\":\"4S5JngWjk0bTaWTM406tY\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"PutBucket, 요청 헤더 \"},{\"code\":1,\"text\":\"x-cos-tagging: a=b\"}],\"id\":\"2v4ce0UUKIjcyQl6Sa-LO\",\"type\":\"p\"}],\"id\":\"seQ6bMhf55L2K85q9-w27\",\"type\":\"p\"}],\"id\":\"YqDimzvR589zpsGcxcn8R\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"200, 성공\"}],\"id\":\"2gZwXueQ1HUtJD8fgLhBV\",\"type\":\"p\"}],\"id\":\"HEoAY_UGlGi__bB0djky7\",\"type\":\"p\"}],\"id\":\"_fyXWrqpZqPOvFdRau0aX\",\"type\":\"cell\"}],\"id\":\"Ei28cVLkVngWT9PdUMTmo\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"PutBucket, 요청 헤더 \"},{\"code\":1,\"text\":\"x-cos-tagging: a=b\\u0026c=d\\u0026e=f\"}],\"id\":\"Q1oM39C31p_D0x86QbK-a\",\"type\":\"p\"}],\"id\":\"_vffhCoM_MrCOqsFbN9aC\",\"type\":\"p\"}],\"id\":\"pXe_pPJGsYiD5oZMKXqOd\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"403, 실패\"}],\"id\":\"ieCOcTtR5xhRHIJq20rFd\",\"type\":\"p\"}],\"id\":\"gbg-uQAGEyqmDS7KmkOlU\",\"type\":\"p\"}],\"id\":\"cInT5Itw5BtDeYKh3qkvP\",\"type\":\"cell\"}],\"id\":\"pxOLf1aP_mH7tHqrmRJ1Q\",\"type\":\"row\"}],\"columnHeader\":false,\"id\":\"V4fHPIXFFnX-pq1esGDBy\",\"rowHeader\":true,\"type\":\"table\"},{\"children\":[{\"text\":\"정책 예시는 다음과 같습니다.\"}],\"id\":\"ZLl9jKNQkBmXNoI94M21J\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"{\"}],\"id\":\"YjeC5bC7UgGyvMTXKAatO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"id\":\"Xn8eof40-mOrQdRVmfsDM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"id\":\"eYPGHPG5tM-eZNhodsFy8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"z-skG3lvxWtYzgyc5wzxD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"principal\\\":{\"}],\"id\":\"jAZG2ckE1eVaE1_E6Xv9i\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs\\\":[\"}],\"id\":\"IALzMbL1XW4Aiqt9uISmW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"IilNwDhrDK4E3N30l9EvY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"kl8E3GMSkZX7bvIm_Qx6g\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"pHQlvTMgXF0531rjncLLS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"gQYodY-y18vWYeG5xWcGB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\":[\"}],\"id\":\"Ti-sW6KJFB4GLtIh92Hwf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutBucket\\\"\"}],\"id\":\"SfoWNspvJt5lv9jyiKvee\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"cXgEHyEVG3lKvnnTeCrbp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": \\\"*\\\",\"}],\"id\":\"FcXnG5nEVyYZamnwKiJX9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\":{\"}],\"id\":\"uacnK7nf0XXVh0oUwVT1n\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"for_all_value:string_equal\\\": {\"}],\"id\":\"xKkCytpmrbtn7hiSzN3G0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs:request_tag\\\": [\"}],\"id\":\"LV9h0Z-EPtak-0Ld4cZbc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"a\\u0026b\\\",\"}],\"id\":\"aLEloRk2bZzp3Ybmr3y3w\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"c\\u0026d\\\"\"}],\"id\":\"qHhcz7veCC-drUG5SLbMC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"w7hY_onV1r16qLNF0nbCF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"KalQSgr_xb9s56-xJvuci\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"BjVd9pGmvi6bd1Q648WIv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"AaUSWXCcF7xK3YBE0tpKe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"V6YlctSNX1sbgYHYPq8Gr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"9ENzHPeMfSsigqeD-CzpF\",\"type\":\"code-line\"}],\"id\":\"Ntq599OsjMmaxWI20yIbg\",\"language\":\"json\",\"type\":\"code-block\"},{\"__nid\":\"d78133e3b4d80ef27f400d8c1bbaba6e146f6175\",\"children\":[{\"text\":\"파일 업로드 시 파일 덮어쓰기를 금지하는 요청 헤더(cos:x-cos-forbid-overwrite) 필수 포함\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"04JPnW7eRbqFqYsqzetUU\",\"nodeId\":\"bebe752d-5367-443d-aad4-51ab7b4a966c\",\"type\":\"h2\"},{\"__nid\":\"2d944d8d4075f3893a7f54546a903d3ed1d627aa\",\"children\":[{\"text\":\"조건 키 cos:x-cos-forbid-overwrite\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"X-XmaBdxhW4tsP4q1Dr0_\",\"nodeId\":\"e4040cb7-e2fd-401c-839c-868773369196\",\"type\":\"h4\"},{\"__nid\":\"a89df5af95967ec311fb5a34640f00e3548ce66d\",\"children\":[{\"text\":\"조건 키 cos:x-cos-forbid-overwrite를 사용하면 업로드 요청(PutObject, PutObject-Copy, InitiateMultipartUpload, CompleteMultipartUpload)에 반드시 요청 헤더 x-cos-forbid-overwrite를 포함하도록 제한할 수 있으며, 이를 통해 기존 객체를 덮어쓸 수 있는 요청을 엄격히 금지할 수 있습니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"cvXxnBNJe-bcIpRHSum1K\",\"type\":\"p\"},{\"__nid\":\"6346f053b057e26c921c37d605476015239fa1ef\",\"children\":[{\"text\":\"예시: 파일 업로드 요청 시 x-cos-forbid-overwrite를 true로 지정해야 함\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"90ZhmBVVR9UOox8Xdsdmn\",\"nodeId\":\"a7db9c0e-b330-47e1-910a-6f1ba1c1ab2b\",\"type\":\"h4\"},{\"__nid\":\"063dc41985bd68264a094dcd1fa60427c5fc3a3d\",\"children\":[{\"text\":\"예를 들어, 루트 계정(uin:100000000001)이 버킷 examplebucket-1250000000을 소유하고 있고, 서브 사용자(uin:100000000002)가 객체를 업로드할 때 기존과 같은 이름의 객체를 덮어쓰지 못하도록 제한해야 한다고 가정합니다. 다음 정책은 서브 사용자가 업로드 요청(PutObject, PutObject-Copy, InitiateMultipartUpload, CompleteMultipartUpload)을 수행할 때 \"},{\"code\":1,\"text\":\"x-cos-forbid-overwrite\"},{\"text\":\" 헤더를 반드시 포함하고, 그 값이 문자열 \"},{\"code\":1,\"text\":\"true\"},{\"text\":\"여야 한다는 조건을 설정합니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"WcEqjpzWThhU7trq-havp\",\"type\":\"p\"},{\"__nid\":\"9ec12ea7fc8967557657b0b4470195df3025f555\",\"autoWrap\":false,\"children\":[{\"__nid\":\"b260076e980ec3d09298af1f4fefac3718effe26\",\"children\":[{\"text\":\"{\"}],\"id\":\"ZjYvfJ_6UsWR6K5muIJjV\",\"type\":\"code-line\"},{\"__nid\":\"25ef2603ca8b1b91d731197c4df9c2c6db74bc54\",\"children\":[{\"text\":\"\\t\\\"version\\\": \\\"2.0\\\",\"}],\"id\":\"HTojai3zpK6fwsRsWbpm6\",\"type\":\"code-line\"},{\"__nid\":\"f83f8b90759b5dbf448951255057129f86e771b8\",\"children\":[{\"text\":\"\\t\\\"statement\\\": [{\"}],\"id\":\"i1O-zb5XtC0rojsujXS9D\",\"type\":\"code-line\"},{\"__nid\":\"a59c2736771ee3a3b564803c99776dfa7b721046\",\"children\":[{\"text\":\"\\t\\t\\t\\\"principal\\\": {\"}],\"id\":\"Y_Vb8yEtnqwRkcATk_DHB\",\"type\":\"code-line\"},{\"__nid\":\"2a29f208f1985b3e499dda357bc2ca62f54fc35b\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs\\\": [\"}],\"id\":\"kdhw1dwoS6WNZwprzbAuJ\",\"type\":\"code-line\"},{\"__nid\":\"926df8f5d219506c00c6a83a34a0d5522848b1a8\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"wDMYHn7QCciFl60w7hQmU\",\"type\":\"code-line\"},{\"__nid\":\"f058e113345ac72a8b218f68132f8f422de810d4\",\"children\":[{\"text\":\"\\t\\t\\t\\t]\"}],\"id\":\"fdCT0nFWbHEhNbzlvNfpm\",\"type\":\"code-line\"},{\"__nid\":\"24fc499c43548f991b1c2271e1ba41f95336c498\",\"children\":[{\"text\":\"\\t\\t\\t},\"}],\"id\":\"EKs6kQIzmSVEU0KRuyWDB\",\"type\":\"code-line\"},{\"__nid\":\"e7e4a5a367ee941bb23ecf4e6d21360307c0e99c\",\"children\":[{\"text\":\"\\t\\t\\t\\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"nZpRoESj_HsD6S9jfE3o0\",\"type\":\"code-line\"},{\"__nid\":\"11a3a0365fe1080ab2ce5e77d830baac36a66791\",\"children\":[{\"text\":\"\\t\\t\\t\\\"action\\\": [\"}],\"id\":\"VfA3ltDwq6q8ZDnq0pMrc\",\"type\":\"code-line\"},{\"__nid\":\"a8b475d4b6f71dcdcc92a4f429138eda61179ea8\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:PutObject\\\"\"}],\"id\":\"H-tq9sb6J4zmq1DHxGuT8\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"0Qo6zTTEYxpm_iVRcRr0K\",\"type\":\"code-line\"},{\"__nid\":\"3c118abbcd3715af1b41634dd0e0f22cbd1492bb\",\"children\":[{\"text\":\"\\t\\t\\t\\\"resource\\\": [\"}],\"id\":\"JIsDE1uDH3JEzuKs8Cq6K\",\"type\":\"code-line\"},{\"__nid\":\"236c10efa2d07f03d75c355780027e6bff94d79f\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"nyn9veS2a8TghTefUc1zA\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_140_14\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"xkI4ZD_KNie0-Nx_sDoHD\",\"type\":\"code-line\"},{\"__nid\":\"fe1e4c0440d22c05b996618a8cabeb668ff13257\",\"children\":[{\"text\":\"\\t\\t\\t\\\"condition\\\": {\"}],\"id\":\"we0p5PIsFwLC2G7_zHg91\",\"type\":\"code-line\"},{\"__nid\":\"3ce81c0db4ef8fb59f8b1ffd4a54fa6b67d9812b\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"string_equal\\\": {\"}],\"id\":\"GWbz3mU5xeEP5X__6PO71\",\"type\":\"code-line\"},{\"__nid\":\"4c24f7fd205b168c97b4ece75064dcd840e0c263\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"cos:x-cos-forbid-overwrite\\\": \\\"true\\\"\"}],\"id\":\"OOHdrXME-OCovz93pmm3K\",\"type\":\"code-line\"},{\"__nid\":\"df94564ba317e6dadf47532cd5d9c61a5cbb4fa0\",\"children\":[{\"text\":\"\\t\\t\\t\\t}\"}],\"id\":\"uJ39jlUsDmwSBqOsJCr1T\",\"type\":\"code-line\"},{\"__nid\":\"f255231793c82495529dd40bed95adf5b2ea14d5\",\"children\":[{\"text\":\"\\t\\t\\t}\"}],\"id\":\"ZEhQmBRlAKt6oCo0wQDeV\",\"type\":\"code-line\"},{\"__nid\":\"5c71c4b53dd13d43ca331c82e0cc16c5e75a1ed5\",\"children\":[{\"text\":\"\\t\\t},\"}],\"id\":\"Nj8Lepa07yRQfYcZ1KdWw\",\"type\":\"code-line\"},{\"__nid\":\"4a788153c4cdb05ac760af6a4f57ea1dd55e049c\",\"children\":[{\"text\":\"\\t\\t{\"}],\"id\":\"wAGldo3ACYA6TPy14Ktwl\",\"type\":\"code-line\"},{\"__nid\":\"a59c2736771ee3a3b564803c99776dfa7b721046_140_22\",\"children\":[{\"text\":\"\\t\\t\\t\\\"principal\\\": {\"}],\"id\":\"CGqRVguRj4sL_Cj-fFYSs\",\"type\":\"code-line\"},{\"__nid\":\"2a29f208f1985b3e499dda357bc2ca62f54fc35b_140_23\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs\\\": [\"}],\"id\":\"3zF3tVn1MuLGwWkdNFtFs\",\"type\":\"code-line\"},{\"__nid\":\"926df8f5d219506c00c6a83a34a0d5522848b1a8_140_24\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"zJVFJIjx3v7CfcflSh1k8\",\"type\":\"code-line\"},{\"__nid\":\"f058e113345ac72a8b218f68132f8f422de810d4_140_25\",\"children\":[{\"text\":\"\\t\\t\\t\\t]\"}],\"id\":\"BFL_wR06WSPQlsPPcyTcw\",\"type\":\"code-line\"},{\"__nid\":\"24fc499c43548f991b1c2271e1ba41f95336c498_140_26\",\"children\":[{\"text\":\"\\t\\t\\t},\"}],\"id\":\"4NUnGlBpXHb0wMR7a445D\",\"type\":\"code-line\"},{\"__nid\":\"0dd69b92f1843af376cbc34076766ba074e79a49\",\"children\":[{\"text\":\"\\t\\t\\t\\\"effect\\\": \\\"deny\\\",\"}],\"id\":\"F-xe7G_p4sOa574HGmFML\",\"type\":\"code-line\"},{\"__nid\":\"11a3a0365fe1080ab2ce5e77d830baac36a66791_140_28\",\"children\":[{\"text\":\"\\t\\t\\t\\\"action\\\": [\"}],\"id\":\"IQLpRSpuL3u1M040kT7l6\",\"type\":\"code-line\"},{\"__nid\":\"a8b475d4b6f71dcdcc92a4f429138eda61179ea8_140_29\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:PutObject\\\"\"}],\"id\":\"A8PPLhpkzcl1zxEu4_1hx\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_140_30\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"TlCbsI_a_simy3saj_ZFx\",\"type\":\"code-line\"},{\"__nid\":\"3c118abbcd3715af1b41634dd0e0f22cbd1492bb_140_31\",\"children\":[{\"text\":\"\\t\\t\\t\\\"resource\\\": [\"}],\"id\":\"B3gwhJWLJm8P2RQd8WfQC\",\"type\":\"code-line\"},{\"__nid\":\"236c10efa2d07f03d75c355780027e6bff94d79f_140_32\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"bnzFlAkwnDgPMKW_JOS0l\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_140_33\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"E7_tNXq583xCjmXw1O3eN\",\"type\":\"code-line\"},{\"__nid\":\"fe1e4c0440d22c05b996618a8cabeb668ff13257_140_34\",\"children\":[{\"text\":\"\\t\\t\\t\\\"condition\\\": {\"}],\"id\":\"XIbJHzRwmNpKpu3xZDgFa\",\"type\":\"code-line\"},{\"__nid\":\"b87fc7cb2a5ac96d8a25b4da54f6db47d073e499\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"string_not_equal_if_exist\\\": {\"}],\"id\":\"Qzal5jB3JIXtQFiEn-vtA\",\"type\":\"code-line\"},{\"__nid\":\"4c24f7fd205b168c97b4ece75064dcd840e0c263_140_36\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"cos:x-cos-forbid-overwrite\\\": \\\"true\\\"\"}],\"id\":\"XB7KGGDaJFM3zfosDQITW\",\"type\":\"code-line\"},{\"__nid\":\"df94564ba317e6dadf47532cd5d9c61a5cbb4fa0_140_37\",\"children\":[{\"text\":\"\\t\\t\\t\\t}\"}],\"id\":\"tc0Nt8cyC7uckgBL1T1xl\",\"type\":\"code-line\"},{\"__nid\":\"f255231793c82495529dd40bed95adf5b2ea14d5_140_38\",\"children\":[{\"text\":\"\\t\\t\\t}\"}],\"id\":\"dkmbTZDy88uNRxRzH2Lhg\",\"type\":\"code-line\"},{\"__nid\":\"f59d9a1ddc900c29ba91e554d276dd09622558d6\",\"children\":[{\"text\":\"\\t\\t}\"}],\"id\":\"d6ANNrCawL6fS7iDx22nM\",\"type\":\"code-line\"},{\"__nid\":\"afcecf02e6372a0c0f06464f129701d262e2d58a\",\"children\":[{\"text\":\"\\t]\"}],\"id\":\"JEs4D_OcTnMfkVbqSBNG_\",\"type\":\"code-line\"},{\"__nid\":\"29654058b578f4476937a1bcb3c2e5c295772e88\",\"children\":[{\"text\":\"}\"}],\"id\":\"icb5PhmrlVLMKNo2rcILG\",\"type\":\"code-line\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"J5aFNOFKxUpO57ccgu9SQ\",\"language\":\"json\",\"type\":\"code-block\"},{\"__nid\":\"836640618dfe71d7961d1a6444407c1737bd6316\",\"children\":[{\"text\":\"요청 도메인 제한(cos:host)\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"o1Y61xk0-x1jM5AYFqKhA\",\"nodeId\":\"89045614-2f06-4de7-9570-52da23bdce3e\",\"type\":\"h2\"},{\"__nid\":\"5da1e8020d2c50ce0ce9d618650f158d5ca27881\",\"children\":[{\"text\":\"조건 키 cos:host\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"81ZoGENacCTKcLhAU87-J\",\"nodeId\":\"19676930-b29f-4e83-bbbd-06c8b8f0c5fc\",\"type\":\"h4\"},{\"__nid\":\"64306b081ce37d6d844952774a1470576b25965f\",\"children\":[{\"text\":\"조건 키 cos:host를 통해 요청 헤더 Host를 제한하여, 접근 가능한 도메인을 제어할 수 있습니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"bdn_fvugL94XkAeRWMqbd\",\"type\":\"p\"},{\"__nid\":\"448b86d674f3f350761fb16db38c18abbde6d14c\",\"children\":[{\"text\":\"예시1: 특정 도메인을 통한 COS 접근 금지\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"6gUVEChqF-UGM4hA2yU9v\",\"nodeId\":\"9e05cbc2-4cac-4e85-b047-f05fa64eeeeb\",\"type\":\"h4\"},{\"__nid\":\"581e701bd83f0f858e5d5f612d78881604d7f0e4\",\"children\":[{\"text\":\"다음 정책은 사용자가 기본 도메인 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com을 통해 COS에 접근하는 것을 금지하고, 다른 도메인을 통해서는 접근이 가능하도록 설정하는 것입니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"I_Y_LbvYU9WMfpEq2IBid\",\"type\":\"p\"},{\"__nid\":\"3d326e685a1e6824c65741e1cd73123fc0c294d5\",\"autoWrap\":false,\"children\":[{\"__nid\":\"b260076e980ec3d09298af1f4fefac3718effe26_146_0\",\"children\":[{\"text\":\"{\"}],\"id\":\"3jP38Tz4enxEi7bEKHZhF\",\"type\":\"code-line\"},{\"__nid\":\"53ddbe9f54041b29510f61729bdb4b8a320f1466\",\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"id\":\"93sTFHGxLaURHClFLo7xe\",\"type\":\"code-line\"},{\"__nid\":\"98933de54fd6febd02cf83b7fee4206f97475a03\",\"children\":[{\"text\":\" \\\"statement\\\": [{\"}],\"id\":\"12Sch9Ah-2huDnHQTwA0Y\",\"type\":\"code-line\"},{\"__nid\":\"5e21454506bebc1f7ac7cdc2c645f01c30c7bf7c\",\"children\":[{\"text\":\" \\\"principal\\\": {\"}],\"id\":\"34GsVMkkSvrg6y8hYtX4m\",\"type\":\"code-line\"},{\"__nid\":\"1b77ad392dc7a1eef2b1e8b618b82f72eabba79e\",\"children\":[{\"text\":\" \\\"qcs\\\": [\"}],\"id\":\"ebeAMZ69M7pjIXgMoJ946\",\"type\":\"code-line\"},{\"__nid\":\"36511ba2a73de0d15a68745f0ac11b69308b713d\",\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"MvdZnGQ1qcJVHPm5kcSHZ\",\"type\":\"code-line\"},{\"__nid\":\"b7e9d7634f2faf81b43ca18011d69ba3c122ac55\",\"children\":[{\"text\":\" ]\"}],\"id\":\"kEdsIf2-Fszw4m1eJc_dH\",\"type\":\"code-line\"},{\"__nid\":\"2f4363336c0afb40e7d998780114f4708a81dbbe\",\"children\":[{\"text\":\" },\"}],\"id\":\"56EnGmolBdF8Eu6twjtFs\",\"type\":\"code-line\"},{\"__nid\":\"05a9c1e9927531f8d9828a6670a1a95a35aaffbf\",\"children\":[{\"text\":\" \\\"effect\\\": \\\"deny\\\",\"}],\"id\":\"YSTW7EZ_yQ7cyoFAliHaA\",\"type\":\"code-line\"},{\"__nid\":\"b5b78cdaea010c07bf00e016d921f25e841b3690\",\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"id\":\"qESNCs6cmsPFl4u0wRvdD\",\"type\":\"code-line\"},{\"__nid\":\"ff33aa50b10cd90ab53bc64a1fab99cb3a090c41\",\"children\":[{\"text\":\" \\\"*\\\"\"}],\"id\":\"kMAPzu1ek3b0RXXTaJdZh\",\"type\":\"code-line\"},{\"__nid\":\"daa7b5b026c01092f80e905a5bc143c4e501ed8a\",\"children\":[{\"text\":\" ],\"}],\"id\":\"Y5HLHTn79sr1l-yxM-aBU\",\"type\":\"code-line\"},{\"__nid\":\"4bb40ebf456e1fbb4afdf67da2f95b6b540a9a60\",\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"id\":\"TTU00I6gRIFVfWs7x6fmj\",\"type\":\"code-line\"},{\"__nid\":\"abd6ff0f6fc787de05164abe9261f440fc7c9f7d\",\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"jAEpPGeDIMV3koX0PyhN_\",\"type\":\"code-line\"},{\"__nid\":\"daa7b5b026c01092f80e905a5bc143c4e501ed8a_146_14\",\"children\":[{\"text\":\" ],\"}],\"id\":\"395ajv980jLYaBw0M_woM\",\"type\":\"code-line\"},{\"__nid\":\"5c03a58d41a704f105ea621d43196805a3f803d5\",\"children\":[{\"text\":\" \\\"condition\\\": {\"}],\"id\":\"SL8YTfhUwyiGWai1TfrlD\",\"type\":\"code-line\"},{\"__nid\":\"c6cf364c86621307867dde59297ec74c32fa0247\",\"children\":[{\"text\":\" \\\"string_equal\\\": {\"}],\"id\":\"8WZbGj1uAPtuPr--pa0to\",\"type\":\"code-line\"},{\"__nid\":\"45d5ef2365d86fe38cc711adef8e67feff312920\",\"children\":[{\"text\":\" \\\"cos:host\\\": \\\"examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com\\\"\"}],\"id\":\"ruHl-UzEKsfjSptFuRmR6\",\"type\":\"code-line\"},{\"__nid\":\"74c8071d576a47f52e253ddadebb59bf07516732\",\"children\":[{\"text\":\" }\"}],\"id\":\"0MlmwamU6mUFwIjcezX-w\",\"type\":\"code-line\"},{\"__nid\":\"45fa8c764ea3f60b0f2ac34a047b5f7769b6b4ce\",\"children\":[{\"text\":\" }\"}],\"id\":\"2xggwej-tEDqnEEFrivBO\",\"type\":\"code-line\"},{\"__nid\":\"128206f388b7ffa001135231a74394636768e5b6\",\"children\":[{\"text\":\" },\"}],\"id\":\"NHIchy0fNco-KTX0OIkac\",\"type\":\"code-line\"},{\"__nid\":\"f81f4bcb12a3beb9b6c7c148af1af9aeee1d2402\",\"children\":[{\"text\":\" {\"}],\"id\":\"VpeLzJzMu7fi_VNEWA2QC\",\"type\":\"code-line\"},{\"__nid\":\"5e21454506bebc1f7ac7cdc2c645f01c30c7bf7c_146_22\",\"children\":[{\"text\":\" \\\"principal\\\": {\"}],\"id\":\"jh7_X7ixFDI1p-P5h71b0\",\"type\":\"code-line\"},{\"__nid\":\"1b77ad392dc7a1eef2b1e8b618b82f72eabba79e_146_23\",\"children\":[{\"text\":\" \\\"qcs\\\": [\"}],\"id\":\"wcuafFld9MfceXLb2WSVh\",\"type\":\"code-line\"},{\"__nid\":\"36511ba2a73de0d15a68745f0ac11b69308b713d_146_24\",\"children\":[{\"text\":\" \\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"N7-XCjbXlHecArN-uj_UZ\",\"type\":\"code-line\"},{\"__nid\":\"b7e9d7634f2faf81b43ca18011d69ba3c122ac55_146_25\",\"children\":[{\"text\":\" ]\"}],\"id\":\"cUIlB-SQL7_DDhzXL9FvI\",\"type\":\"code-line\"},{\"__nid\":\"2f4363336c0afb40e7d998780114f4708a81dbbe_146_26\",\"children\":[{\"text\":\" },\"}],\"id\":\"mozuLS4X7QtdyMRZxIcUs\",\"type\":\"code-line\"},{\"__nid\":\"4069a62e1c175c43b6ef8a628872c5e0ea902525\",\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"exhfHenDJH6UtVc0L6lvK\",\"type\":\"code-line\"},{\"__nid\":\"b5b78cdaea010c07bf00e016d921f25e841b3690_146_28\",\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"id\":\"sFLDh7AN7PD3pN3G_CLl-\",\"type\":\"code-line\"},{\"__nid\":\"ff33aa50b10cd90ab53bc64a1fab99cb3a090c41_146_29\",\"children\":[{\"text\":\" \\\"*\\\"\"}],\"id\":\"TB8ozckRwyQ4K4pI-uPmw\",\"type\":\"code-line\"},{\"__nid\":\"daa7b5b026c01092f80e905a5bc143c4e501ed8a_146_30\",\"children\":[{\"text\":\" ],\"}],\"id\":\"kE91DxIncz8h2nsGHRIBP\",\"type\":\"code-line\"},{\"__nid\":\"4bb40ebf456e1fbb4afdf67da2f95b6b540a9a60_146_31\",\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"id\":\"kJMohPj00Y1tvvVWwCDZt\",\"type\":\"code-line\"},{\"__nid\":\"abd6ff0f6fc787de05164abe9261f440fc7c9f7d_146_32\",\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*\\\"\"}],\"id\":\"9OXYxhtdowUt4bfhzY4_l\",\"type\":\"code-line\"},{\"__nid\":\"daa7b5b026c01092f80e905a5bc143c4e501ed8a_146_33\",\"children\":[{\"text\":\" ],\"}],\"id\":\"ALCFm59qE3sD0skc9OrU6\",\"type\":\"code-line\"},{\"__nid\":\"5c03a58d41a704f105ea621d43196805a3f803d5_146_34\",\"children\":[{\"text\":\" \\\"condition\\\": {\"}],\"id\":\"lrceTYNKAPDAoxfnSURNp\",\"type\":\"code-line\"},{\"__nid\":\"ca40aa56068fb237bcf0061c6ddcd5089e0be0d0\",\"children\":[{\"text\":\" \\\"string_not_equal\\\": {\"}],\"id\":\"VbAv9pjlk8ZNpmmN3zmuO\",\"type\":\"code-line\"},{\"__nid\":\"45d5ef2365d86fe38cc711adef8e67feff312920_146_36\",\"children\":[{\"text\":\" \\\"cos:host\\\": \\\"examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com\\\"\"}],\"id\":\"95iPBlEzUUD6RVD_CSZzO\",\"type\":\"code-line\"},{\"__nid\":\"74c8071d576a47f52e253ddadebb59bf07516732_146_37\",\"children\":[{\"text\":\" }\"}],\"id\":\"7KsYomA3opvr9MmK9nv_-\",\"type\":\"code-line\"},{\"__nid\":\"45fa8c764ea3f60b0f2ac34a047b5f7769b6b4ce_146_38\",\"children\":[{\"text\":\" }\"}],\"id\":\"7vfCh1hvH-UjeUAgeCbvE\",\"type\":\"code-line\"},{\"__nid\":\"7efeaff51e6e43fc5b2005e73ae9678fd7d4e69d\",\"children\":[{\"text\":\" }\"}],\"id\":\"FIYPX6I71KtUADcdyjuCl\",\"type\":\"code-line\"},{\"__nid\":\"351e9112bfee6e75a97c389cb5dd46764df9327d\",\"children\":[{\"text\":\" ]\"}],\"id\":\"1QMWCk5Y0XsS-WO2uSMJ5\",\"type\":\"code-line\"},{\"__nid\":\"29654058b578f4476937a1bcb3c2e5c295772e88_146_41\",\"children\":[{\"text\":\"}\"}],\"id\":\"mUY6uxgBkxDtwpDLVedFE\",\"type\":\"code-line\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"rfLrf3-ayIMdAvQFptkEw\",\"language\":\"json\",\"type\":\"code-block\"},{\"__nid\":\"b934caecb0e9a72e325eccb1cb9a9110baaa7d74\",\"children\":[{\"text\":\"예시2: 사용자 정의 도메인을 통해서만 객체 다운로드 허용\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"KNRwTQMBRP3ngeFHD4h0A\",\"nodeId\":\"6986caad-1fec-4e8e-812a-4e21f52f09c9\",\"type\":\"h4\"},{\"__nid\":\"4cdb70035626dd77407c96fe2ad4fc46daf01f4d\",\"children\":[{\"text\":\"다음 정책은 사용자가 mydomain1.com이라는 사용자 정의 도메인을 통해서만 버킷 디렉터리 folder1에서 객체를 다운로드(GetObject)할 수 있도록 제한하는 것입니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"ciBJIRlNSJNbRHm4dV5Te\",\"type\":\"p\"},{\"__nid\":\"fa3f6838ec9a7a5094337842375f03525618efd2\",\"autoWrap\":false,\"children\":[{\"__nid\":\"b260076e980ec3d09298af1f4fefac3718effe26_149_0\",\"children\":[{\"text\":\"{\"}],\"id\":\"xpttWi8r1SqAWf2anpgar\",\"type\":\"code-line\"},{\"__nid\":\"25ef2603ca8b1b91d731197c4df9c2c6db74bc54_149_1\",\"children\":[{\"text\":\"\\t\\\"version\\\": \\\"2.0\\\",\"}],\"id\":\"CDGLCQtkWVd0Ixy2wpalQ\",\"type\":\"code-line\"},{\"__nid\":\"f83f8b90759b5dbf448951255057129f86e771b8_149_2\",\"children\":[{\"text\":\"\\t\\\"statement\\\": [{\"}],\"id\":\"fLfrdsSD5mxiywZ5bIWBH\",\"type\":\"code-line\"},{\"__nid\":\"a59c2736771ee3a3b564803c99776dfa7b721046_149_3\",\"children\":[{\"text\":\"\\t\\t\\t\\\"principal\\\": {\"}],\"id\":\"yYMde6c1bI09yoCyxxiep\",\"type\":\"code-line\"},{\"__nid\":\"2a29f208f1985b3e499dda357bc2ca62f54fc35b_149_4\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs\\\": [\"}],\"id\":\"lDWHfMUMOiYviP96Pe7OH\",\"type\":\"code-line\"},{\"__nid\":\"926df8f5d219506c00c6a83a34a0d5522848b1a8_149_5\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"kH4t_dSR2IGlYZ5_CjhBq\",\"type\":\"code-line\"},{\"__nid\":\"f058e113345ac72a8b218f68132f8f422de810d4_149_6\",\"children\":[{\"text\":\"\\t\\t\\t\\t]\"}],\"id\":\"WWmU8KNO66EMQfru8cSmF\",\"type\":\"code-line\"},{\"__nid\":\"24fc499c43548f991b1c2271e1ba41f95336c498_149_7\",\"children\":[{\"text\":\"\\t\\t\\t},\"}],\"id\":\"6Wxt78bwfwao4VA27oU6R\",\"type\":\"code-line\"},{\"__nid\":\"e7e4a5a367ee941bb23ecf4e6d21360307c0e99c_149_8\",\"children\":[{\"text\":\"\\t\\t\\t\\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"lzHg1yqabvrRAOQ9Jbsrh\",\"type\":\"code-line\"},{\"__nid\":\"11a3a0365fe1080ab2ce5e77d830baac36a66791_149_9\",\"children\":[{\"text\":\"\\t\\t\\t\\\"action\\\": [\"}],\"id\":\"c3FRFBd2x71vZEgvXLBQt\",\"type\":\"code-line\"},{\"__nid\":\"f40c7edd55a0a4440074cacc1fc6778e68f34e5b\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:GetObject\\\"\"}],\"id\":\"cFgW7YbjmaTdESIdCi2P8\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_149_11\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"VrgtIY4imcb8AkCztgGtW\",\"type\":\"code-line\"},{\"__nid\":\"3c118abbcd3715af1b41634dd0e0f22cbd1492bb_149_12\",\"children\":[{\"text\":\"\\t\\t\\t\\\"resource\\\": [\"}],\"id\":\"Ef1jY384PFi9rOZpAo3dE\",\"type\":\"code-line\"},{\"__nid\":\"65aee5c216d439c97ae5f0b7ff844652f6380801\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/folder1/*\\\"\"}],\"id\":\"tXqJiNfqFUgL0-HONagft\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_149_14\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"inxiXVJmUFpPazEOAI6w8\",\"type\":\"code-line\"},{\"__nid\":\"fe1e4c0440d22c05b996618a8cabeb668ff13257_149_15\",\"children\":[{\"text\":\"\\t\\t\\t\\\"condition\\\": {\"}],\"id\":\"PJWkGrrF0iJIgJi6Ls1Ry\",\"type\":\"code-line\"},{\"__nid\":\"3ce81c0db4ef8fb59f8b1ffd4a54fa6b67d9812b_149_16\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"string_equal\\\": {\"}],\"id\":\"mz_DPq7z7f2K7vF_AH1g7\",\"type\":\"code-line\"},{\"__nid\":\"c3f9e0feecec4292caaa87f1f5659089d59d5177\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"cos:host\\\": \\\"mydomain1.com\\\"\"}],\"id\":\"IlIZtoAajJBMguUbbLJQR\",\"type\":\"code-line\"},{\"__nid\":\"df94564ba317e6dadf47532cd5d9c61a5cbb4fa0_149_18\",\"children\":[{\"text\":\"\\t\\t\\t\\t}\"}],\"id\":\"KgsK9pPDKa5P6ndvZTfxM\",\"type\":\"code-line\"},{\"__nid\":\"f255231793c82495529dd40bed95adf5b2ea14d5_149_19\",\"children\":[{\"text\":\"\\t\\t\\t}\"}],\"id\":\"_UHBdWPe9H_6G1jw4jwQW\",\"type\":\"code-line\"},{\"__nid\":\"5c71c4b53dd13d43ca331c82e0cc16c5e75a1ed5_149_20\",\"children\":[{\"text\":\"\\t\\t},\"}],\"id\":\"X3oBwwUc1NE6yWIP-I-XI\",\"type\":\"code-line\"},{\"__nid\":\"4a788153c4cdb05ac760af6a4f57ea1dd55e049c_149_21\",\"children\":[{\"text\":\"\\t\\t{\"}],\"id\":\"2O-_dSGLdVRfFcMtZaIZr\",\"type\":\"code-line\"},{\"__nid\":\"a59c2736771ee3a3b564803c99776dfa7b721046_149_22\",\"children\":[{\"text\":\"\\t\\t\\t\\\"principal\\\": {\"}],\"id\":\"S5_0c9ILDzeh-jYyIqYSu\",\"type\":\"code-line\"},{\"__nid\":\"2a29f208f1985b3e499dda357bc2ca62f54fc35b_149_23\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs\\\": [\"}],\"id\":\"ZNkqDb86wsE9qjC5V5pZw\",\"type\":\"code-line\"},{\"__nid\":\"926df8f5d219506c00c6a83a34a0d5522848b1a8_149_24\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"qcs::cam::uin/100000000001:uin/100000000002\\\"\"}],\"id\":\"n9kSSLiIa5Qx5xUxWfoMY\",\"type\":\"code-line\"},{\"__nid\":\"f058e113345ac72a8b218f68132f8f422de810d4_149_25\",\"children\":[{\"text\":\"\\t\\t\\t\\t]\"}],\"id\":\"DIbMKCKUlRFTaAWD4MUXW\",\"type\":\"code-line\"},{\"__nid\":\"24fc499c43548f991b1c2271e1ba41f95336c498_149_26\",\"children\":[{\"text\":\"\\t\\t\\t},\"}],\"id\":\"5baVr6LT0aM-uqD3Ojg_C\",\"type\":\"code-line\"},{\"__nid\":\"0dd69b92f1843af376cbc34076766ba074e79a49_149_27\",\"children\":[{\"text\":\"\\t\\t\\t\\\"effect\\\": \\\"deny\\\",\"}],\"id\":\"IxUHYSWPy15UDP2W4GMGa\",\"type\":\"code-line\"},{\"__nid\":\"11a3a0365fe1080ab2ce5e77d830baac36a66791_149_28\",\"children\":[{\"text\":\"\\t\\t\\t\\\"action\\\": [\"}],\"id\":\"_CCIhe266qoaMU4pK11Zn\",\"type\":\"code-line\"},{\"__nid\":\"f40c7edd55a0a4440074cacc1fc6778e68f34e5b_149_29\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:GetObject\\\"\"}],\"id\":\"xWl-0IfCnTpCeJTr5JWBs\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_149_30\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"zTraIBfEM8OSsknh-5EDv\",\"type\":\"code-line\"},{\"__nid\":\"3c118abbcd3715af1b41634dd0e0f22cbd1492bb_149_31\",\"children\":[{\"text\":\"\\t\\t\\t\\\"resource\\\": [\"}],\"id\":\"jvevCkCtpWNzjjgI5mVFR\",\"type\":\"code-line\"},{\"__nid\":\"65aee5c216d439c97ae5f0b7ff844652f6380801_149_32\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/folder1/*\\\"\"}],\"id\":\"eZ411_oFNwlovXUBdXTZR\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_149_33\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"oGd0niH90fYpw9gg9B1ha\",\"type\":\"code-line\"},{\"__nid\":\"fe1e4c0440d22c05b996618a8cabeb668ff13257_149_34\",\"children\":[{\"text\":\"\\t\\t\\t\\\"condition\\\": {\"}],\"id\":\"Kai-F_GJ_sWG5knbgMb4t\",\"type\":\"code-line\"},{\"__nid\":\"bdeddd8b1d9c396751fa75afe43e822e657627b4\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"string_not_equal\\\": {\"}],\"id\":\"W9vBh_xYimIj3a1kvKT5W\",\"type\":\"code-line\"},{\"__nid\":\"c3f9e0feecec4292caaa87f1f5659089d59d5177_149_36\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"cos:host\\\": \\\"mydomain1.com\\\"\"}],\"id\":\"K9JPYOK9cXHUZIckzqP2C\",\"type\":\"code-line\"},{\"__nid\":\"df94564ba317e6dadf47532cd5d9c61a5cbb4fa0_149_37\",\"children\":[{\"text\":\"\\t\\t\\t\\t}\"}],\"id\":\"TXr9jb6CEonCJ8s0c6Bj3\",\"type\":\"code-line\"},{\"__nid\":\"f255231793c82495529dd40bed95adf5b2ea14d5_149_38\",\"children\":[{\"text\":\"\\t\\t\\t}\"}],\"id\":\"pjtPJVA540KZ-YvdhVhX3\",\"type\":\"code-line\"},{\"__nid\":\"f59d9a1ddc900c29ba91e554d276dd09622558d6_149_39\",\"children\":[{\"text\":\"\\t\\t}\"}],\"id\":\"NwdTmeyv7hRDixDshrFf8\",\"type\":\"code-line\"},{\"__nid\":\"afcecf02e6372a0c0f06464f129701d262e2d58a_149_40\",\"children\":[{\"text\":\"\\t]\"}],\"id\":\"RbiV-_D5Y4UWy4ex09lwc\",\"type\":\"code-line\"},{\"__nid\":\"29654058b578f4476937a1bcb3c2e5c295772e88_149_41\",\"children\":[{\"text\":\"}\"}],\"id\":\"0fgTgcxQtYtS_r_weQlF3\",\"type\":\"code-line\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"J5gefe_aGfe7ETqocJRWI\",\"language\":\"json\",\"type\":\"code-block\"},{\"__nid\":\"b4bebe3ed89d28e8c81cfab2ab93f0a1d7b4b399\",\"children\":[{\"text\":\"객체 잠금 모드 제한(cos:object-lock-mode)\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"-OyusKxCsgKw8msbx7AG8\",\"nodeId\":\"6ac2508f-fb89-4ed3-ae1e-3dfe2246bbfe\",\"type\":\"h2\"},{\"__nid\":\"b2140afc32c7e2937e36c4ba8add73583cf93587\",\"children\":[{\"text\":\"조건 키 cos:object-lock-mode\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"nwpssg_-ASM1BA5ScM9FY\",\"nodeId\":\"551472b9-3989-4bb8-9766-2d6d5ece5631\",\"type\":\"h4\"},{\"__nid\":\"ec994885858832dce808f07a5939d1d968046867\",\"children\":[{\"text\":\"조건 키 \"},{\"code\":1,\"text\":\"cos:object-lock-mode\"},{\"text\":\"를 통해 사용자가 객체를 업로드할 때 반드시 객체 잠금을 설정하고, 고정된 모드를 사용하도록 제한할 수 있습니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"584s78lXZZAa2AbefOz8h\",\"type\":\"p\"},{\"__nid\":\"440f6764be9492e9bea22c7ed9a346a64e7efc60\",\"children\":[{\"text\":\"예시: COMPLIANCE 모드 설정만 허용\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"FiqhC-dTbbj8PEmFyNxOB\",\"nodeId\":\"8486397a-f2b9-4dca-afdd-f656a61b8e23\",\"type\":\"h4\"},{\"__nid\":\"057c9eebed9f0708a74cc34746e4e1f497ffbd2b\",\"autoWrap\":false,\"children\":[{\"__nid\":\"b260076e980ec3d09298af1f4fefac3718effe26_154_0\",\"children\":[{\"text\":\"{\"}],\"id\":\"13WIqK_mABg_VU2DHdwTC\",\"type\":\"code-line\"},{\"__nid\":\"214141d2ce8f4f741abfe9e367643d39fd4d109e\",\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"id\":\"0pXAFgAasa_byPzchbFtm\",\"type\":\"code-line\"},{\"__nid\":\"b0d6985b1345aa333a72b194214aef229d6f27a2\",\"children\":[{\"text\":\" {\"}],\"id\":\"CyKTAUwUeLgiClbbRuOQl\",\"type\":\"code-line\"},{\"__nid\":\"7a2ddeea681320dba5c549d5e4dafb3215cbd578\",\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"id\":\"BNoTL0wlIYWWBcujULADe\",\"type\":\"code-line\"},{\"__nid\":\"9bcda3a26ad2a2e598c383aff1d400f2d33165aa\",\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"id\":\"LKoECN-JkacXxRpn0d8n_\",\"type\":\"code-line\"},{\"__nid\":\"62fa7145b6cad831bc62da3c43f5de0cd97f195b\",\"children\":[{\"text\":\" \\\"name/cos:InitiateMultipartUpload\\\",\"}],\"id\":\"9Bv66K0q6esLOHKltF-BW\",\"type\":\"code-line\"},{\"__nid\":\"c52a15c0ee1a332fa51994ab162317658f54c0da\",\"children\":[{\"text\":\" \\\"name/cos:PutObjectRetention\\\"\"}],\"id\":\"e007mIB61ze8HtlHUlciz\",\"type\":\"code-line\"},{\"__nid\":\"a239c0f2ac8d3fa9d48ebe3717fb97a4afff19c2\",\"children\":[{\"text\":\" ],\"}],\"id\":\"hgeDlcy1Gh8FX0lHbu17E\",\"type\":\"code-line\"},{\"__nid\":\"b5dda8da8e0d059b6ab52c934ba61cc1714e9133\",\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"MJ-sErFJvU9WKOt5udZbo\",\"type\":\"code-line\"},{\"__nid\":\"c5ab2b1cb115dfb1c4f2ae6c7fd6f3dad474a506\",\"children\":[{\"text\":\" \\\"principal\\\": {\"}],\"id\":\"_jMxiur6Rn-vab7kNpKYv\",\"type\":\"code-line\"},{\"__nid\":\"c4872553d301d5b9c35a445b626e7cd6b80b3fa4\",\"children\":[{\"text\":\" \\\"qcs\\\": [\"}],\"id\":\"CyPaO5KyXGWeYZuthQkmy\",\"type\":\"code-line\"},{\"__nid\":\"55c1aa55d7526e025fc7d54b623249d7149b03c3\",\"children\":[{\"text\":\" \\\"qcs::cam::uin/1250000000:uin/1250000001\\\"\"}],\"id\":\"yQJoV8PguaIOXlQIDwMzm\",\"type\":\"code-line\"},{\"__nid\":\"4276eda18d83fbe2a05b840ef2e6fbcb23429dbb\",\"children\":[{\"text\":\" ]\"}],\"id\":\"tV5oP1rORtZQu551YTdwz\",\"type\":\"code-line\"},{\"__nid\":\"f56f53429d20455055075ad64946907a6622f487\",\"children\":[{\"text\":\" },\"}],\"id\":\"grjMsDct8spo-eYFd9eaP\",\"type\":\"code-line\"},{\"__nid\":\"0859e58de990de72b787ca69843d37c01a2928c3\",\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"id\":\"MNDO2jmHdVKHcncWIvrw5\",\"type\":\"code-line\"},{\"__nid\":\"e7aefbde55b5f0ecbdd413ffcef7486e497cb8ab\",\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*\\\"\"}],\"id\":\"Rx7ys6IR8PPzLdBR8lm0I\",\"type\":\"code-line\"},{\"__nid\":\"a239c0f2ac8d3fa9d48ebe3717fb97a4afff19c2_154_16\",\"children\":[{\"text\":\" ],\"}],\"id\":\"-WgxwWxjzV8y8HnHDaHXu\",\"type\":\"code-line\"},{\"__nid\":\"2fdd36b4788b9a8959ac6de3907a2bf265754174\",\"children\":[{\"text\":\" \\\"condition\\\": {\"}],\"id\":\"V0q3X6T8ewEApdLuRnCs1\",\"type\":\"code-line\"},{\"__nid\":\"72e075892158a806e7889673340a72f3ca0b8022\",\"children\":[{\"text\":\" \\\"string_equal\\\": {\"}],\"id\":\"tLte3JYKWgSiw5f8qXbcn\",\"type\":\"code-line\"},{\"__nid\":\"5e6b4862145bddc022c5b4a997f44f7bdf57b6b5\",\"children\":[{\"text\":\" \\\"cos:object-lock-mode\\\": \\\"COMPLIANCE\\\"\"}],\"id\":\"vkEBVBOVYymSEKCfnwucb\",\"type\":\"code-line\"},{\"__nid\":\"7efeaff51e6e43fc5b2005e73ae9678fd7d4e69d_154_20\",\"children\":[{\"text\":\" }\"}],\"id\":\"bwBJnnF0YVmeWJc4B2I3K\",\"type\":\"code-line\"},{\"__nid\":\"9680fba25ec39dfaea29a6e8d9999b19c31e25cf\",\"children\":[{\"text\":\" }\"}],\"id\":\"So2OHlKj1g-hqaqpkGQ6j\",\"type\":\"code-line\"},{\"__nid\":\"0360ccfaa913899d6e51da103b35015b8c9120ec\",\"children\":[{\"text\":\" }\"}],\"id\":\"ZZ_-817tAM1fSGv4UQJ9l\",\"type\":\"code-line\"},{\"__nid\":\"5593b3b3bfcdfaf50edd1708cfc10a913a3c9f15\",\"children\":[{\"text\":\" ],\"}],\"id\":\"aGw-Pt42b7ng7zUKxr_m8\",\"type\":\"code-line\"},{\"__nid\":\"e8e556f623affac786815ba5ad474cf14e5f6eef\",\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\"\"}],\"id\":\"T1TNwsZ8XU1jDtJu3szNX\",\"type\":\"code-line\"},{\"__nid\":\"29654058b578f4476937a1bcb3c2e5c295772e88_154_25\",\"children\":[{\"text\":\"}\"}],\"id\":\"N_-2g4s8qMZ73A8fkwe4o\",\"type\":\"code-line\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"qaZXyXYrrsfPwPlwoq3zX\",\"language\":\"json\",\"type\":\"code-block\"},{\"__nid\":\"76442fac13c37dc6a7391eb61e984c0c766ac759\",\"children\":[{\"text\":\"객체 잠금 보존 일수 제한(cos:object-lock-remaining-retention-days)\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"iqD5KviOAxO39wEovPz1G\",\"nodeId\":\"dc894f1c-1a88-4cce-a112-22d9479652f2\",\"type\":\"h2\"},{\"__nid\":\"a0101bf2982e145f74a743da874f97e62bbff80f\",\"children\":[{\"text\":\"조건 키 cos:object-lock-remaining-retention-days\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"xbGSdG9NRINxjYEUTF151\",\"nodeId\":\"16f989cb-61b0-40ae-80c1-3d82f1f762ba\",\"type\":\"h4\"},{\"__nid\":\"12c88e3564095908fd32bdcb68ab7b43b380cef2\",\"children\":[{\"text\":\"조건 키 \"},{\"code\":1,\"text\":\"cos:object-lock-remaining-retention-days\"},{\"text\":\"를 통해 사용자가 객체를 업로드할 때 반드시 객체 잠금을 설정하고, 고정된 일수를 지정하도록 제한할 수 있습니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"1ueyhj3vX90G2XEeEzzCW\",\"type\":\"p\"},{\"__nid\":\"c14e5753afe5b5436d08f241ffed16c109574f21\",\"children\":[{\"text\":\"보존 일수 검증 원리\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"sSBik3HQBWczDOYzdePL8\",\"nodeId\":\"b80c4365-50c2-47ac-bb8e-2869e9b0be99\",\"type\":\"h5\"},{\"__nid\":\"6681759939175f6cd136f6cbbce0788c4f280b41\",\"children\":[{\"text\":\"이 조건 키에 전달되는 값은 정수(A)만 지원되며, 실제 요청의 retain-until-date 타임스탬프를 ts1(초), 현재 시간의 타임스탬프를 ts2(초)라고 할 때, 보존 일수는 (B)로 환산됩니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"DKW3ixiiRHDNOXSOFaTtK\",\"type\":\"p\"},{\"__nid\":\"6a2d1a9fc1e32fb7cd1f02773ce96f976285cb9f\",\"autoWrap\":false,\"children\":[{\"__nid\":\"f75df1fccc83bba97d7a3049d8a60945315525c9\",\"children\":[{\"text\":\"보존 일수(B) = 내림[(ts1 - ts2) / (3600*24)]\"}],\"id\":\"DRYEQnixro9KUwrIiABb3\",\"type\":\"code-line\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"adZcPKBZNRB8pwsEXyai4\",\"language\":\"bash\",\"type\":\"code-block\"},{\"__nid\":\"50c08e30d9d37c9ebf9f3aa18a5c0f5dcae387a1\",\"children\":[{\"text\":\"예시1: retain-until-date가 2022-11-17T10:10:11이고, 현재 시간이 2022-11-15T09:00:00인 경우, 보존 일수(B)는 2일입니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"u8k1xoUVJ30MgfxDHgeZB\",\"type\":\"p\"},{\"__nid\":\"90225cdc3e9bcf6de6ccf6cfba3b09d34d8372ec\",\"children\":[{\"text\":\"예시2: retain-until-date가 2022-11-17T10:10:11이고, 현재 시간이 2022-11-15T12:00:00인 경우, 보존 일수(B)는 1일입니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"_zcsBpMrLmrVhrZIAY1VY\",\"type\":\"p\"},{\"__nid\":\"ebccf4cfb522842554f45457f1cdac825b28f285\",\"children\":[{\"text\":\"조건을 만족하는지 여부는 A와 B 두 값을 비교하여 판단합니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"70QUrtWW9RSMTOi1enGVW\",\"type\":\"p\"},{\"__nid\":\"c8c49d80faf7af77c47d84420c6e07eddada4cd8\",\"children\":[{\"text\":\"예시: PutObject로 객체를 업로드할 때 잠금 일수는 N일을 초과해야 함\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"M7wzUWcG9OHZudgi6ARmS\",\"nodeId\":\"4899a8ac-75ee-410f-b948-040865092470\",\"type\":\"h4\"},{\"__nid\":\"12b627a8ced9bc9b10d566262bbb5bbef9ad5f84\",\"children\":[{\"text\":\"예를 들어, 잠금의 남은 일수는 3일(3일 제외)을 초과해야 합니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"qJWzYODgjdJkPSjusj-6K\",\"type\":\"p\"},{\"__nid\":\"d78daddc965cd084c58b54585c5c3817145a626c\",\"children\":[{\"__nid\":\"916343267094055ab71529ed6364452e93c102d1\",\"children\":[{\"b\":1,\"text\":\"설명:\"}],\"id\":\"IWWPd0ggegErux8lgshy0\",\"type\":\"p\"},{\"__nid\":\"9d080fcf97c6eb4b68e812b5c8aae589659cfc67\",\"children\":[{\"text\":\"조건 키에 규정된 남은 일수는 3일보다 커야 하며, 즉 4일 이상이어야 합니다. 요청 시간이 2022년 10월 1일 16:00:00이라면, 사용자가 설정한 RetainUntilDate는 2022년 10월 5일 16:00:00 이후여야 합니다.\"}],\"id\":\"CIpU6LHF8GT7EbDuov_c-\",\"type\":\"p\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"hintType\":\"info\",\"id\":\"ezzGHnAXObileJW6hMH1W\",\"type\":\"hint\"},{\"__nid\":\"c3ce02f1b99e7c1b4116a2e4ba20529d049622e3\",\"autoWrap\":false,\"children\":[{\"__nid\":\"b260076e980ec3d09298af1f4fefac3718effe26_167_0\",\"children\":[{\"text\":\"{\"}],\"id\":\"bErN0T6b8gB7MaI-kJ7Y2\",\"type\":\"code-line\"},{\"__nid\":\"214141d2ce8f4f741abfe9e367643d39fd4d109e_167_1\",\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"id\":\"4HdEHObMPZvxKJ2USBPET\",\"type\":\"code-line\"},{\"__nid\":\"b0d6985b1345aa333a72b194214aef229d6f27a2_167_2\",\"children\":[{\"text\":\" {\"}],\"id\":\"8Y-e90BXy8kHkhIM3zcVr\",\"type\":\"code-line\"},{\"__nid\":\"7a2ddeea681320dba5c549d5e4dafb3215cbd578_167_3\",\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"id\":\"9fMmPdCG6Q--OaKK01ZY9\",\"type\":\"code-line\"},{\"__nid\":\"9bcda3a26ad2a2e598c383aff1d400f2d33165aa_167_4\",\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"id\":\"u04Hol8wXiu3FDMFllTjT\",\"type\":\"code-line\"},{\"__nid\":\"62fa7145b6cad831bc62da3c43f5de0cd97f195b_167_5\",\"children\":[{\"text\":\" \\\"name/cos:InitiateMultipartUpload\\\",\"}],\"id\":\"BGt2osc9UJqRGDhsfewAn\",\"type\":\"code-line\"},{\"__nid\":\"c52a15c0ee1a332fa51994ab162317658f54c0da_167_6\",\"children\":[{\"text\":\" \\\"name/cos:PutObjectRetention\\\"\"}],\"id\":\"HOBCCHoZBj76fqe47D-u5\",\"type\":\"code-line\"},{\"__nid\":\"a239c0f2ac8d3fa9d48ebe3717fb97a4afff19c2_167_7\",\"children\":[{\"text\":\" ],\"}],\"id\":\"J6CeFVQlKusV9oQ9lm7VL\",\"type\":\"code-line\"},{\"__nid\":\"b5dda8da8e0d059b6ab52c934ba61cc1714e9133_167_8\",\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"Kc6BMN7sdHw6x7cby2QVw\",\"type\":\"code-line\"},{\"__nid\":\"c5ab2b1cb115dfb1c4f2ae6c7fd6f3dad474a506_167_9\",\"children\":[{\"text\":\" \\\"principal\\\": {\"}],\"id\":\"3ymARMZFFadZCwvmz6eK0\",\"type\":\"code-line\"},{\"__nid\":\"c4872553d301d5b9c35a445b626e7cd6b80b3fa4_167_10\",\"children\":[{\"text\":\" \\\"qcs\\\": [\"}],\"id\":\"y-GslNWgMaWDQPk_-f-O-\",\"type\":\"code-line\"},{\"__nid\":\"55c1aa55d7526e025fc7d54b623249d7149b03c3_167_11\",\"children\":[{\"text\":\" \\\"qcs::cam::uin/1250000000:uin/1250000001\\\"\"}],\"id\":\"l3ihMzUyw_i_XkRaMMGtw\",\"type\":\"code-line\"},{\"__nid\":\"4276eda18d83fbe2a05b840ef2e6fbcb23429dbb_167_12\",\"children\":[{\"text\":\" ]\"}],\"id\":\"favyDuhO-Fq_H-ltDOFlv\",\"type\":\"code-line\"},{\"__nid\":\"f56f53429d20455055075ad64946907a6622f487_167_13\",\"children\":[{\"text\":\" },\"}],\"id\":\"VAwZVgtgZ0Et_EtLKALN4\",\"type\":\"code-line\"},{\"__nid\":\"0859e58de990de72b787ca69843d37c01a2928c3_167_14\",\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"id\":\"grIYKTdCTisdMzavf9Yst\",\"type\":\"code-line\"},{\"__nid\":\"e7aefbde55b5f0ecbdd413ffcef7486e497cb8ab_167_15\",\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*\\\"\"}],\"id\":\"oneSqxzPUT7fk3cM7AZnc\",\"type\":\"code-line\"},{\"__nid\":\"a239c0f2ac8d3fa9d48ebe3717fb97a4afff19c2_167_16\",\"children\":[{\"text\":\" ],\"}],\"id\":\"V5NemGO4IKKmTm-Nl1YOJ\",\"type\":\"code-line\"},{\"__nid\":\"2fdd36b4788b9a8959ac6de3907a2bf265754174_167_17\",\"children\":[{\"text\":\" \\\"condition\\\": {\"}],\"id\":\"ZZlnBofd6QClxXYkkqQQl\",\"type\":\"code-line\"},{\"__nid\":\"a1b4ac584ba6545f2f83e3456c57fc6062c1f908\",\"children\":[{\"text\":\" \\\"numeric_greater_than\\\": {\"}],\"id\":\"_XrxmnVhGXLX05jtG8Uao\",\"type\":\"code-line\"},{\"__nid\":\"63f3473d1c7ca91f2a4fd90419d2d202702c9dc4\",\"children\":[{\"text\":\" \\\"cos:object-lock-remaining-retention-days\\\": 3\"}],\"id\":\"SpIREB3ChG4VYfR-20yd6\",\"type\":\"code-line\"},{\"__nid\":\"7efeaff51e6e43fc5b2005e73ae9678fd7d4e69d_167_20\",\"children\":[{\"text\":\" }\"}],\"id\":\"ZowY-zTYStTWCS9MVAbMO\",\"type\":\"code-line\"},{\"__nid\":\"9680fba25ec39dfaea29a6e8d9999b19c31e25cf_167_21\",\"children\":[{\"text\":\" }\"}],\"id\":\"r-2vvBUrElTRAw0NIupnm\",\"type\":\"code-line\"},{\"__nid\":\"0360ccfaa913899d6e51da103b35015b8c9120ec_167_22\",\"children\":[{\"text\":\" }\"}],\"id\":\"_M0Uj8y6WSC0asK07asM-\",\"type\":\"code-line\"},{\"__nid\":\"5593b3b3bfcdfaf50edd1708cfc10a913a3c9f15_167_23\",\"children\":[{\"text\":\" ],\"}],\"id\":\"m_9is5jc0sb_8-8jJfGhe\",\"type\":\"code-line\"},{\"__nid\":\"e8e556f623affac786815ba5ad474cf14e5f6eef_167_24\",\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\"\"}],\"id\":\"LDacrfQwcpw-URXpF-oJ5\",\"type\":\"code-line\"},{\"__nid\":\"29654058b578f4476937a1bcb3c2e5c295772e88_167_25\",\"children\":[{\"text\":\"}\"}],\"id\":\"gVBP2rrhN3Guc9WptQV5f\",\"type\":\"code-line\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"asR14Dc5IDcnG7RWjZaX0\",\"language\":\"json\",\"type\":\"code-block\"},{\"__nid\":\"aa5f4c6709b42a6fdc31ea10949d467d6e508509\",\"children\":[{\"text\":\"조건 연산자에 따라 유효한 RetainUntilDate는 다음과 같습니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"apQLlsketvzYLy6BEC9Pe\",\"type\":\"p\"},{\"__nid\":\"1526e6ea3fee7f5ded7cb6d549d28b6d736c49c1\",\"children\":[{\"__nid\":\"1abd57e31e72110a7b3eccedfcc6d029cc0e8b31\",\"children\":[{\"__nid\":\"0dada3156a6e09f55d1a382b913e24fa75aa78ff\",\"children\":[{\"__nid\":\"e5b91e1b2504884333a380706e67f537f1630318\",\"children\":[{\"text\":\"조건 키\"}],\"id\":\"_ADUSHCFWeiRK39rwdFgZ\",\"type\":\"p\"}],\"id\":\"x7b2RxOwBerHm42XKYshq\",\"type\":\"cell\"},{\"__nid\":\"5c56e8ff10c65ed711c3e058cd00d824426efcb7\",\"children\":[{\"__nid\":\"e8eb81872186355a3d1b0c1593f2dc26d3d0d58a\",\"children\":[{\"text\":\"의미\"}],\"id\":\"nLayhBw4KC703Us6PFVpr\",\"type\":\"p\"}],\"id\":\"sPw-FNpzXiytjDYA4qnxs\",\"type\":\"cell\"},{\"__nid\":\"9dd49df417ff970955eb134e9b1110ac27215f3d\",\"children\":[{\"__nid\":\"4c85a4f1e8a26812ff95faad5ec522317d786d5f\",\"children\":[{\"text\":\"현재 요청 시간\"}],\"id\":\"MJkyprhO8l8Bb1nu_MaOL\",\"type\":\"p\"}],\"id\":\"qfWMCKzGnbL5ytnVZ-Y_d\",\"type\":\"cell\"},{\"__nid\":\"0faad958e11c3e99d0e0386be60e52912aa981a6\",\"children\":[{\"__nid\":\"52e5ed503887727216c3baaf001c0e1d032ad31c\",\"children\":[{\"text\":\"입력값: retain-until-date의 유효한 시간\"}],\"id\":\"X5U3yNi0d-5bJKGaBD3OA\",\"type\":\"p\"}],\"id\":\"BQhlziFtk5YJF5IubtvxW\",\"type\":\"cell\"},{\"__nid\":\"a896130f0ee141cdf76fe816193c414d51264310\",\"children\":[{\"__nid\":\"7981e598bcaed15b68074338785716dc765e475d\",\"children\":[{\"text\":\"비고\"}],\"id\":\"uyayLt22vK3o_mEQb6zrN\",\"type\":\"p\"}],\"id\":\"ZMo4lp2IR95cnkBM8P0Oh\",\"type\":\"cell\"}],\"id\":\"rk4Fx5S0hRfMBEFzAwcm3\",\"type\":\"row\"},{\"__nid\":\"df54989e5e19d5d109886e2a9498a05a07fd028f\",\"children\":[{\"__nid\":\"099fa4708eb17b20b30b57e26bec6f4b5e9a21e8\",\"children\":[{\"__nid\":\"3b33de4eefedeb3519b58066a9fc9046cc87e508\",\"children\":[{\"text\":\"\\\"numeric_equal\\\":\"}],\"id\":\"2E1ugt0fy-c_iDqqglHLd\",\"type\":\"p\"},{\"__nid\":\"456bd7789db748ae8663cc87355f6b464f32b87d\",\"children\":[{\"text\":\"{\"}],\"id\":\"_TfKmfj3bB1qlAcAZNNf-\",\"type\":\"p\"},{\"__nid\":\"c24b321f495ae2c928e451e2d30f0d1c7529fb40\",\"children\":[{\"text\":\"\\\"cos: x-cos-object-lock-remaining-retention-days\\\": 3\"}],\"id\":\"vk9cWLc4Us2fXjYHYHsGD\",\"type\":\"p\"},{\"__nid\":\"1bb0b8cd267fbafdac43448f20e0b2121b5598aa\",\"children\":[{\"text\":\"}\"}],\"id\":\"a8EohwCGStF8V_HgIr9OL\",\"type\":\"p\"}],\"id\":\"Nh7rsLieBAgY0apoOT4DC\",\"type\":\"cell\"},{\"__nid\":\"bd5d1f9fb2ec66376f8e5e3444cbb3b6b538e2ee\",\"children\":[{\"__nid\":\"98e78ea72e722b90deb658d634de41394a080a4c\",\"children\":[{\"text\":\"3일\"}],\"id\":\"UQqsi4fmD-2b76pSr5QYx\",\"type\":\"p\"}],\"id\":\"3IEK9JvZxmf4_ZBJgd88o\",\"type\":\"cell\"},{\"__nid\":\"c288879df569f34561d46bc77d2f90a05e007312\",\"children\":[{\"__nid\":\"77859da8cf2b84cb9b6f42fedd0def910c57efaf\",\"children\":[{\"text\":\"2022-11-01T12:00:00Z\"}],\"id\":\"iQPUMH4KEQdi_jlg8nlC2\",\"type\":\"p\"}],\"id\":\"iHzIXRqFKxnwfWBZKxr2x\",\"type\":\"cell\"},{\"__nid\":\"aa26da40011014094bdaed5566a8a74fc79cb44b\",\"children\":[{\"__nid\":\"ee50d836ded813b2eba08a23ab5b50b560edb849\",\"children\":[{\"text\":\"[ 2022-11-04T12:00:00Z, 2022-11-05T11:59:59Z ]\"}],\"id\":\"GoGdyIPhR51DYi81x2d08\",\"type\":\"p\"}],\"id\":\"xYsxh3JfHnzKWLrGeaiqP\",\"type\":\"cell\"},{\"__nid\":\"6672e8862e78a998dd646745c5da1bf69288c8e6\",\"children\":[{\"__nid\":\"64a519b5eb167f107c35931326c331349bb95fec\",\"children\":[{\"text\":\"닫힌 구간\"}],\"id\":\"X4PlodOuvh0nUjP8sl28O\",\"type\":\"p\"}],\"id\":\"iCSDiwzfxwVGimJGu9K2v\",\"type\":\"cell\"}],\"id\":\"1UglxM2eRDLDTOKlBELlR\",\"type\":\"row\"},{\"__nid\":\"7dc222e72d6cb5f94f15a46a4665cbc4850111ae\",\"children\":[{\"__nid\":\"bc96d878b6bd4035f5c0d58032ad72e8eb5fdb01\",\"children\":[{\"__nid\":\"bfa557b4ffed166e37635ed14b0c2d6431a49efd\",\"children\":[{\"text\":\"\\\"numeric_greater_than\\\":\"}],\"id\":\"QO_TCl6uYVC67GvjwgEYJ\",\"type\":\"p\"},{\"__nid\":\"456bd7789db748ae8663cc87355f6b464f32b87d_169_2_0_1\",\"children\":[{\"text\":\"{\"}],\"id\":\"AmnAVwbaYqC-Ag_AaZoxR\",\"type\":\"p\"},{\"__nid\":\"c24b321f495ae2c928e451e2d30f0d1c7529fb40_169_2_0_2\",\"children\":[{\"text\":\"\\\"cos: x-cos-object-lock-remaining-retention-days\\\": 3\"}],\"id\":\"q7T4EVY5JBkgzEo4lbzdH\",\"type\":\"p\"},{\"__nid\":\"1bb0b8cd267fbafdac43448f20e0b2121b5598aa_169_2_0_3\",\"children\":[{\"text\":\"}\"}],\"id\":\"pLQC6CV3oL7T6eDmrVm9F\",\"type\":\"p\"}],\"id\":\"9tgTKjFJDH4964bJKccNd\",\"type\":\"cell\"},{\"__nid\":\"4818989751eb23bf7929e627a2e0fef7549dc148\",\"children\":[{\"__nid\":\"0e481b9f0d64273b99486c4563dae6d921253e1d\",\"children\":[{\"text\":\"3일 초과(3일 제외)\"}],\"id\":\"3JNU91z8i3liuCHjjyDyq\",\"type\":\"p\"}],\"id\":\"BUrLhoudu62-KcZLbDlKP\",\"type\":\"cell\"},{\"__nid\":\"c288879df569f34561d46bc77d2f90a05e007312_169_2_2\",\"children\":[{\"__nid\":\"77859da8cf2b84cb9b6f42fedd0def910c57efaf_169_2_2_0\",\"children\":[{\"text\":\"2022-11-01T12:00:00Z\"}],\"id\":\"iTLWtT_zUGcgp2Tvy9xAN\",\"type\":\"p\"}],\"id\":\"jn6JSOuZBXyv6fALMbvg3\",\"type\":\"cell\"},{\"__nid\":\"8b821ad2b5e2ba114e3ab3c3c033ccb935c21f47\",\"children\":[{\"__nid\":\"d64526fdb621ed73e7917c2b30ecd81e99ae8e3b\",\"children\":[{\"text\":\"[ 2022-11-05T12:00:00Z, 이후 ]\"}],\"id\":\"9EBNVmE6UTzpirW4YRPMd\",\"type\":\"p\"}],\"id\":\"F0Dfx8QlMukNigh9ArdDc\",\"type\":\"cell\"},{\"__nid\":\"6672e8862e78a998dd646745c5da1bf69288c8e6_169_2_4\",\"children\":[{\"__nid\":\"64a519b5eb167f107c35931326c331349bb95fec_169_2_4_0\",\"children\":[{\"text\":\"닫힌 구간\"}],\"id\":\"Oa5nvlJ8LCCqqgqqkciuL\",\"type\":\"p\"}],\"id\":\"ROonaKmaPUALsogqBGMSP\",\"type\":\"cell\"}],\"id\":\"DaKgnXH7N4vpnscrSI2HV\",\"type\":\"row\"},{\"__nid\":\"6f058e47b58fa4f3be468081d47f2a11795342c1\",\"children\":[{\"__nid\":\"163daeca3d48f80f3cd22185395742e7bc162b4c\",\"children\":[{\"__nid\":\"ff9939c5b9f81685d743ea040fed58e2731f7b7d\",\"children\":[{\"text\":\"\\\"numeric_less_than\\\":\"}],\"id\":\"BPvii0SFeq-UFgnQSBpkx\",\"type\":\"p\"},{\"__nid\":\"456bd7789db748ae8663cc87355f6b464f32b87d_169_3_0_1\",\"children\":[{\"text\":\"{\"}],\"id\":\"hDjIECPFi-GrmqwwYJgGe\",\"type\":\"p\"},{\"__nid\":\"c24b321f495ae2c928e451e2d30f0d1c7529fb40_169_3_0_2\",\"children\":[{\"text\":\"\\\"cos: x-cos-object-lock-remaining-retention-days\\\": 3\"}],\"id\":\"_K_mw0yYi77Vj3njlKGcX\",\"type\":\"p\"},{\"__nid\":\"1bb0b8cd267fbafdac43448f20e0b2121b5598aa_169_3_0_3\",\"children\":[{\"text\":\"}\"}],\"id\":\"cpe0-ocD4wOPQaIVpf_Cn\",\"type\":\"p\"}],\"id\":\"Ykym7zieDh-5iXHJo0KQY\",\"type\":\"cell\"},{\"__nid\":\"b4f2fab2da7d1993d53bd1fed3d8c74d088e90fb\",\"children\":[{\"__nid\":\"98d7605c56ffea2b619a1b4aad690997289f203c\",\"children\":[{\"text\":\"3일 미만(3일 제외)\"}],\"id\":\"JXQMO-HiSMxogm3fJUz_x\",\"type\":\"p\"}],\"id\":\"hp75UiPygSfE0rXZmV93I\",\"type\":\"cell\"},{\"__nid\":\"c288879df569f34561d46bc77d2f90a05e007312_169_3_2\",\"children\":[{\"__nid\":\"77859da8cf2b84cb9b6f42fedd0def910c57efaf_169_3_2_0\",\"children\":[{\"text\":\"2022-11-01T12:00:00Z\"}],\"id\":\"2w53B4yVK7TopeCOv8SJV\",\"type\":\"p\"}],\"id\":\"roH2C78uKAQuYPMHOCSnC\",\"type\":\"cell\"},{\"__nid\":\"f28a680890b3f7e55f015d8b0efe580143f954cb\",\"children\":[{\"__nid\":\"baf42705b62faef95c40c26b348b90f1c83bb382\",\"children\":[{\"text\":\"[ 2022-11-01T12:00:01Z, 2022-11-04T11:59:59Z ]\"}],\"id\":\"b0PmO1eY_7KsUgd6wA-2b\",\"type\":\"p\"}],\"id\":\"bviG8lSWjE80Tt844AOV_\",\"type\":\"cell\"},{\"__nid\":\"6672e8862e78a998dd646745c5da1bf69288c8e6_169_3_4\",\"children\":[{\"__nid\":\"64a519b5eb167f107c35931326c331349bb95fec_169_3_4_0\",\"children\":[{\"text\":\"닫힌 구간\"}],\"id\":\"8masECP6___ABQ1p7oSt3\",\"type\":\"p\"}],\"id\":\"BS_5YGwJdD34EI4jK7sAz\",\"type\":\"cell\"}],\"id\":\"CE5DcrzXZYpmOGKzwNtfC\",\"type\":\"row\"}],\"columnHeader\":false,\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"s9J1qVvjtoTOXP41ZBaIF\",\"rowHeader\":true,\"type\":\"table\",\"widthMode\":\"percentage\",\"widths\":[24,18,19,26,13]},{\"__nid\":\"cdcfbdbf463db63fbbe009bed69d99a56768b7b9\",\"children\":[{\"text\":\"객체 잠금 보존 날짜에 따른 접근 제한(cos:object-lock-retain-until-date)\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"-sbGgYwWMktNnfSXPEDBt\",\"nodeId\":\"4a7a32ed-4f7b-412e-b3ef-373e4c25e570\",\"type\":\"h2\"},{\"__nid\":\"6c3e0b0d498621f656323d40fb649fe4e8bee7e5\",\"children\":[{\"text\":\"조건 키 cos:object-lock-retain-until-date\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"blZzm3fPUGxspq-zzJCB_\",\"nodeId\":\"2a73e825-2c41-479c-9fa3-d6bf5136dcfc\",\"type\":\"h4\"},{\"__nid\":\"e06007bdc2ea3e43642ef4ddca9ef74ab92bdc1a\",\"children\":[{\"text\":\"조건 키 \"},{\"code\":1,\"text\":\"cos:object-lock-retain-until-date\"},{\"text\":\"를 통해 사용자가 객체를 업로드할 때 객체 잠금을 설정하고, 초 단위까지 설정 가능한 지정 날짜를 반드시 설정하도록 제한할 수 있습니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"jWPzq55U5YgHLGrEPVLsF\",\"type\":\"p\"},{\"__nid\":\"44e65fd15a2302496a12a6c6a8bf48b947f8f1ed\",\"children\":[{\"text\":\"예시: PutObject로 객체를 업로드할 때 지정된 잠금 날짜 제한\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"cjRpYW5hzGL-6r5Q_5hME\",\"nodeId\":\"8fb4865d-b60e-4521-8f6f-d0c05a353be6\",\"type\":\"h4\"},{\"__nid\":\"ce134902c030aaf9ebe721516afc16d86b7fc8ba\",\"children\":[{\"text\":\"다음 요청은 RetainUntilDate가 \"},{\"code\":1,\"text\":\"2022-11-11T12:00:00Z\"},{\"text\":\" 이후여야 함을 의미합니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"f2oGZ0N6JhKe51l2nIg8S\",\"type\":\"p\"},{\"__nid\":\"21cb517f9c9cc6334cfe318dbedfe6bb1363eb6d\",\"autoWrap\":false,\"children\":[{\"__nid\":\"b260076e980ec3d09298af1f4fefac3718effe26_175_0\",\"children\":[{\"text\":\"{\"}],\"id\":\"E2y8lsbFApc7rLPHL4Pc_\",\"type\":\"code-line\"},{\"__nid\":\"214141d2ce8f4f741abfe9e367643d39fd4d109e_175_1\",\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"id\":\"Odd0mkT-oJuWqFw8LDaxB\",\"type\":\"code-line\"},{\"__nid\":\"b0d6985b1345aa333a72b194214aef229d6f27a2_175_2\",\"children\":[{\"text\":\" {\"}],\"id\":\"rsU5LbStMR26Ql5FvzoE2\",\"type\":\"code-line\"},{\"__nid\":\"7a2ddeea681320dba5c549d5e4dafb3215cbd578_175_3\",\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"id\":\"TQXSAnEPNUOHTmD1EBPdW\",\"type\":\"code-line\"},{\"__nid\":\"9bcda3a26ad2a2e598c383aff1d400f2d33165aa_175_4\",\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"id\":\"t2RMq-R45Rz3yiUUX1gaa\",\"type\":\"code-line\"},{\"__nid\":\"62fa7145b6cad831bc62da3c43f5de0cd97f195b_175_5\",\"children\":[{\"text\":\" \\\"name/cos:InitiateMultipartUpload\\\",\"}],\"id\":\"UoaOIDaDvHz4EFf4D5lJI\",\"type\":\"code-line\"},{\"__nid\":\"c52a15c0ee1a332fa51994ab162317658f54c0da_175_6\",\"children\":[{\"text\":\" \\\"name/cos:PutObjectRetention\\\"\"}],\"id\":\"RjBOcP5X_ZzMSDTvNQN2G\",\"type\":\"code-line\"},{\"__nid\":\"a239c0f2ac8d3fa9d48ebe3717fb97a4afff19c2_175_7\",\"children\":[{\"text\":\" ],\"}],\"id\":\"16Hqvmq18GhhYqfbUEkc3\",\"type\":\"code-line\"},{\"__nid\":\"b5dda8da8e0d059b6ab52c934ba61cc1714e9133_175_8\",\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"yFKn5megWkX9v6B40coZu\",\"type\":\"code-line\"},{\"__nid\":\"c5ab2b1cb115dfb1c4f2ae6c7fd6f3dad474a506_175_9\",\"children\":[{\"text\":\" \\\"principal\\\": {\"}],\"id\":\"49Hz22P_wkq1zhbNgdaJo\",\"type\":\"code-line\"},{\"__nid\":\"c4872553d301d5b9c35a445b626e7cd6b80b3fa4_175_10\",\"children\":[{\"text\":\" \\\"qcs\\\": [\"}],\"id\":\"UTaPr8KUCajAk5ptrsbi1\",\"type\":\"code-line\"},{\"__nid\":\"55c1aa55d7526e025fc7d54b623249d7149b03c3_175_11\",\"children\":[{\"text\":\" \\\"qcs::cam::uin/1250000000:uin/1250000001\\\"\"}],\"id\":\"7a2zGPa36-Wn6K4aQKkur\",\"type\":\"code-line\"},{\"__nid\":\"4276eda18d83fbe2a05b840ef2e6fbcb23429dbb_175_12\",\"children\":[{\"text\":\" ]\"}],\"id\":\"9fr4KWn7jG1djgwp7rX7P\",\"type\":\"code-line\"},{\"__nid\":\"f56f53429d20455055075ad64946907a6622f487_175_13\",\"children\":[{\"text\":\" },\"}],\"id\":\"PHXKDH8JOv_Y9WVruisqK\",\"type\":\"code-line\"},{\"__nid\":\"0859e58de990de72b787ca69843d37c01a2928c3_175_14\",\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"id\":\"Nk9eHrVnVBQzsieX9anPL\",\"type\":\"code-line\"},{\"__nid\":\"e7aefbde55b5f0ecbdd413ffcef7486e497cb8ab_175_15\",\"children\":[{\"text\":\" \\\"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*\\\"\"}],\"id\":\"6JvIsYxkoQmkNtBa-FiLK\",\"type\":\"code-line\"},{\"__nid\":\"a239c0f2ac8d3fa9d48ebe3717fb97a4afff19c2_175_16\",\"children\":[{\"text\":\" ],\"}],\"id\":\"bpRZJ0gx0goj7epdDFDM1\",\"type\":\"code-line\"},{\"__nid\":\"2fdd36b4788b9a8959ac6de3907a2bf265754174_175_17\",\"children\":[{\"text\":\" \\\"condition\\\": {\"}],\"id\":\"juKPb7eRZq55fOJe5HDXT\",\"type\":\"code-line\"},{\"__nid\":\"bf858bbf2b412ea3469663cef200af4b94932ee7\",\"children\":[{\"text\":\" \\\"date_greater_than\\\": {\"}],\"id\":\"75yYZDO57eXqZ8y7mBBnJ\",\"type\":\"code-line\"},{\"__nid\":\"df4e32eea8a26df7e0c9aa0b26150f54bcbf9797\",\"children\":[{\"text\":\" \\\"cos:object-lock-retain-until-date\\\": \\\"2022-11-11T12:00:00Z\\\"\"}],\"id\":\"7WuGdVrtOqvRmHEL-1ekk\",\"type\":\"code-line\"},{\"__nid\":\"7efeaff51e6e43fc5b2005e73ae9678fd7d4e69d_175_20\",\"children\":[{\"text\":\" }\"}],\"id\":\"viL28QQIuNg01Ik_6Hklr\",\"type\":\"code-line\"},{\"__nid\":\"9680fba25ec39dfaea29a6e8d9999b19c31e25cf_175_21\",\"children\":[{\"text\":\" }\"}],\"id\":\"mlNvB0KQlD9z9G8LJneWE\",\"type\":\"code-line\"},{\"__nid\":\"0360ccfaa913899d6e51da103b35015b8c9120ec_175_22\",\"children\":[{\"text\":\" }\"}],\"id\":\"-ZKQG9mwHWDRthVkIlArJ\",\"type\":\"code-line\"},{\"__nid\":\"5593b3b3bfcdfaf50edd1708cfc10a913a3c9f15_175_23\",\"children\":[{\"text\":\" ],\"}],\"id\":\"t3xyjV0zhd4uKLCEW9-0i\",\"type\":\"code-line\"},{\"__nid\":\"e8e556f623affac786815ba5ad474cf14e5f6eef_175_24\",\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\"\"}],\"id\":\"pUdDzypZjanbhhHN6a85c\",\"type\":\"code-line\"},{\"__nid\":\"29654058b578f4476937a1bcb3c2e5c295772e88_175_25\",\"children\":[{\"text\":\"}\"}],\"id\":\"GveSkQykhhXbAg0c230UO\",\"type\":\"code-line\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"g3UivK2ygjrNCE9-KSI3Y\",\"language\":\"json\",\"type\":\"code-block\"},{\"__nid\":\"38a1a0f38f1fef7a560a9b0527bac324fe04d714\",\"children\":[{\"text\":\"요청에 포함된 ACL 권한 부여 헤더 제한\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"ghTxfBULznmWpMcB-ja0Y\",\"nodeId\":\"f1d8887f-6ac9-4946-a11e-2a2405947984\",\"type\":\"h2\"},{\"__nid\":\"960be44bfed0a26daed18a765f06a81442a3c8af\",\"children\":[{\"text\":\"조건 키\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"U2gG_TlpRP1GNkm_cd-a2\",\"nodeId\":\"d96863c9-0c91-4f17-bc3b-51a9b15a84f5\",\"type\":\"h4\"},{\"__nid\":\"df74640031468375f155e41ba1a3db19fe1bc5c1\",\"children\":[{\"text\":\"요청 헤더 x-cos-grant-full-control, x-cos-grant-read, x-cos-grant-write, x-cos-grant-read-acp, x-cos-grant-write-acp는 객체 업로드, 복사 또는 ACL 수정 요청 시 ACL 권한 정보를 지정하는 데 사용됩니다. 자세한 내용은 \"},{\"__nid\":\"0c9d7a8770a95c36a93400b9ade3620b7a6e34f6\",\"children\":[{\"text\":\"PutObject의 요청 헤더\"}],\"id\":\"YFP80aLeWf9-CJpIkquEs\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/7749#.E8.AF.B7.E6.B1.82.E5.A4.B4\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오. 아래 표에 명시된 조건 키는 해당 요청 헤더의 포함 여부 또는 헤더 값의 제한 조건을 정의하는 데 사용됩니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"6h4lI6iqyRfkz4Vc0M6SO\",\"type\":\"p\"},{\"__nid\":\"8accc377b6a489ea304b9c2a3bc73fe51030edf1\",\"children\":[{\"__nid\":\"7710f2b8264b909230cbf56294097a10b36c8720\",\"children\":[{\"__nid\":\"d8c441729efd7276c33a49a5c7846037d641546f\",\"children\":[{\"__nid\":\"7ea0e1a293f82073cd0de291c9d3e50ab607af4a\",\"align\":\"center\",\"children\":[{\"b\":1,\"text\":\"조건 키\"}],\"id\":\"vCRMNy9BbpMTLbhhX2dn5\",\"type\":\"p\"}],\"colSpan\":1,\"id\":\"c10IAe671TjXKvtAABwPo\",\"rowSpan\":1,\"type\":\"cell\"},{\"__nid\":\"871280d6efe01307d6c127f7dfee90bb14e170a0\",\"children\":[{\"__nid\":\"7c461733d93ed0bd5c654881665aab6c2aed15b6\",\"align\":\"center\",\"children\":[{\"b\":1,\"text\":\"해당 요청 헤더\"}],\"id\":\"LbFoYtDapXsi0ShgwBvXN\",\"type\":\"p\"}],\"colSpan\":1,\"id\":\"TfyCfPY6TMOFrqS7C5xS7\",\"rowSpan\":1,\"type\":\"cell\"}],\"id\":\"po66SHgOoyjF97PGOBV6E\",\"type\":\"row\"},{\"__nid\":\"8c118df25e9eabfa3a3fd89ea07bf60099093f28\",\"children\":[{\"__nid\":\"a61574972f8e2de9ac15b2e6c11bcd3c8f20be73\",\"children\":[{\"__nid\":\"226ac67c54ef80e3f07bab41f4a4083d7a899a96\",\"children\":[{\"text\":\"cos:x-cos-grant-full-control\"}],\"id\":\"C-J4CH3gWPPBLdKx4pw5T\",\"type\":\"p\"}],\"colSpan\":1,\"id\":\"FcNaIHrtrrS4KTwe12hfz\",\"rowSpan\":1,\"type\":\"cell\"},{\"__nid\":\"6bf8f351b2d53921be9c29a70e6d5775941866b6\",\"children\":[{\"__nid\":\"603a222ce24792c7345dd0d19a6c10f1acc23153\",\"children\":[{\"text\":\"x-cos-grant-full-control\"}],\"id\":\"RaFwp1ziux0xXLmeqZcy-\",\"type\":\"p\"}],\"colSpan\":1,\"id\":\"O88uvxOmnsYSWFudES2xg\",\"rowSpan\":1,\"type\":\"cell\"}],\"id\":\"2F6CuXzlaVLEd2AUapfkV\",\"type\":\"row\"},{\"__nid\":\"0d26fc2cf594f9e556ea6957826882225bd2a8a5\",\"children\":[{\"__nid\":\"554d2e3a83a63bbd010df150e80289d8425a57da\",\"children\":[{\"__nid\":\"da084dfa0375096dcc9bd150bae7b637cda0a8a7\",\"children\":[{\"text\":\"cos:x-cos-grant-read\"}],\"id\":\"6WJgUMvhnVVGKcUy1gWuR\",\"type\":\"p\"}],\"id\":\"l8G076KVqm9dLX2GtnZ4I\",\"type\":\"cell\"},{\"__nid\":\"d7ab2dbbf92304a7c00ac4d11d62685da57f07ff\",\"children\":[{\"__nid\":\"9252e857251f6d7ea46459cf739429fb7f982f30\",\"children\":[{\"text\":\"x-cos-grant-read\"}],\"id\":\"RMf_sBkxq2g3nIWdgv8z6\",\"type\":\"p\"}],\"id\":\"8G8K-SXU7Dh6y5y9ShjxH\",\"type\":\"cell\"}],\"id\":\"L1caCs10XkJoqFm0lhBA7\",\"type\":\"row\"},{\"__nid\":\"d3a2a088ba0bd569514835b0aff7db9e4232876f\",\"children\":[{\"__nid\":\"7b6c7f027d20ed7ca2659d2df7071ea843f4ee56\",\"children\":[{\"__nid\":\"177e04f766a42d072e1e03d27b1d61e7ddbeaa55\",\"children\":[{\"text\":\"cos:x-cos-grant-write\"}],\"id\":\"wYcVsmziI9_GN0qgz3I98\",\"type\":\"p\"}],\"id\":\"dG1Z2tkYwDPEPd9dHBnch\",\"type\":\"cell\"},{\"__nid\":\"1ff03e7a2f6b738402465a86ec40eca3c2f016d3\",\"children\":[{\"__nid\":\"c83e54984b6abf1e3aa7e537a357d8b4f4a14352\",\"children\":[{\"text\":\"x-cos-grant-write\"}],\"id\":\"RYz_iJTh1kB-43l1DODtc\",\"type\":\"p\"}],\"id\":\"-4mKKgDuykBH9cDmjgnC5\",\"type\":\"cell\"}],\"id\":\"ffe6yHTLVunYtBzPFoeaq\",\"type\":\"row\"},{\"__nid\":\"10f25345fcc8d7018de058a1fbc916770dcde1fd\",\"children\":[{\"__nid\":\"0702fce16ca68573fdfb6980956bba767b2171f5\",\"children\":[{\"__nid\":\"22f0ab10700fa801dfed9b72edae55009e0e7e46\",\"children\":[{\"text\":\"cos:x-cos-grant-read-acp\"}],\"id\":\"-36SkVICSbkpUGa6qD-_E\",\"type\":\"p\"}],\"id\":\"oWt4OBH0kdXD_1ejRaosD\",\"type\":\"cell\"},{\"__nid\":\"fb23b611dcee4afc869f155695c039a65e20edc9\",\"children\":[{\"__nid\":\"31f02ab3a32790739ef767e8a9efa4e23fd162d6\",\"children\":[{\"text\":\"x-cos-grant-read-acp\"}],\"id\":\"X-pqumcJVNPMMwqda9wlT\",\"type\":\"p\"}],\"id\":\"bYmz7RyyKkxp5PjuAdRy7\",\"type\":\"cell\"}],\"id\":\"HnvB3XQ3fm9rNFhn5tIog\",\"type\":\"row\"},{\"__nid\":\"306fd7a3962b34939c1cf4c8ef76d265f3e766cc\",\"children\":[{\"__nid\":\"1f9d13c91d23ed812eaea4e0658db5b98e61fbb1\",\"children\":[{\"__nid\":\"d059fb3a1ffdd68648c662922985af3d35391dbf\",\"children\":[{\"text\":\"cos:x-cos-grant-write-acp\"}],\"id\":\"QJej6a0A2fKWlGduker4l\",\"type\":\"p\"}],\"id\":\"waI9ubUu64O0F4MOwttfl\",\"type\":\"cell\"},{\"__nid\":\"295c25dd905b2487e62f141050b4a940cf39fca0\",\"children\":[{\"__nid\":\"d81a1665b8400aca2905583720e8a531d031f3f5\",\"children\":[{\"text\":\"x-cos-grant-write-acp\"}],\"id\":\"Guqrg8qpcZ0ERlhGLezzX\",\"type\":\"p\"}],\"id\":\"4ZMxHIgthOd0Pc3DVPdP3\",\"type\":\"cell\"}],\"id\":\"ZESyuemXzq90dwlQxf9yR\",\"type\":\"row\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"_jqywR6QlcRaphrc4c1GR\",\"rowHeader\":true,\"type\":\"table\",\"widthMode\":\"percentage\",\"widths\":[47,53]},{\"__nid\":\"5572567c68bff3006e8deaf374547a5688311f6a\",\"children\":[{\"text\":\"다음은 cos:x-cos-grant-full-control을 예로 들어 ACL 권한 관련 헤더 사용을 제한하는 방법을 설명한 것입니다. 다른 조건 키의 사용 방식도 유사하며, 이러한 조건 키는 주로 다음 두 가지 사용 시나리오에 적용됩니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"2rzyrcqax57IgNoSJrWjg\",\"type\":\"p\"},{\"__nid\":\"fc9beb6e3e29190398dd90efa3a08ad2491179c1\",\"children\":[{\"text\":\"해당 헤더를 특정 계정에만 권한을 부여하는 데 사용할 수 있도록 제한합니다. 자세한 내용은 \"},{\"__nid\":\"1bad44af53dd5d3417e301881b2b57dfc04320cb\",\"children\":[{\"text\":\"예시1\"}],\"id\":\"VRGX_w9PXQD9809zas3uQ\",\"linkTarget\":\"self\",\"props\":{\"anchor\":\"bd2e2666-75e9-44e0-a557-54904d30cfff\",\"id\":\"115554055743086592\",\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/46206#bd2e2666-75e9-44e0-a557-54904d30cfff\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"dsIHUFTK4pWTISL3B4DBN\",\"type\":\"uli\"},{\"__nid\":\"3201df682410a0ba4748412dda44a7b82ba30d45\",\"children\":[{\"text\":\"해당 헤더를 통한 권한 부여를 금지하여 일부 사용자가 PutObject 권한을 이용해 객체의 ACL을 변경하는 것을 방지합니다. 자세한 내용은 \"},{\"__nid\":\"51e62227c2162728d733bcdbfbc410ea8958ccb9\",\"children\":[{\"text\":\"예시2\"}],\"id\":\"N6rErXqAD7rhh6I8_ut-d\",\"linkTarget\":\"self\",\"props\":{\"anchor\":\"e8fbee38-04c4-485d-bf93-83f88c143a43\",\"id\":\"115554055743086592\",\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/46206#e8fbee38-04c4-485d-bf93-83f88c143a43\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"QHRzJMCt4EOcAoHtQcf-1\",\"type\":\"uli\"},{\"__nid\":\"3d4e88fc05323e5d826f33abb031c38fc2ee55d0\",\"children\":[{\"text\":\"예시1: x-cos-grant-full-control로 권한을 부여할 수 있는 계정 제한\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"o21jvGOjKlSbmb9xkko-K\",\"nodeId\":\"bd2e2666-75e9-44e0-a557-54904d30cfff\",\"type\":\"h4\"},{\"__nid\":\"5ebcbe3b41160ba74d5871a8269bdce27fd0b4f7\",\"children\":[{\"text\":\"다음 정책은 서브 계정에 객체 업로드 권한을 부여하지만, 사용자가 객체를 업로드할 때 반드시 x-cos-grant-full-control 헤더를 포함해야 하며, 권한을 부여할 계정은 반드시 루트 계정 100000000001이어야 함을 의미합니다. x-cos-grant-full-control 헤더에는 \"},{\"code\":1,\"text\":\"\\\"\"},{\"text\":\" 문자가 포함될 수 있으므로, 정책에서 문자열로 사용할 때는 \"},{\"code\":1,\"text\":\"\\\\\\\"\"},{\"text\":\"로 이스케이프 처리해야 합니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"GzVqEqGIn34NC5-aZFzMd\",\"type\":\"p\"},{\"__nid\":\"b3ffd4a2a8cc9b2b6fd836f65d55ac372458c8a3\",\"autoWrap\":false,\"children\":[{\"__nid\":\"b260076e980ec3d09298af1f4fefac3718effe26_185_0\",\"children\":[{\"text\":\"{\"}],\"id\":\"e9Zy0MVleeXccOatFmXT4\",\"type\":\"code-line\"},{\"__nid\":\"f83f8b90759b5dbf448951255057129f86e771b8_185_1\",\"children\":[{\"text\":\"\\t\\\"statement\\\": [{\"}],\"id\":\"qD8meLHzygKXYoYNDmNQl\",\"type\":\"code-line\"},{\"__nid\":\"11a3a0365fe1080ab2ce5e77d830baac36a66791_185_2\",\"children\":[{\"text\":\"\\t\\t\\t\\\"action\\\": [\"}],\"id\":\"OtUQ-V2O9O0tx6HpTUdCE\",\"type\":\"code-line\"},{\"__nid\":\"14168f8b68970b13ced1b67290c089587f62b9ac\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:PutObject\\\",\"}],\"id\":\"ctO21cQdu_Yu7S0MgA7HQ\",\"type\":\"code-line\"},{\"__nid\":\"6b98b2da9a0ebf1bb07627fe5b51d4082137786f\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:PostObject\\\",\"}],\"id\":\"t6JZhyu_uhgVvfp7M8yXa\",\"type\":\"code-line\"},{\"__nid\":\"119f6e97a387310d567f5ef4a57dff271a707828\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:AppendObject\\\",\"}],\"id\":\"OjeS3KWi8ixX6oVcfSZVY\",\"type\":\"code-line\"},{\"__nid\":\"bd6eb4228641abfd325bbc3e155d8f17224dfd24\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:InitiateMultipartUpload\\\"\"}],\"id\":\"1in6g7yqgRuL5oKhqKTWb\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_185_7\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"PbY-dXOg7zX0fmPXaREqY\",\"type\":\"code-line\"},{\"__nid\":\"e7e4a5a367ee941bb23ecf4e6d21360307c0e99c_185_8\",\"children\":[{\"text\":\"\\t\\t\\t\\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"AhoG9GnPo2laYKDV1JoUF\",\"type\":\"code-line\"},{\"__nid\":\"a59c2736771ee3a3b564803c99776dfa7b721046_185_9\",\"children\":[{\"text\":\"\\t\\t\\t\\\"principal\\\": {\"}],\"id\":\"9mYZvB3j0EckxaovMXmAl\",\"type\":\"code-line\"},{\"__nid\":\"2a29f208f1985b3e499dda357bc2ca62f54fc35b_185_10\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs\\\": [\"}],\"id\":\"eZgH7PfZ5Wz7ph84WtzLM\",\"type\":\"code-line\"},{\"__nid\":\"7c58c1c767d3bd6741edc8ffbe686fde492ed46c\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"qcs::cam::uin/1250000000:uin/1250000001\\\"\"}],\"id\":\"dnLwtOVoS7blARX7ESv6e\",\"type\":\"code-line\"},{\"__nid\":\"f058e113345ac72a8b218f68132f8f422de810d4_185_12\",\"children\":[{\"text\":\"\\t\\t\\t\\t]\"}],\"id\":\"1Aadr5zDisF0ejij8U0Ux\",\"type\":\"code-line\"},{\"__nid\":\"24fc499c43548f991b1c2271e1ba41f95336c498_185_13\",\"children\":[{\"text\":\"\\t\\t\\t},\"}],\"id\":\"AFv85XQXp6kXWE0JGdHvX\",\"type\":\"code-line\"},{\"__nid\":\"3c118abbcd3715af1b41634dd0e0f22cbd1492bb_185_14\",\"children\":[{\"text\":\"\\t\\t\\t\\\"resource\\\": [\"}],\"id\":\"9OBerTQIVtVxExAHFb6BE\",\"type\":\"code-line\"},{\"__nid\":\"4dbef0429de40e30f6bc3827612e8a406df65b4d\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*\\\"\"}],\"id\":\"SNr1jJC9TcqpQThN372i5\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_185_16\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"w5P0qP5V7xi0xxT7NzGQl\",\"type\":\"code-line\"},{\"__nid\":\"fe1e4c0440d22c05b996618a8cabeb668ff13257_185_17\",\"children\":[{\"text\":\"\\t\\t\\t\\\"condition\\\": {\"}],\"id\":\"KKqTz68uwPFpLmopOUMGr\",\"type\":\"code-line\"},{\"__nid\":\"3ce81c0db4ef8fb59f8b1ffd4a54fa6b67d9812b_185_18\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"string_equal\\\": {\"}],\"id\":\"xWZMm2t10QagPdTjPoTqe\",\"type\":\"code-line\"},{\"__nid\":\"390c67b72ff2684d06ce6c688e57a4141145841a\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"cos:x-cos-grant-full-control\\\": \\\"id=\\\\\\\"100000000001\\\\\\\"\\\"\"}],\"id\":\"N7ztck_GVGakOLZUPyVMW\",\"type\":\"code-line\"},{\"__nid\":\"df94564ba317e6dadf47532cd5d9c61a5cbb4fa0_185_20\",\"children\":[{\"text\":\"\\t\\t\\t\\t}\"}],\"id\":\"Qt5RkSi3RD0IfBa-sPIaI\",\"type\":\"code-line\"},{\"__nid\":\"f255231793c82495529dd40bed95adf5b2ea14d5_185_21\",\"children\":[{\"text\":\"\\t\\t\\t}\"}],\"id\":\"56cWa92DVlqiSrXh95Z6s\",\"type\":\"code-line\"},{\"__nid\":\"5c71c4b53dd13d43ca331c82e0cc16c5e75a1ed5_185_22\",\"children\":[{\"text\":\"\\t\\t},\"}],\"id\":\"ASDEg-ntsiwaH3gHsIYom\",\"type\":\"code-line\"},{\"__nid\":\"4a788153c4cdb05ac760af6a4f57ea1dd55e049c_185_23\",\"children\":[{\"text\":\"\\t\\t{\"}],\"id\":\"8qat53CHyjSy0ha7SIFT5\",\"type\":\"code-line\"},{\"__nid\":\"11a3a0365fe1080ab2ce5e77d830baac36a66791_185_24\",\"children\":[{\"text\":\"\\t\\t\\t\\\"action\\\": [\"}],\"id\":\"thsBN_3CpAWDzeKqaMHMA\",\"type\":\"code-line\"},{\"__nid\":\"14168f8b68970b13ced1b67290c089587f62b9ac_185_25\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:PutObject\\\",\"}],\"id\":\"bjDAbxkIeqszBHbB1aq3Y\",\"type\":\"code-line\"},{\"__nid\":\"6b98b2da9a0ebf1bb07627fe5b51d4082137786f_185_26\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:PostObject\\\",\"}],\"id\":\"MEV9VjrdQXGHVGOS8GsVy\",\"type\":\"code-line\"},{\"__nid\":\"119f6e97a387310d567f5ef4a57dff271a707828_185_27\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:AppendObject\\\",\"}],\"id\":\"xTyOTXAwtNyBIpkDmiG1q\",\"type\":\"code-line\"},{\"__nid\":\"bd6eb4228641abfd325bbc3e155d8f17224dfd24_185_28\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:InitiateMultipartUpload\\\"\"}],\"id\":\"oM8TS9XKJwJD9t8ceeP_y\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_185_29\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"BkyGnDVzCCFY0QZ1j-dX5\",\"type\":\"code-line\"},{\"__nid\":\"0dd69b92f1843af376cbc34076766ba074e79a49_185_30\",\"children\":[{\"text\":\"\\t\\t\\t\\\"effect\\\": \\\"deny\\\",\"}],\"id\":\"D_xw6PjNGOOhfHFjAJ6uw\",\"type\":\"code-line\"},{\"__nid\":\"a59c2736771ee3a3b564803c99776dfa7b721046_185_31\",\"children\":[{\"text\":\"\\t\\t\\t\\\"principal\\\": {\"}],\"id\":\"LJYXHMapRolfJgyhvffeS\",\"type\":\"code-line\"},{\"__nid\":\"2a29f208f1985b3e499dda357bc2ca62f54fc35b_185_32\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs\\\": [\"}],\"id\":\"1BshJ2QGbg3HF8CgURmR4\",\"type\":\"code-line\"},{\"__nid\":\"7c58c1c767d3bd6741edc8ffbe686fde492ed46c_185_33\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"qcs::cam::uin/1250000000:uin/1250000001\\\"\"}],\"id\":\"uW_TDcJh2kRl2al3uK_73\",\"type\":\"code-line\"},{\"__nid\":\"f058e113345ac72a8b218f68132f8f422de810d4_185_34\",\"children\":[{\"text\":\"\\t\\t\\t\\t]\"}],\"id\":\"pFrHqKFaRTsG-KC6VmTdP\",\"type\":\"code-line\"},{\"__nid\":\"24fc499c43548f991b1c2271e1ba41f95336c498_185_35\",\"children\":[{\"text\":\"\\t\\t\\t},\"}],\"id\":\"Bml9n8vT0ZM741gwmZpcc\",\"type\":\"code-line\"},{\"__nid\":\"3c118abbcd3715af1b41634dd0e0f22cbd1492bb_185_36\",\"children\":[{\"text\":\"\\t\\t\\t\\\"resource\\\": [\"}],\"id\":\"aKZyZ0M6G1lhG4nRr9Oq4\",\"type\":\"code-line\"},{\"__nid\":\"4dbef0429de40e30f6bc3827612e8a406df65b4d_185_37\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*\\\"\"}],\"id\":\"8hcIizVTgJIVILsQcGHLe\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_185_38\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"jWtQvA9xM5kPsMK0Z6Gx1\",\"type\":\"code-line\"},{\"__nid\":\"fe1e4c0440d22c05b996618a8cabeb668ff13257_185_39\",\"children\":[{\"text\":\"\\t\\t\\t\\\"condition\\\": {\"}],\"id\":\"JxvqEwTxjIlkbWpvxnGNA\",\"type\":\"code-line\"},{\"__nid\":\"b87fc7cb2a5ac96d8a25b4da54f6db47d073e499_185_40\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"string_not_equal_if_exist\\\": {\"}],\"id\":\"Wn9C7e2pgEh-U-cLH302V\",\"type\":\"code-line\"},{\"__nid\":\"390c67b72ff2684d06ce6c688e57a4141145841a_185_41\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"cos:x-cos-grant-full-control\\\": \\\"id=\\\\\\\"100000000001\\\\\\\"\\\"\"}],\"id\":\"MVkWCprnr52aNoavn_MJ5\",\"type\":\"code-line\"},{\"__nid\":\"df94564ba317e6dadf47532cd5d9c61a5cbb4fa0_185_42\",\"children\":[{\"text\":\"\\t\\t\\t\\t}\"}],\"id\":\"jdsKdVFbCDyeIMfYKcPIQ\",\"type\":\"code-line\"},{\"__nid\":\"f255231793c82495529dd40bed95adf5b2ea14d5_185_43\",\"children\":[{\"text\":\"\\t\\t\\t}\"}],\"id\":\"MPEcXC3h7Gb40IhB_C9-0\",\"type\":\"code-line\"},{\"__nid\":\"f59d9a1ddc900c29ba91e554d276dd09622558d6_185_44\",\"children\":[{\"text\":\"\\t\\t}\"}],\"id\":\"ag2nvspD4EU2MJlGMtWaS\",\"type\":\"code-line\"},{\"__nid\":\"1de72e57d44f4185fe1693d55f6bbba4fc36bd6b\",\"children\":[{\"text\":\"\\t],\"}],\"id\":\"lJLV8dZtbxE2YICngUvL9\",\"type\":\"code-line\"},{\"__nid\":\"3113fa4f78898c56868c76dbe7f4f58512db38f2\",\"children\":[{\"text\":\"\\t\\\"version\\\": \\\"2.0\\\"\"}],\"id\":\"-hFNr_kZRLId8ZBGGzkG3\",\"type\":\"code-line\"},{\"__nid\":\"29654058b578f4476937a1bcb3c2e5c295772e88_185_47\",\"children\":[{\"text\":\"}\"}],\"id\":\"fG-tUHQw736HeBB1HrQzU\",\"type\":\"code-line\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"DGiwuW2P6-b23IbRwjbZ_\",\"language\":\"json\",\"type\":\"code-block\"},{\"__nid\":\"c7407530ea51681ab09ddc10a0e9d25ad868d363\",\"children\":[{\"text\":\"예시2: x-cos-grant-full-control로 권한 부여 금지\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"Ano8BZCWuB8ohTy8Yxoq9\",\"nodeId\":\"e8fbee38-04c4-485d-bf93-83f88c143a43\",\"type\":\"h4\"},{\"__nid\":\"19162785b1fd3d419fa7675a9a6ba20764ef94df\",\"children\":[{\"text\":\"다음 정책은 서브 계정에 객체 업로드 권한을 부여하지만, 사용자가 객체를 업로드할 때 x-cos-grant-full-control 헤더를 포함하지 않거나 헤더 값을 비워야 합니다.\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"h6ZR-6sLjThhWoQS9VMqB\",\"type\":\"p\"},{\"__nid\":\"b5bc26f3131963157eb51e21800890f12791f33c\",\"autoWrap\":false,\"children\":[{\"__nid\":\"b260076e980ec3d09298af1f4fefac3718effe26_188_0\",\"children\":[{\"text\":\"{\"}],\"id\":\"kgIR9ixEWFXX0olek3NhJ\",\"type\":\"code-line\"},{\"__nid\":\"f83f8b90759b5dbf448951255057129f86e771b8_188_1\",\"children\":[{\"text\":\"\\t\\\"statement\\\": [{\"}],\"id\":\"YsA6oahpoiofQ938K3hsQ\",\"type\":\"code-line\"},{\"__nid\":\"11a3a0365fe1080ab2ce5e77d830baac36a66791_188_2\",\"children\":[{\"text\":\"\\t\\t\\t\\\"action\\\": [\"}],\"id\":\"OopIaswEayLW3-rfL_1uj\",\"type\":\"code-line\"},{\"__nid\":\"14168f8b68970b13ced1b67290c089587f62b9ac_188_3\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:PutObject\\\",\"}],\"id\":\"TO8qJ-h_5FE83yR1J0PEh\",\"type\":\"code-line\"},{\"__nid\":\"6b98b2da9a0ebf1bb07627fe5b51d4082137786f_188_4\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:PostObject\\\",\"}],\"id\":\"Hv5_5Dxiyb0sb4-8xuAOt\",\"type\":\"code-line\"},{\"__nid\":\"119f6e97a387310d567f5ef4a57dff271a707828_188_5\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:AppendObject\\\",\"}],\"id\":\"WFdiJkSRYgkK7Mu2jLCLT\",\"type\":\"code-line\"},{\"__nid\":\"bd6eb4228641abfd325bbc3e155d8f17224dfd24_188_6\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:InitiateMultipartUpload\\\"\"}],\"id\":\"qwyn1LM5aTYGfNOmL_1S9\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_188_7\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"95gveRxdxwJfv23tu1kWm\",\"type\":\"code-line\"},{\"__nid\":\"e7e4a5a367ee941bb23ecf4e6d21360307c0e99c_188_8\",\"children\":[{\"text\":\"\\t\\t\\t\\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"HmQwZ4SZjPm-qIsO5i1zn\",\"type\":\"code-line\"},{\"__nid\":\"a59c2736771ee3a3b564803c99776dfa7b721046_188_9\",\"children\":[{\"text\":\"\\t\\t\\t\\\"principal\\\": {\"}],\"id\":\"3EojxHxEFtJ5kTgLMiNJt\",\"type\":\"code-line\"},{\"__nid\":\"2a29f208f1985b3e499dda357bc2ca62f54fc35b_188_10\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs\\\": [\"}],\"id\":\"2QblDtt6F__dOLg2MYhDR\",\"type\":\"code-line\"},{\"__nid\":\"7c58c1c767d3bd6741edc8ffbe686fde492ed46c_188_11\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"qcs::cam::uin/1250000000:uin/1250000001\\\"\"}],\"id\":\"jMG81NLjrxZp4i95-e7fV\",\"type\":\"code-line\"},{\"__nid\":\"f058e113345ac72a8b218f68132f8f422de810d4_188_12\",\"children\":[{\"text\":\"\\t\\t\\t\\t]\"}],\"id\":\"2Dut_qTklOwrELbrWUd47\",\"type\":\"code-line\"},{\"__nid\":\"24fc499c43548f991b1c2271e1ba41f95336c498_188_13\",\"children\":[{\"text\":\"\\t\\t\\t},\"}],\"id\":\"a5WnCyXDEnp21uPd3GaIE\",\"type\":\"code-line\"},{\"__nid\":\"3c118abbcd3715af1b41634dd0e0f22cbd1492bb_188_14\",\"children\":[{\"text\":\"\\t\\t\\t\\\"resource\\\": [\"}],\"id\":\"zyi1Jq9QMoCcy0JuWSlP5\",\"type\":\"code-line\"},{\"__nid\":\"4dbef0429de40e30f6bc3827612e8a406df65b4d_188_15\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*\\\"\"}],\"id\":\"g7zBOvZF73kWe7PHcnyZ7\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_188_16\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"Ku5iY2doibjd4q2eGURvj\",\"type\":\"code-line\"},{\"__nid\":\"fe1e4c0440d22c05b996618a8cabeb668ff13257_188_17\",\"children\":[{\"text\":\"\\t\\t\\t\\\"condition\\\": {\"}],\"id\":\"uNxDi2NCrmtYnpMAvtPIQ\",\"type\":\"code-line\"},{\"__nid\":\"a1c9e572d2004adc6b041c75b736718acef9f208\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"string_equal_if_exist\\\": {\"}],\"id\":\"xoEuB1Ceoc_xQK6jq4GkD\",\"type\":\"code-line\"},{\"__nid\":\"705e7a406b1d6c55ff6accb7e8d8e1150b66d2dc\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"cos:x-cos-grant-full-control\\\": \\\"\\\"\"}],\"id\":\"pTQon1pXgdw00C1nrCtTw\",\"type\":\"code-line\"},{\"__nid\":\"df94564ba317e6dadf47532cd5d9c61a5cbb4fa0_188_20\",\"children\":[{\"text\":\"\\t\\t\\t\\t}\"}],\"id\":\"3PhS1nCMFdRprMHvFRVFJ\",\"type\":\"code-line\"},{\"__nid\":\"f255231793c82495529dd40bed95adf5b2ea14d5_188_21\",\"children\":[{\"text\":\"\\t\\t\\t}\"}],\"id\":\"UtswRjkxVgM2fRsU5S3uO\",\"type\":\"code-line\"},{\"__nid\":\"5c71c4b53dd13d43ca331c82e0cc16c5e75a1ed5_188_22\",\"children\":[{\"text\":\"\\t\\t},\"}],\"id\":\"m2fmEqbvh_gYMta9vVUen\",\"type\":\"code-line\"},{\"__nid\":\"4a788153c4cdb05ac760af6a4f57ea1dd55e049c_188_23\",\"children\":[{\"text\":\"\\t\\t{\"}],\"id\":\"Lc44XR8-qSaJI2262W7w_\",\"type\":\"code-line\"},{\"__nid\":\"11a3a0365fe1080ab2ce5e77d830baac36a66791_188_24\",\"children\":[{\"text\":\"\\t\\t\\t\\\"action\\\": [\"}],\"id\":\"G_-s8Hh0GsqaEn13r4OeF\",\"type\":\"code-line\"},{\"__nid\":\"14168f8b68970b13ced1b67290c089587f62b9ac_188_25\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:PutObject\\\",\"}],\"id\":\"RUSVKCtOHoKtrNlOuewFp\",\"type\":\"code-line\"},{\"__nid\":\"6b98b2da9a0ebf1bb07627fe5b51d4082137786f_188_26\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:PostObject\\\",\"}],\"id\":\"_WCZFQohURS3YCEW4SsWI\",\"type\":\"code-line\"},{\"__nid\":\"119f6e97a387310d567f5ef4a57dff271a707828_188_27\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:AppendObject\\\",\"}],\"id\":\"IEbo6BuQ1nA21Y8cY0g9d\",\"type\":\"code-line\"},{\"__nid\":\"bd6eb4228641abfd325bbc3e155d8f17224dfd24_188_28\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"name/cos:InitiateMultipartUpload\\\"\"}],\"id\":\"wR0xFE4GQa5m4C22hvD3h\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_188_29\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"4ag7mXMgFNEybOfbdv6Bs\",\"type\":\"code-line\"},{\"__nid\":\"0dd69b92f1843af376cbc34076766ba074e79a49_188_30\",\"children\":[{\"text\":\"\\t\\t\\t\\\"effect\\\": \\\"deny\\\",\"}],\"id\":\"LL05_aa3xX6Smh0ve6pUZ\",\"type\":\"code-line\"},{\"__nid\":\"a59c2736771ee3a3b564803c99776dfa7b721046_188_31\",\"children\":[{\"text\":\"\\t\\t\\t\\\"principal\\\": {\"}],\"id\":\"98LLLGHvpZ-40osjZ38rv\",\"type\":\"code-line\"},{\"__nid\":\"2a29f208f1985b3e499dda357bc2ca62f54fc35b_188_32\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs\\\": [\"}],\"id\":\"WtUBxg2KNyD74sT9OOUVh\",\"type\":\"code-line\"},{\"__nid\":\"7c58c1c767d3bd6741edc8ffbe686fde492ed46c_188_33\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"qcs::cam::uin/1250000000:uin/1250000001\\\"\"}],\"id\":\"e0GbqBAHxT4IUDhmQh1cA\",\"type\":\"code-line\"},{\"__nid\":\"f058e113345ac72a8b218f68132f8f422de810d4_188_34\",\"children\":[{\"text\":\"\\t\\t\\t\\t]\"}],\"id\":\"IO-x_PtT3mTL6TwXwhdXB\",\"type\":\"code-line\"},{\"__nid\":\"24fc499c43548f991b1c2271e1ba41f95336c498_188_35\",\"children\":[{\"text\":\"\\t\\t\\t},\"}],\"id\":\"sFC6RxSa3F4R8rNNBU00K\",\"type\":\"code-line\"},{\"__nid\":\"3c118abbcd3715af1b41634dd0e0f22cbd1492bb_188_36\",\"children\":[{\"text\":\"\\t\\t\\t\\\"resource\\\": [\"}],\"id\":\"pseHwMNRo-0-pJ1l-3MOj\",\"type\":\"code-line\"},{\"__nid\":\"4dbef0429de40e30f6bc3827612e8a406df65b4d_188_37\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"qcs::cos:ap-beijing:uid/1250000000:bjtest-1250000000/*\\\"\"}],\"id\":\"AB49L_DtWTzT8qSawKZRI\",\"type\":\"code-line\"},{\"__nid\":\"542152568566feb11c5dd964652814eab74ea416_188_38\",\"children\":[{\"text\":\"\\t\\t\\t],\"}],\"id\":\"pdbl5sbp6-Dlu5KnRy0EI\",\"type\":\"code-line\"},{\"__nid\":\"fe1e4c0440d22c05b996618a8cabeb668ff13257_188_39\",\"children\":[{\"text\":\"\\t\\t\\t\\\"condition\\\": {\"}],\"id\":\"uo4L1EdqHyytYm-uxq0o2\",\"type\":\"code-line\"},{\"__nid\":\"bdeddd8b1d9c396751fa75afe43e822e657627b4_188_40\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\\"string_not_equal\\\": {\"}],\"id\":\"l3Ytck7Vm650rjsKSU2c4\",\"type\":\"code-line\"},{\"__nid\":\"705e7a406b1d6c55ff6accb7e8d8e1150b66d2dc_188_41\",\"children\":[{\"text\":\"\\t\\t\\t\\t\\t\\\"cos:x-cos-grant-full-control\\\": \\\"\\\"\"}],\"id\":\"NMKSWo7iKhvrMV4hcJA3M\",\"type\":\"code-line\"},{\"__nid\":\"df94564ba317e6dadf47532cd5d9c61a5cbb4fa0_188_42\",\"children\":[{\"text\":\"\\t\\t\\t\\t}\"}],\"id\":\"AZxfqQaTYHtfLSc1eE9bT\",\"type\":\"code-line\"},{\"__nid\":\"f255231793c82495529dd40bed95adf5b2ea14d5_188_43\",\"children\":[{\"text\":\"\\t\\t\\t}\"}],\"id\":\"cQChpNFuZjYuNeR3skdOY\",\"type\":\"code-line\"},{\"__nid\":\"f59d9a1ddc900c29ba91e554d276dd09622558d6_188_44\",\"children\":[{\"text\":\"\\t\\t}\"}],\"id\":\"LWgrUrOwKKrXdVGiZoJbe\",\"type\":\"code-line\"},{\"__nid\":\"1de72e57d44f4185fe1693d55f6bbba4fc36bd6b_188_45\",\"children\":[{\"text\":\"\\t],\"}],\"id\":\"AMRCJ_fdaMwW4diC7iToF\",\"type\":\"code-line\"},{\"__nid\":\"3113fa4f78898c56868c76dbe7f4f58512db38f2_188_46\",\"children\":[{\"text\":\"\\t\\\"version\\\": \\\"2.0\\\"\"}],\"id\":\"V9ySISMHwAv3rA4UHXYgt\",\"type\":\"code-line\"},{\"__nid\":\"29654058b578f4476937a1bcb3c2e5c295772e88_188_47\",\"children\":[{\"text\":\"}\"}],\"id\":\"WdJnJVMoW5xGPCGXPHy0N\",\"type\":\"code-line\"}],\"diff\":{\"type\":\"insert\"},\"dir\":\"right\",\"id\":\"_TqYRZssx83JiekzIhUv_\",\"language\":\"json\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"\"}],\"id\":\"aEigZPVebt3CCs2P2qwzI\",\"type\":\"p\"}]"}},"46466":{"categoryId":436,"weight":40,"type":"page","extension":"","pid":33419,"id":46466,"lang":"ko","title":"uni-app 직접 전송 실습","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2022-05-05 22:28:22","recentReleaseTime":"2022-05-05 22:28:22","content":{"title":"uni-app 직접 전송 실습","body":"

소개

이 문서는 SDK에 의존하지 않고 간단한 코드를 사용하여 uni-app에서 직접 파일을 COS(Cloud Object Storage, COS)의 버킷에 전송하는 방법을 소개합니다.
설명:
이 문서 내용은 XML API의 PostObject 인터페이스PutObject 인터페이스를 기반으로 합니다.

솔루션 설명

실행 과정

1. 프론트엔드에서 파일을 선택하면, 프론트엔드가 확장자를 서버로 전송합니다.
2. 서버 측은 확장자에 따라 시간이 포함된 임의의 COS 파일 경로를 생성하고, 해당 PostObject policy 서명을 계산한 후 URL과 서명 정보를 프론트엔드에 반환합니다.
3. 프론트엔드에서 PostObject 인터페이스 또는 PutObject 인터페이스를 호출하여 파일을 COS에 직접 업로드합니다.

솔루션 장점

경로 보안: 서버 측에서 결정한 임의의 COS 파일 경로를 사용하면 기존 파일의 덮어쓰기 문제와 보안 위험을 효과적으로 방지할 수 있습니다.
다중 플랫폼 호환성: uni-app에서 제공하는 파일 선택 및 업로드 인터페이스를 사용하면 하나의 코드로 다중 플랫폼(Web/미니프로그램/App)에서 호환 가능합니다.

전제 조건

1. COS 콘솔에 로그인하여 버킷을 생성하고, Bucket(버킷 이름) 및 Region(리전 이름)을 획득하십시오. 자세한 내용은 버킷 생성 문서를 참고하십시오.
2. CAM 콘솔에 로그인하여 프로젝트의 SecretId 및 SecretKey를 획득하십시오.
3. 방금 생성한 버킷 상세 페이지로 이동하여, 보안 관리 > 크로스 도메인 액세스 CORS 설정 페이지에서 규칙 추가를 클릭하십시오. 구성 예시는 아래 그림과 같습니다. 자세한 내용은 크로스 도메인 액세스 설정 문서를 참고하십시오.
\"\"


작업 절차

주의:
정식 배포 전에 서버 측에 웹사이트 자체에 대한 권한 검증 계층을 추가하는 것이 좋습니다.

프론트엔드 업로드

1. post-policy 예제(PostObject 서버 측 인터페이스) 또는 put-sign 예제(PutObject 서버 측 인터페이스)를 참고하여 임의 파일 경로 생성, 서명 계산 및 프론트엔드에 반환하는 데 사용합니다.
2. HBuilderX 기본 템플릿(자세한 내용은 HBuilderX 공식 웹사이트 참조)을 사용하여 uni-app 애플리케이션을 생성합니다.
3. 파일 > 새로 만들기 > 프로젝트를 선택합니다. 생성 완료 후, 해당 애플리케이션은 Vue 기반 프로젝트가 됩니다.
4. 다음 코드를 복사하여 pages/index/index.vue 파일 내용을 대체하고, 호출하는 post-policy 인터페이스 링크를 수정하여 자신의 서버 주소(즉, 1단계의 서버 인터페이스)로 지정합니다.
PostObject 업로드
<template>
<view class="content">
<button type="default" @click="selectUpload">파일 선택하여 업로드</button>
<image v-if="fileUrl" class="image" :src="fileUrl"></image>
</view>
</template>

<script>
export default {
data() {
return {
title: 'Hello',
fileUrl: ''
};
},
onLoad() {

},
methods: {
selectUpload() {

var vm = this;

// 더 많은 문자 인코딩의 url encode 형식
var camSafeUrlEncode = function (str) {
return encodeURIComponent(str)
.replace(/!/g, '%21')
.replace(/'/g, '%27')
.replace(/\\(/g, '%28')
.replace(/\\)/g, '%29')
.replace(/\\*/g, '%2A');
};

// 업로드 경로 및 인증서 획득
var getUploadInfo = function (extName, callback) {
// 파일 확장자를 전달하여 백엔드에서 임의의 COS 객체 경로를 생성하고, 업로드 도메인 및 PostObject 인터페이스에 필요한 policy 서명을 반환합니다.
// 서버 측 예제 참조: https://github.com/tencentyun/cos-demo/tree/main/server/post-policy
uni.request({
url: 'http://127.0.0.1:3000/post-policy?ext=' + extName,
success: (res) => {
// 반환 형식이 올바른지 확인
console.log(res);
callback && callback(null, res.data);
},
error(err) {
callback && callback(err);
},
});
};

// 업로드 요청 시작, PostObject 인터페이스를 사용하여 업로드하며 policy 서명으로 보호합니다.
// 인터페이스 문서:https://www.tencentcloud.com/document/product/436/14690#.E7.AD.BE.E5.90.8D.E4.BF.9D.E6.8A.A4
var uploadFile = function (opt, callback) {
var formData = {
key: opt.cosKey,
policy: opt.policy, // 이 값은 policy의 base64 문자열을 전달합니다.
success_action_status: 200,
'q-sign-algorithm': opt.qSignAlgorithm,
'q-ak': opt.qAk,
'q-key-time': opt.qKeyTime,
'q-signature': opt.qSignature,
};
// 서버 측에서 임시 키를 생성한 경우 x-cos-security-token을 전달해야 합니다.
if (opt.securityToken) formData['x-cos-security-token'] = opt.securityToken;
uni.uploadFile({
url: 'https://' + opt.cosHost, //예시일 뿐, 실제 인터페이스 주소가 아닙니다.
filePath: opt.filePath,
name: 'file',
formData: formData,
success: (res) => {
if (![200, 204].includes(res.statusCode)) return callback && callback(res);
var fileUrl = 'https://' + opt.cosHost + '/' + camSafeUrlEncode(opt.cosKey).replace(/%2F/g, '/');
callback && callback(null, fileUrl);
},
error(err) {
callback && callback(err);
},
});
};

// 파일 선택
uni.chooseImage({
success: (chooseImageRes) => {
var file = chooseImageRes.tempFiles[0];
if (!file) return;
// 업로드할 로컬 파일 경로 가져오기
var filePath = chooseImageRes.tempFilePaths[0];
// 업로드한 파일의 확장자를 가져와 백엔드에서 임의의 COS 경로 주소를 생성합니다.
var fileName = file.name;
var lastIndex = fileName.lastIndexOf('.');
var extName = lastIndex > -1 ? fileName.slice(lastIndex + 1) : '';
// 사전 업로드용 도메인, 경로, 자격 증명 가져오기
getUploadInfo(extName, function (err, info) {
// 반환된 info 형식이 올바른지 확인
console.log(info);
// 파일 업로드
info.filePath = filePath;
uploadFile(info, function (err, fileUrl) {
vm.fileUrl = fileUrl;
});
});
}
});
},
}
}
</script>

<style>
.content {
padding: 20px 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}

.image {
margin-top: 20px;
margin-left: auto;
margin-right: auto;
}
</style>
PutObject 업로드
<template>
<view class="content">
<button type="default" @click="selectUpload">파일 선택하여 업로드</button>
<image v-if="fileUrl" class="image" :src="fileUrl"></image>
</view>
</template>

<script>
export default {
data() {
return {
title: 'Hello',
fileUrl: ''
};
},
onLoad() {

},
methods: {
selectUpload() {
var vm = this;
// 더 많은 문자 인코딩의 url encode 형식
var camSafeUrlEncode = function (str) {
return encodeURIComponent(str)
.replace(/!/g, '%21')
.replace(/'/g, '%27')
.replace(/\\(/g, '%28')
.replace(/\\)/g, '%29')
.replace(/\\*/g, '%2A');
};
// 업로드 경로 및 인증서 획득
var getUploadInfo = function (extName, callback) {
// 파일 확장자를 전달하여 백엔드에서 임의의 COS 객체 경로를 생성하고, PUT Object 인터페이스에 사용할 서명을 반환합니다.
// 백엔드는 다음 항목을 반환해야 함: cosHost, cosKey, authorization, securityToken(선택 사항)
uni.request({
url: 'http://127.0.0.1:3000/put-signature?ext=' + extName,
success: (res) => {
// 반환 형식이 올바른지 확인
console.log(res);
callback && callback(null, res.data);
},
fail(err) {
callback && callback(err);
},
});
};
// 파일을 ArrayBuffer로 읽기
var readFileAsArrayBuffer = function (filePath, callback) {
uni.getFileSystemManager().readFile({
filePath: filePath,
success: (res) => {
callback && callback(null, res.data); // res.data는 ArrayBuffer입니다
},
fail(err) {
callback && callback(err);
}
});
};
// 업로드 요청 시작, PUT Object 인터페이스 사용
// 인터페이스 문서:https://www.tencentcloud.com/document/product/436/7749
var uploadFile = function (opt, fileData, callback) {
var headers = {
'Authorization': opt.authorization, // 서명 정보
'Content-Type': opt.contentType || 'application/octet-stream'
};
// 서버 측에서 임시 키를 생성한 경우 x-cos-security-token을 전달해야 합니다.
if (opt.securityToken) {
headers['x-cos-security-token'] = opt.securityToken;
}
console.log('업로드 요청 정보:', {
url: 'https://' + opt.cosHost + '/' + opt.cosKey,
headers: headers
});

uni.request({
url: 'https://' + opt.cosHost + '/' + opt.cosKey,
method: 'PUT',
header: headers,
data: fileData, // ArrayBuffer 형식
success: (res) => {
console.log('업로드 응답:', res);
if (![200, 204].includes(res.statusCode)) {
console.error('업로드 실패, 상태 코드:', res.statusCode);
return callback && callback(res);
}
var fileUrl = 'https://' + opt.cosHost + '/' + camSafeUrlEncode(opt.cosKey).replace(/%2F/g, '/');
callback && callback(null, fileUrl);
},
fail(err) {
console.error('업로드 요청 실패:', err);
callback && callback(err);
},
});
};

// 파일 선택
uni.chooseImage({
success: (chooseImageRes) => {
var file = chooseImageRes.tempFiles[0];
if (!file) return;
// 업로드할 로컬 파일 경로 가져오기
var filePath = chooseImageRes.tempFilePaths[0];
// 업로드한 파일의 확장자를 가져와 백엔드에서 임의의 COS 경로 주소를 생성합니다.
var fileName = file.name;
var lastIndex = fileName.lastIndexOf('.');
var extName = lastIndex > -1 ? fileName.slice(lastIndex + 1) : '';
// 사전 업로드용 도메인, 경로, 서명 가져오기
getUploadInfo(extName, function (err, info) {
if (err) {
console.error('업로드 정보 가져오기 실패:', err);
return;
}
// 반환된 info 형식이 올바른지 확인
console.log(info);
// 파일을 ArrayBuffer로 읽기
readFileAsArrayBuffer(filePath, function (err, fileData) {
if (err) {
console.error('파일 읽기 실패:', err);
return;
}
// 파일 업로드
uploadFile(info, fileData, function (err, fileUrl) {
if (err) {
console.error('업로드 실패:', err);
return;
}
vm.fileUrl = fileUrl;
console.log('업로드 성공:', fileUrl);
});
});
});
}
});
},
}
}
</script>

<style>
.content {
padding: 20px 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}

.image {
margin-top: 20px;
margin-left: auto;
margin-right: auto;
}
</style>
5. HBuilderX에서 실행 > 브라우저에서 실행 > Chrome을 선택하면 브라우저에서 파일을 선택하여 업로드할 수 있습니다.
6. 실행 효과는 다음 그림과 같습니다.
프로젝트 생성:\n
\"uni-app


직접 전송 효과:\n
\"uni-app



관련 문서

","recentReleaseTime":"2026-02-09 15:11:14","slate":"[{\"children\":[{\"text\":\"소개\"}],\"id\":\"ohcXa9ZvLDu05RR3h8d1B\",\"nodeId\":\".E7.AE.80.E4.BB.8B\",\"type\":\"h2\"},{\"children\":[{\"text\":\"이 문서는 SDK에 의존하지 않고 간단한 코드를 사용하여 uni-app에서 직접 파일을 COS(Cloud Object Storage, COS)의 버킷에 전송하는 방법을 소개합니다.\"}],\"id\":\"II4ozhV00FMVZBWNI1aNU\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"id\":\"HMedQePH0YrTWE86ChDcK\",\"type\":\"p\"},{\"children\":[{\"text\":\"이 문서 내용은 XML API의 \"},{\"children\":[{\"text\":\"PostObject 인터페이스\"}],\"id\":\"8-9MwWxo653Vt0MdqDN3N\",\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14690\"},\"type\":\"ref\"},{\"text\":\" 및 \"},{\"children\":[{\"text\":\"PutObject 인터페이스\"}],\"id\":\"KhPyG317792-o3HiBooyV\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/7749\"},\"type\":\"ref\"},{\"text\":\"를 기반으로 합니다.\"}],\"id\":\"7hai9jA0A-Q-ri1w4Up5i\",\"type\":\"p\"}],\"hintType\":\"info\",\"id\":\"9tD0HU_XVVkH4KJDb-rUF\",\"type\":\"hint\"},{\"children\":[{\"text\":\"솔루션 설명\"}],\"id\":\"Xwg2OjRmAHk5S-pEVvqna\",\"nodeId\":\".E6.96.B9.E6.A1.88.E8.AF.B4.E6.98.8E\",\"type\":\"h2\"},{\"children\":[{\"text\":\"실행 과정\"}],\"id\":\"69i9kH9JYs445q-HnQmtu\",\"nodeId\":\".E6.89.A7.E8.A1.8C.E8.BF.87.E7.A8.8B\",\"type\":\"h3\"},{\"children\":[{\"text\":\"프론트엔드에서 파일을 선택하면, 프론트엔드가 확장자를 서버로 전송합니다.\"}],\"id\":\"bIl7gm9l2LEb7_dSG0iD_\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"서버 측은 확장자에 따라 시간이 포함된 임의의 COS 파일 경로를 생성하고, 해당 PostObject policy 서명을 계산한 후 URL과 서명 정보를 프론트엔드에 반환합니다.\"}],\"id\":\"fSawqkh3uxGDAWztb7_Pa\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"프론트엔드에서 \"},{\"children\":[{\"text\":\"PostObject 인터페이스\"}],\"id\":\"M0gs-UQWiHTirdWqV3yqL\",\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14690\"},\"type\":\"ref\"},{\"text\":\" 또는 \"},{\"children\":[{\"text\":\"PutObject 인터페이스\"}],\"id\":\"ycnGLbfmz8dAwrEbOXf8v\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/7749\"},\"type\":\"ref\"},{\"text\":\"를 호출하여 파일을 COS에 직접 업로드합니다.\"}],\"id\":\"zBb-E6L2zMSgD1Da_XAc4\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"솔루션 장점\"}],\"id\":\"4YT7GI67haSdSgY5kkSMT\",\"nodeId\":\"750a6007-3fbf-45b3-aebb-342ca91d5275\",\"type\":\"h3\"},{\"children\":[{\"text\":\"경로 보안: 서버 측에서 결정한 임의의 COS 파일 경로를 사용하면 기존 파일의 덮어쓰기 문제와 보안 위험을 효과적으로 방지할 수 있습니다.\"}],\"id\":\"UIHCVcaHdcSqO59MUZ8qm\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"다중 플랫폼 호환성: uni-app에서 제공하는 파일 선택 및 업로드 인터페이스를 사용하면 하나의 코드로 다중 플랫폼(Web/미니프로그램/App)에서 호환 가능합니다.\"}],\"id\":\"QbB9Uga-nVhKZDJDaN1ZA\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"전제 조건\"}],\"id\":\"WHGLsFBgYOuC9fgTLPtP2\",\"nodeId\":\".E5.89.8D.E6.8F.90.E6.9D.A1.E4.BB.B6\",\"type\":\"h2\"},{\"children\":[{\"children\":[{\"text\":\"COS 콘솔\"}],\"id\":\"aiZ_ZW7AWCI4_4RkCQ9t0\",\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\"},{\"text\":\"에 로그인하여 버킷을 생성하고, Bucket(버킷 이름) 및 Region(리전 이름)을 획득하십시오. 자세한 내용은 \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"id\":\"3j7J-O6fs_wSRjcZHWc49\",\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14106\"},\"type\":\"ref\"},{\"text\":\" 문서를 참고하십시오.\"}],\"id\":\"UXGMj_clo-4f6TBijHT6d\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"CAM 콘솔\"}],\"id\":\"E-ACLX20kyia9ZB8zbncR\",\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/capi\"},\"type\":\"ref\"},{\"text\":\"에 로그인하여 프로젝트의 SecretId 및 SecretKey를 획득하십시오.\"}],\"id\":\"vNqc5EHFRpJQ9wiuleJca\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"방금 생성한 버킷 상세 페이지로 이동하여, \"},{\"b\":1,\"text\":\"보안 관리\"},{\"text\":\" \\u003e \"},{\"b\":1,\"text\":\"크로스 도메인 액세스 CORS 설정\"},{\"text\":\" 페이지에서 \"},{\"b\":1,\"text\":\"규칙 추가\"},{\"text\":\"를 클릭하십시오. 구성 예시는 아래 그림과 같습니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"크로스 도메인 액세스 설정\"}],\"id\":\"ct1j2AK8PXNuTcl8mCqdj\",\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/13318\"},\"type\":\"ref\"},{\"text\":\" 문서를 참고하십시오.\"}],\"id\":\"tg14W8rri-aqhSPjyllsw\",\"start\":false,\"type\":\"oli\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"IV3a18s_V92Rw9A8cf6HM\",\"indent\":1,\"inline\":false,\"naturalSize\":[958,796],\"size\":[635,527.6200417536535],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/0837675bf5e611f09af3525400a31896.png\"},{\"children\":[{\"text\":\"작업 절차\"}],\"id\":\"0SpHk6jjWCUAhTLryfb2y\",\"nodeId\":\".E5.AE.9E.E8.B7.B5.E6.AD.A5.E9.AA.A4\",\"type\":\"h2\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"id\":\"2qYsLC5M3yXzPAKGjsdwH\",\"type\":\"p\"},{\"children\":[{\"text\":\"정식 배포 전에 서버 측에 웹사이트 자체에 대한 권한 검증 계층을 추가하는 것이 좋습니다.\"}],\"id\":\"Xy6qu6qLFPIgY7xw2UeNo\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"KUwPs0VZ-WcB6SVQHWBi6\",\"type\":\"hint\"},{\"children\":[{\"text\":\"프론트엔드 업로드\"}],\"id\":\"axu1ysUzDvHuBPXRdqIKU\",\"nodeId\":\".E5.89.8D.E7.AB.AF.E4.B8.8A.E4.BC.A0\",\"type\":\"h3\"},{\"children\":[{\"children\":[{\"text\":\"post-policy 예제\"}],\"id\":\"AdrPUZ7DylF4ArvsJELCW\",\"linkTarget\":\"blank\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/tree/main/server/post-policy/\"},\"type\":\"ref\"},{\"text\":\"(PostObject 서버 측 인터페이스) 또는 \"},{\"children\":[{\"text\":\"put-sign 예제\"}],\"id\":\"Rx9aLrLz1hk3xijBCb8jE\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/server/upload-sign/nodejs/app.js\"},\"type\":\"ref\"},{\"text\":\"(PutObject 서버 측 인터페이스)를 참고하여 임의 파일 경로 생성, 서명 계산 및 프론트엔드에 반환하는 데 사용합니다.\"}],\"id\":\"HkhPUxXu3qu1-aIcZiZof\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"HBuilderX 기본 템플릿(자세한 내용은 \"},{\"children\":[{\"text\":\"HBuilderX 공식 웹사이트\"}],\"id\":\"J8VVs4SW_cVtTOqgfOsCz\",\"props\":{\"type\":\"link\",\"url\":\"https://www.dcloud.io/hbuilderx.html\"},\"type\":\"ref\"},{\"text\":\" 참조)을 사용하여 uni-app 애플리케이션을 생성합니다.\"}],\"id\":\"mnPZMX4W7L_kn1HSuIbrR\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"파일\"},{\"text\":\" \\u003e \"},{\"b\":1,\"text\":\"새로 만들기\"},{\"text\":\" \\u003e \"},{\"b\":1,\"text\":\"프로젝트\"},{\"text\":\"를 선택합니다. 생성 완료 후, 해당 애플리케이션은 Vue 기반 프로젝트가 됩니다.\"}],\"id\":\"ogm7NvYXe1JRWFfULGTw_\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"다음 코드를 복사하여 pages/index/index.vue 파일 내용을 대체하고, 호출하는 post-policy 인터페이스 링크를 수정하여 자신의 서버 주소(즉, 1단계의 서버 인터페이스)로 지정합니다.\"}],\"id\":\"JfhJ-f3pcH0yN5TiI9jwH\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"\\u003ctemplate\\u003e\"}],\"id\":\"RU_TbaCQDeViUdWJkDhw_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cview class=\\\"content\\\"\\u003e\"}],\"id\":\"BBwF6RHPOZiNnF8vf7GX1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cbutton type=\\\"default\\\" @click=\\\"selectUpload\\\"\\u003e파일 선택하여 업로드\\u003c/button\\u003e\"}],\"id\":\"fHuY6XkIzIOhzLIs5R2pG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cimage v-if=\\\"fileUrl\\\" class=\\\"image\\\" :src=\\\"fileUrl\\\"\\u003e\\u003c/image\\u003e\"}],\"id\":\"TQyFhhNY8xeg95g52zr8H\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/view\\u003e\"}],\"id\":\"aA0THKUEOHtmm4QuTHGGL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/template\\u003e\"}],\"id\":\"G90I0CCAMg-3uVWy7KsL-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"hGjqRZGmGxsMq2NgUUgCR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cscript\\u003e\"}],\"id\":\"zmcWQSM_l-6HV3uVd3IRQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"export default {\"}],\"id\":\"ldfZIffeXNuzdR961xdY1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" data() {\"}],\"id\":\"8bm-gSddMdUgvgocgCNxM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return {\"}],\"id\":\"tXdWyxLFKVfvsk_AMkiTD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" title: 'Hello',\"}],\"id\":\"kwfeCNNqxdA6060WlafsM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fileUrl: ''\"}],\"id\":\"N99mMxfXcR_UfGR0VUWyg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"fVAKQBta4ZGF2EFeX1xpe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"M8Ao7O-q_8uzo1mXo94RM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" onLoad() {\"}],\"id\":\"r9SeltAkb2nHbrJwXOf4J\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"FBOTy2g-Lg1hcgCdHeOLd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"0t96yjEr9WY4ps3_J42DN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" methods: {\"}],\"id\":\"TWHkXVj83mM-7ZEUQOdZG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" selectUpload() {\"}],\"id\":\"cHk6rufY2RXqJepxdkMU3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"YIo8NrOx8pO07AR-75yZZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var vm = this;\"}],\"id\":\"4REGYK6I8tzoFC0_HJIpK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"igits09x35PzhC81A2qvq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 더 많은 문자 인코딩의 url encode 형식\"}],\"id\":\"Zc4FWgL6DRRESYKvvPOeU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var camSafeUrlEncode = function (str) {\"}],\"id\":\"0YwgcfABVLkz9-x3AWgDM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return encodeURIComponent(str)\"}],\"id\":\"ut_g8KtazPrBASP4aIXsr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .replace(/!/g, '%21')\"}],\"id\":\"MD7Li8pC5Wg2jxa3VEXEx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .replace(/'/g, '%27')\"}],\"id\":\"Z0xcgyiJN6K30kPaeX1ns\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .replace(/\\\\(/g, '%28')\"}],\"id\":\"6yrgIGBy5F_zPS35n7v_b\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .replace(/\\\\)/g, '%29')\"}],\"id\":\"hNidLDl1V4g5gBRBuDLMQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .replace(/\\\\*/g, '%2A');\"}],\"id\":\"gxVEbAMhf0HsZwQyPb4z1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"oIrt_OdMxUz9f8Yu1T3oZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"4SuQwVjIHqerQU8OGTas9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드 경로 및 인증서 획득\"}],\"id\":\"KbDzBmVXuuHAFPi2iFHsa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var getUploadInfo = function (extName, callback) {\"}],\"id\":\"tJPppPHNOrNBBmYbpGlC-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 파일 확장자를 전달하여 백엔드에서 임의의 COS 객체 경로를 생성하고, 업로드 도메인 및 PostObject 인터페이스에 필요한 policy 서명을 반환합니다.\"}],\"id\":\"-4iSkd4x1i-0P9LSDaUHh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 서버 측 예제 참조: https://github.com/tencentyun/cos-demo/tree/main/server/post-policy\"}],\"id\":\"puvJKw7KFipUx4i6kuNmV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uni.request({\"}],\"id\":\"J5R2EptDC4CH3uzprQA7J\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: 'http://127.0.0.1:3000/post-policy?ext=' + extName,\"}],\"id\":\"o2L05wtRl2h7WpIH3xNCW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" success: (res) =\\u003e {\"}],\"id\":\"d9zBnyejAWnjdn5PJBIPi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 반환 형식이 올바른지 확인\"}],\"id\":\"rlzMcYPpi6VgVjjWVLU8F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(res);\"}],\"id\":\"7c9IRUioUB194RlfiaZ5p\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" callback \\u0026\\u0026 callback(null, res.data);\"}],\"id\":\"qOK6CgIcL27WoiwluvSCt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"dU-V4JLMzIjAFWHR0sGcS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" error(err) {\"}],\"id\":\"d16ZpF_2jx9zkQz_L7dJh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" callback \\u0026\\u0026 callback(err);\"}],\"id\":\"x2nL2YNMYNthxt-tCYHto\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"vECuF41zNhm_YKZUj3YiK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"F5ONacUyyi5CV840E-i2C\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"GPJ67Ke-E-S3upXPnWyzN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"A7rwmiIVGEyfXmhjcHF9z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드 요청 시작, PostObject 인터페이스를 사용하여 업로드하며 policy 서명으로 보호합니다.\"}],\"id\":\"PhObRf_YVJkKPGjZvhmTo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 인터페이스 문서:https://www.tencentcloud.com/document/product/436/14690#.E7.AD.BE.E5.90.8D.E4.BF.9D.E6.8A.A4\"}],\"id\":\"TMKxp0A5RvO9EaMoBdqBE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var uploadFile = function (opt, callback) {\"}],\"id\":\"RKw8kl4URw0a5bAE2eqnR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var formData = {\"}],\"id\":\"Xq2qeI3oXoLhUw-RCxyZq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" key: opt.cosKey,\"}],\"id\":\"ePJsgnMdqqTD_cCj1fMyw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" policy: opt.policy, // 이 값은 policy의 base64 문자열을 전달합니다.\"}],\"id\":\"AwDHHcFPdX2tLKLdxA5RX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" success_action_status: 200,\"}],\"id\":\"-vLP6Hvsn1-3GbBcZh-pu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'q-sign-algorithm': opt.qSignAlgorithm,\"}],\"id\":\"bHnc6ylkw3jjIZ7rBLvyC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'q-ak': opt.qAk,\"}],\"id\":\"HMBUU7eMBiUemE1Wmp18z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'q-key-time': opt.qKeyTime,\"}],\"id\":\"jYeAo19XocGLpuQR6tZ5J\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'q-signature': opt.qSignature,\"}],\"id\":\"xXp5m6wWlTlVh5rkULFWw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"LZbZBm-PN3hfgOn3-ecd8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 서버 측에서 임시 키를 생성한 경우 x-cos-security-token을 전달해야 합니다.\"}],\"id\":\"6WXoKdwI_qf3yYTzaNkPS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (opt.securityToken) formData['x-cos-security-token'] = opt.securityToken;\"}],\"id\":\"vyVgERM5v1Ki1MXI0LUWX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uni.uploadFile({\"}],\"id\":\"tTGKfc6mDLNtByQ90VBk3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: 'https://' + opt.cosHost, //예시일 뿐, 실제 인터페이스 주소가 아닙니다.\"}],\"id\":\"2qXyB-gW3v5zkCPcro3Kx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" filePath: opt.filePath,\"}],\"id\":\"Hk7W7zmxzXfpcgwrAcZYu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" name: 'file',\"}],\"id\":\"raZXoOMjeCSBMaWeciZYN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" formData: formData,\"}],\"id\":\"4IuDvQpOuELOSdQPUhUR9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" success: (res) =\\u003e {\"}],\"id\":\"s1_k26RPic8W-EyivnrwL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (![200, 204].includes(res.statusCode)) return callback \\u0026\\u0026 callback(res);\"}],\"id\":\"bMbW72RAs7sG7wGTElfQr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var fileUrl = 'https://' + opt.cosHost + '/' + camSafeUrlEncode(opt.cosKey).replace(/%2F/g, '/');\"}],\"id\":\"KsiSM0nGcg0BXW7mF6UVZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" callback \\u0026\\u0026 callback(null, fileUrl);\"}],\"id\":\"MvBCBeXrMrkn4-x_qhzvy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"8zPorCmwGleKwx6z4gAjA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" error(err) {\"}],\"id\":\"rjeZMxjgy832Ecze8Fggy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" callback \\u0026\\u0026 callback(err);\"}],\"id\":\"2cIzaqFGWR7axC75KBdno\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"2Ss0wyGlCUVBY93m5s9qJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"j8AUUkM6fA9xWAjBAkYBI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"sAEj7N7CkMkhgYBejxl3L\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"NWpJbYBTqRw8rQwQQohcq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 파일 선택\"}],\"id\":\"xJQ7bc42oYQ-yxGbRUscD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uni.chooseImage({\"}],\"id\":\"NYS1pZ4M7DYnjFYK27U5l\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" success: (chooseImageRes) =\\u003e {\"}],\"id\":\"n5vZvDezxDDJPZ32-5hE2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var file = chooseImageRes.tempFiles[0];\"}],\"id\":\"q0XO18bHGZ0FBgFxaB76u\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (!file) return;\"}],\"id\":\"J7LPNqIJs2DfjaZ0vTCob\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드할 로컬 파일 경로 가져오기\"}],\"id\":\"v2aXan8_-Ycc8-egPhws2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var filePath = chooseImageRes.tempFilePaths[0];\"}],\"id\":\"9HhJ1q5z3w8RN9bwgnsxb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드한 파일의 확장자를 가져와 백엔드에서 임의의 COS 경로 주소를 생성합니다.\"}],\"id\":\"vilGRs0JOZN2SNsmU6Ltt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var fileName = file.name;\"}],\"id\":\"scKXrGmChd0E5bZEncb_7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var lastIndex = fileName.lastIndexOf('.');\"}],\"id\":\"GN1kYQhoOLxEzYZqQE9Ei\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var extName = lastIndex \\u003e -1 ? fileName.slice(lastIndex + 1) : '';\"}],\"id\":\"BHoIIxXFWyi3G4CycMGwq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 사전 업로드용 도메인, 경로, 자격 증명 가져오기\"}],\"id\":\"9rUn2RgPaGCKKLkohlr6i\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" getUploadInfo(extName, function (err, info) {\"}],\"id\":\"cp3Gunyl9SNKAGagjfxYp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 반환된 info 형식이 올바른지 확인\"}],\"id\":\"eG-Cu2T7u7T8Q8N0X2G1W\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(info);\"}],\"id\":\"Jt3FNLjlquu2fLU_ib6v6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 파일 업로드\"}],\"id\":\"vV5RzKBl2yJKX9ceQB3g2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" info.filePath = filePath;\"}],\"id\":\"yG_znkST6lKUKQ9e0jRkt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uploadFile(info, function (err, fileUrl) {\"}],\"id\":\"rHnRuWHhHCS481UsPjfk9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" vm.fileUrl = fileUrl;\"}],\"id\":\"4XT-ypsT7RbbOtusP1oVc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"VL9FdKR4IRzAf-ANCQzc7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"FACMebWYU0HbtRjw69gIq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"TZvgNUizv9Xa_UoWDX47f\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"zWzjNSWw7DxgJK8Sm2STX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"vh1fEv687Q1o9OYPf5Jt1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"z3U1QX2Y--YMZn7D5jHZJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"uLWlS2jHMYTdwPFJR74K1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/script\\u003e\"}],\"id\":\"SaRYcY_yCT7urB_9ldvkX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"2uVmVyEJolokskoiSyfb0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cstyle\\u003e\"}],\"id\":\"LuRVkiQEf3PMhU9w-dbw-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\".content {\"}],\"id\":\"M_l5u_RgtKGIxZ5E9pNas\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" padding: 20px 0;\"}],\"id\":\"Akqy00Hc4ilUwOcKFnRf_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" display: flex;\"}],\"id\":\"baFMXz-H-L_LAVtgQHCoM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" flex-direction: column;\"}],\"id\":\"NOhFo81r9riuCUl73Llcy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" align-items: center;\"}],\"id\":\"I5Kfm-fkYRV-RMIQnIAoo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" justify-content: center;\"}],\"id\":\"iOuyHMr0d0RULmZJ1bq3_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"6R5xVxXj8-b6HFiX14EMC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"SzLmAIxaUkXTDpTaBT1tS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\".image {\"}],\"id\":\"aERUl4WusuiglIOjZab4z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" margin-top: 20px;\"}],\"id\":\"DGgGKZP1Av4jlFTlea7Mb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" margin-left: auto;\"}],\"id\":\"-zdV1muG_T9wY4ZdD10VO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" margin-right: auto;\"}],\"id\":\"npjZzJmXq7-WepCEYsCb4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"sHqWwHoMzVRI2xljaq2Gr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/style\\u003e\"}],\"id\":\"EesIbpkQIMkqsT9YIM-dQ\",\"type\":\"code-line\"}],\"executionContext\":{},\"id\":\"A9MfCIGDOuW3Rz3QsEqJt\",\"language\":\"java\",\"type\":\"code-block\"}],\"id\":\"qx9KsmPn2y8PubNsuvbYp\",\"name\":\"PostObject 업로드\",\"type\":\"tab\"},{\"children\":[{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"\\u003ctemplate\\u003e\"}],\"id\":\"KvA69kOgwUX87xT3A79Px\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cview class=\\\"content\\\"\\u003e\"}],\"id\":\"PaHuj27rja_yM8TjOfhLn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cbutton type=\\\"default\\\" @click=\\\"selectUpload\\\"\\u003e파일 선택하여 업로드\\u003c/button\\u003e\"}],\"id\":\"smFTASRc5fnMfnQS_ECvQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003cimage v-if=\\\"fileUrl\\\" class=\\\"image\\\" :src=\\\"fileUrl\\\"\\u003e\\u003c/image\\u003e\"}],\"id\":\"SJRXA7_PmzBz-BbS8k7Pk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/view\\u003e\"}],\"id\":\"SYxfR7_8q3o-1I9szXeHz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/template\\u003e\"}],\"id\":\"NBI13L-Ub3PkEbHvaX1-L\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"8OEr46Wu8_oJVTB7Jtn6G\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cscript\\u003e\"}],\"id\":\"A49hDTS0iABK9vPnnL4nW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"export default {\"}],\"id\":\"AwKq1kKJ-c_HtIb9D_IGW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" data() {\"}],\"id\":\"CsOmayJb_lN5n9Fb_AHSi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return {\"}],\"id\":\"KIkhsmChU2UtTenWLF0Dr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" title: 'Hello',\"}],\"id\":\"Z1a6hN1upVWJ4xhNK0DuY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fileUrl: ''\"}],\"id\":\"adgCVsihEfQ2F3RyFFjv3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"6bI1aXS1lszx4VL6aYoRC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"6y5ftndmTHcUIl9hyQdVC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" onLoad() {\"}],\"id\":\"ONXxFVQobpYaafjbpkxX1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"EMLJGMgMwsK3TrJ4j01-c\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"k2UejkmMYqWAgoBlHKSwR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" methods: {\"}],\"id\":\"F56zyoaAA6tgBmrkq-Ci4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" selectUpload() {\"}],\"id\":\"K8pPHGOj1yo3oWkPuuzwz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var vm = this;\"}],\"id\":\"zepPF1eCzP6D-jrD1tcOF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 더 많은 문자 인코딩의 url encode 형식\"}],\"id\":\"KbZTcHKLmY5FySaAU-hii\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var camSafeUrlEncode = function (str) {\"}],\"id\":\"TM5pgaaTcrubFxiicGxWS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return encodeURIComponent(str)\"}],\"id\":\"WZB_uELeSLIqrl0S-vGJF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .replace(/!/g, '%21')\"}],\"id\":\"-m2zVf955LXqRU_01ClnD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .replace(/'/g, '%27')\"}],\"id\":\"vmm513UmOgcTuWNQHSLUH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .replace(/\\\\(/g, '%28')\"}],\"id\":\"patELmO_rVlBQ_OtEoS1p\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .replace(/\\\\)/g, '%29')\"}],\"id\":\"j1JEcPTlcCBseg3GSZAUr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .replace(/\\\\*/g, '%2A');\"}],\"id\":\"8sdLlVU6TzoedLP0yrjM4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"bY2eQ9RQ3PCWAkDvVkUkC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드 경로 및 인증서 획득\"}],\"id\":\"UGPZbBeIOyb8fFaM7RRTg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var getUploadInfo = function (extName, callback) {\"}],\"id\":\"66pd3UfHNP6HJk1rAZOwQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 파일 확장자를 전달하여 백엔드에서 임의의 COS 객체 경로를 생성하고, PUT Object 인터페이스에 사용할 서명을 반환합니다.\"}],\"id\":\"ISUx5XYHg5sR05fporzr4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 백엔드는 다음 항목을 반환해야 함: cosHost, cosKey, authorization, securityToken(선택 사항)\"}],\"id\":\"s2mHdek_DKFta4DY0b0za\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uni.request({\"}],\"id\":\"C2QpkePHpoKjoQVL69vq0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: 'http://127.0.0.1:3000/put-signature?ext=' + extName,\"}],\"id\":\"Y3lohhmnK2goow4z6G-X6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" success: (res) =\\u003e {\"}],\"id\":\"7e_RLEM1K6F4sWrJMB_Tj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 반환 형식이 올바른지 확인\"}],\"id\":\"GeMV4ZXIiklJ1kU-Jwf0R\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(res);\"}],\"id\":\"BZUr9QXoesLcoqNgmdyBV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" callback \\u0026\\u0026 callback(null, res.data);\"}],\"id\":\"OBSWLDpbxalZrX3V3eHzM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"kpkdNiUqLQF4GkIeezBJE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fail(err) {\"}],\"id\":\"VSZ5zij6g30ScNXtlSJK_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" callback \\u0026\\u0026 callback(err);\"}],\"id\":\"NhgYfsXZdMKI6Z58vBCdN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"tGP0C3D7sFOD_IG5syG65\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"gSgKb2w_CIsHoZhSSljRa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"7IgNi9hMiT_rSl8gSTe1e\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 파일을 ArrayBuffer로 읽기\"}],\"id\":\"3N25KqV1YhfbP8nUzYLHC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var readFileAsArrayBuffer = function (filePath, callback) {\"}],\"id\":\"TzdW3GpPNGfLGh-Nycj7w\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uni.getFileSystemManager().readFile({\"}],\"id\":\"PkziVewJWWKtYyJuuGlNS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" filePath: filePath,\"}],\"id\":\"lQ7gqJSTwsdNeVYdRK7l5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" success: (res) =\\u003e {\"}],\"id\":\"ULe5YJOKUCEs7I0mGL2Mf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" callback \\u0026\\u0026 callback(null, res.data); // res.data는 ArrayBuffer입니다\"}],\"id\":\"rlJ3dy8QPQGAffb6sgKIX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"4Zcrae-Q_Z9tjhJsrbCdO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fail(err) {\"}],\"id\":\"jRAxf4KE3pDQ5CkrFnLhd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" callback \\u0026\\u0026 callback(err);\"}],\"id\":\"-TcWJyHaU-nu_OX1bs7Mg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"7PcvqT7AIUfVfojRsYBxC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"37jo-C7ZXWZTO2btDlEzL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"hGDJCTfbx_WmpDLjgYVuW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드 요청 시작, PUT Object 인터페이스 사용\"}],\"id\":\"nGEAaWVN2pcUO2TW216po\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 인터페이스 문서:https://www.tencentcloud.com/document/product/436/7749\"}],\"id\":\"kh17CGSitKvv8CMyUecV9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var uploadFile = function (opt, fileData, callback) {\"}],\"id\":\"tXJVy3UvJMveVOiucsOro\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var headers = {\"}],\"id\":\"xomcVyuQ_PL1St_Z16Ayf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Authorization': opt.authorization, // 서명 정보\"}],\"id\":\"TXJ0M8L7VSo-XmMtBktSp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Content-Type': opt.contentType || 'application/octet-stream'\"}],\"id\":\"IXTHft6xi5jDQ3Gs3hpS8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"XJ4zJMZAFL5JOCGkySmOw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 서버 측에서 임시 키를 생성한 경우 x-cos-security-token을 전달해야 합니다.\"}],\"id\":\"8WTdkRvNSmSx5Jq9x1dlj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (opt.securityToken) {\"}],\"id\":\"xTpSDZ8akmO070UljjI69\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" headers['x-cos-security-token'] = opt.securityToken;\"}],\"id\":\"DN9Sp9-x4UPAn5hrwnxRp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"jzw8gEZqJ-mf82u6tZffS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log('업로드 요청 정보:', {\"}],\"id\":\"xDT_98bZ90VvRT6booUL0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: 'https://' + opt.cosHost + '/' + opt.cosKey,\"}],\"id\":\"_PrnwndviR3A8vlSIsQyi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" headers: headers\"}],\"id\":\"oOCUcB0mTbeYOJWsmuA_F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"KQwZJKqeQyA86cDv6N_Tg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"MhFg4XR0MsQaPZ6Z6YkjD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uni.request({\"}],\"id\":\"Tb0VqevMsKPE2bQ_Kx2SO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: 'https://' + opt.cosHost + '/' + opt.cosKey,\"}],\"id\":\"b4_h4mMHKsx39MFzSP3ZM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" method: 'PUT',\"}],\"id\":\"4IObVJl7dnBsr1XBec0aX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" header: headers,\"}],\"id\":\"zK6R4ZTHxPw970nw50UDP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" data: fileData, // ArrayBuffer 형식\"}],\"id\":\"YwJExOqqoZakPeUKIvhK1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" success: (res) =\\u003e {\"}],\"id\":\"s7oSaQvLtOaGn769hoHSj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log('업로드 응답:', res);\"}],\"id\":\"a_Vh89FwlDqbb6buE_jsF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (![200, 204].includes(res.statusCode)) {\"}],\"id\":\"fCJnNaUbUgOHiN7zAIDBM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.error('업로드 실패, 상태 코드:', res.statusCode);\"}],\"id\":\"1zK9WUQjjKtMnY_vAdR1T\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return callback \\u0026\\u0026 callback(res);\"}],\"id\":\"sDrVqYlrKNNnrB7GSgU8p\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"ZMTH8VDjC6H9Lfg1sqn6m\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var fileUrl = 'https://' + opt.cosHost + '/' + camSafeUrlEncode(opt.cosKey).replace(/%2F/g, '/');\"}],\"id\":\"cuL7WLXkP1avoAaF6rQEp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" callback \\u0026\\u0026 callback(null, fileUrl);\"}],\"id\":\"-uEtssNNyLmDHcwyfiu0a\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"acEXflzYnL9-6k00GluJC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fail(err) {\"}],\"id\":\"UgI4Xq7068n8U7FHNSbKB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.error('업로드 요청 실패:', err);\"}],\"id\":\"0YazIy0o2e9EPF_W67L32\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" callback \\u0026\\u0026 callback(err);\"}],\"id\":\"JVR82CynCMmUeHq-VPSbv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"290X-OwnV1eEDQn4xtfQe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"yb4eUlUf7oRfo4w6WpIRe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"EH65pupA5Cwls3oPNKNcp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"UhkDnS3Mm6cGzjtPsBurM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 파일 선택\"}],\"id\":\"su3gBDLBGlZi0wURyj9vw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uni.chooseImage({\"}],\"id\":\"ABsam3hqRDzdLZpY9fsjB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" success: (chooseImageRes) =\\u003e {\"}],\"id\":\"uCtuQ2E_1k_fxFHcI707F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var file = chooseImageRes.tempFiles[0];\"}],\"id\":\"L6L9n7wj_tLvtzYOznksd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (!file) return;\"}],\"id\":\"Nv7y8HBMJvEekgD6dunQe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드할 로컬 파일 경로 가져오기\"}],\"id\":\"pGrpFYF5f01LvvYp57g1V\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var filePath = chooseImageRes.tempFilePaths[0];\"}],\"id\":\"SjlSqDulVTx4KwsNjYqcf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드한 파일의 확장자를 가져와 백엔드에서 임의의 COS 경로 주소를 생성합니다.\"}],\"id\":\"vvj2ZLlBjCP-AEpmCvIlM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var fileName = file.name;\"}],\"id\":\"Ezbv9TEB8ARN10XUeBVWg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var lastIndex = fileName.lastIndexOf('.');\"}],\"id\":\"XzwMB4O2hQSMwQ8zLiPZu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var extName = lastIndex \\u003e -1 ? fileName.slice(lastIndex + 1) : '';\"}],\"id\":\"e_XqfFIP0EeEEXaS6mv03\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"wsPbP_ywrZCEPjRw5jp2B\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 사전 업로드용 도메인, 경로, 서명 가져오기\"}],\"id\":\"oq_I5nZh1_Cd6bDGA1uwG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" getUploadInfo(extName, function (err, info) {\"}],\"id\":\"szKL8cruHJbkNo-94ea2Q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (err) {\"}],\"id\":\"R0R3QPQvOdn6oRd48VIjn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.error('업로드 정보 가져오기 실패:', err);\"}],\"id\":\"04tjF4i1VDC1YTaAU9UaT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return;\"}],\"id\":\"MQCB1pjXEc-K3jMhvqO6_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"AU2Zk-uY58Fk45XRYirep\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 반환된 info 형식이 올바른지 확인\"}],\"id\":\"vzsgNTDEYxJYf4D-QwxZV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(info);\"}],\"id\":\"tKOG88fmZGiW5OoCmXYvn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"uCCmYpXo2BaaHdcvNCTww\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 파일을 ArrayBuffer로 읽기\"}],\"id\":\"ZqOjjgRUHl_sWg-fSE0XJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" readFileAsArrayBuffer(filePath, function (err, fileData) {\"}],\"id\":\"iiCxb-ULaSyiy9qrynLh4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (err) {\"}],\"id\":\"mn-ap66xHSjrfrq0_eldH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.error('파일 읽기 실패:', err);\"}],\"id\":\"_Cru7FjjbTKILVDzDL0Re\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return;\"}],\"id\":\"ULA9dgqz4_YinWHS5V_ZX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"3aEtiR1J0GeHPeMMMZW1a\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"vd1gDwfkt88ASWjefdrbr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 파일 업로드\"}],\"id\":\"yBY8FS_UVMtRK9TdSxqs4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uploadFile(info, fileData, function (err, fileUrl) {\"}],\"id\":\"6FZGSfJnLepat9HS1b0XH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (err) {\"}],\"id\":\"mHKuWyOfZauU_y5ViwNjC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.error('업로드 실패:', err);\"}],\"id\":\"H_YUEkGva-YNEjDiBdrWK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return;\"}],\"id\":\"x-BtztkE0_1Vv9LXfJOTF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"0Jvg-cxYlNAiLiCiyl_za\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" vm.fileUrl = fileUrl;\"}],\"id\":\"vqZGgoDSwNPx0m4skZCr-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log('업로드 성공:', fileUrl);\"}],\"id\":\"ZX8F5RV9HOFeVCBR6n8L7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"j9S6wRx4wFJYaa38Y87Wg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"vSvt39_MNgnxlJP1kn4Iu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"4NL54P4a4saVZqgbawNTu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"4WE1DxeN3uD-C2_3m9N3o\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"Bv3djv8DOStnnedY4TVgi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"vghNP3jlDrE_N45gqnHAz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"WA-JfXhvlWsRUBseju6HC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"FnhKbX24zN5OSaoQxHjbc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/script\\u003e\"}],\"id\":\"G7w75E4za64GEpLqtRjrp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"2PI2CV-ArKmnRN5p7a7-P\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cstyle\\u003e\"}],\"id\":\"W8Znupa1W6DXl2XsUA492\",\"type\":\"code-line\"},{\"children\":[{\"text\":\".content {\"}],\"id\":\"rQij5H44Wp4EomnlNAOhU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" padding: 20px 0;\"}],\"id\":\"AjFrxzFvHVUWpZ80Ny86G\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" display: flex;\"}],\"id\":\"jsWoPF9dLxnpQOiyer1XY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" flex-direction: column;\"}],\"id\":\"F6dp7wn5SMrQ4tXMFvatY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" align-items: center;\"}],\"id\":\"AXcGEfV30rIj30J84Di6X\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" justify-content: center;\"}],\"id\":\"v1QUGKlazVvkxLf4l6mWG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"2BJlxVSeMSCTh6eQup_sn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"aLeBDY5pQrz9gxuIGn_GZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\".image {\"}],\"id\":\"y4dMxzgxhBp6RXXMcFOUW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" margin-top: 20px;\"}],\"id\":\"Z-IauIL2_f8Cu0l_bZ-eB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" margin-left: auto;\"}],\"id\":\"V12NyEm5oh86GcWeNBAu5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" margin-right: auto;\"}],\"id\":\"4Cmv6WmDZgrIhu-zy3Oor\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"sOfVMMdsBFerp5Is6r_vf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/style\\u003e\"}],\"id\":\"9E54HdixhWm5u4Ab-i6yZ\",\"type\":\"code-line\"}],\"executionContext\":{},\"id\":\"RsmhbU70GMN04HjpHQn3h\",\"language\":\"java\",\"type\":\"code-block\"}],\"id\":\"tab_xa1p9F\",\"name\":\"PutObject 업로드\",\"type\":\"tab\"}],\"id\":\"yYwAxv29udNa-hlJFseYd\",\"type\":\"tabs\"},{\"children\":[{\"text\":\"HBuilderX에서 \"},{\"b\":1,\"text\":\"실행 \"},{\"text\":\"\\u003e\"},{\"b\":1,\"text\":\" 브라우저에서 실행 \"},{\"text\":\"\\u003e\"},{\"b\":1,\"text\":\" Chrome\"},{\"text\":\"을 선택하면 브라우저에서 파일을 선택하여 업로드할 수 있습니다.\"}],\"id\":\"PjIVvFQ8T1srAeSrrwKAy\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"실행 효과는 다음 그림과 같습니다.\"}],\"id\":\"w5eX3vcyVJOIyHe6bmscG\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"프로젝트 생성:\\n\"},{\"alt\":\"uni-app 프로젝트 생성\",\"children\":[{\"text\":\"\"}],\"id\":\"2ksuu9Bs43sDGnMqhKJkD\",\"inline\":true,\"naturalSize\":[1114,996],\"size\":[546,488.165170556553],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/3ebde3ccf5e611f0a74f5254001d6acc.jpg\"},{\"text\":\"\"}],\"id\":\"ygVRI_seLdYZjK13I3W4f\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"직접 전송 효과:\\n\"},{\"alt\":\"uni-app 직접 전송 효과\",\"children\":[{\"text\":\"\"}],\"id\":\"Cht0XWRs-hHIievDlfY36\",\"inline\":true,\"naturalSize\":[925,847],\"size\":[564,516.441081081081],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/4ed95916f5e611f0a760525400074c32.jpg\"},{\"text\":\"\"}],\"id\":\"eKDmg9_XeH5UOMmon53rA\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"관련 문서\"}],\"id\":\"4e2Qw612aGPtFY7ngPHIT\",\"nodeId\":\"27901a06-9c34-4607-8817-6232e7b48513\",\"type\":\"h2\"},{\"children\":[{\"children\":[{\"text\":\"업로드 보안 제한\"}],\"id\":\"rArhWOYvNBINKipCqUD6J\",\"props\":{\"anchor\":\"\",\"id\":\"137498679378300928\",\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/73579\"},\"type\":\"ref\"}],\"id\":\"GKPALm1HmawfigIdLbwb4\",\"type\":\"p\"}]"}},"47422":{"categoryId":436,"weight":5,"type":"page","extension":"","pid":32969,"id":47422,"lang":"ko","title":"Oceanus를 COS에 연결","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2022-06-09 23:03:37","recentReleaseTime":"2022-06-09 23:03:37","content":{"title":"Oceanus를 COS에 연결","body":"

Oceanus 개요

Oceanus는 빅 데이터 생태계의 강력한 실시간 분석 도구입니다. 이를 통해 웹사이트 클릭스트림 분석, 이커머스 정밀 타켓팅 추천, IoT 등 다양한 애플리케이션을 단 몇 분 만에 쉽게 구축할 수 있습니다. Oceanus는 Apache Flink를 기반으로 개발되었으며 완전 관리형 클라우드 서비스를 제공하므로 인프라의 Ops에 대해 걱정할 필요가 없습니다. 또한 클라우드의 데이터 소스에 연결하여 완전한 지원 서비스를 받을 수 있습니다.
Oceanus는 SQL 분석 문을 작성하고, 사용자 정의 JAR 패키지를 업로드 및 실행하고, 작업을 관리할 수 있는 편리한 콘솔과 함께 제공됩니다. Flink 기술을 기반으로 PB 수준의 데이터 세트에서 1초 미만의 처리 대기 시간을 달성할 수 있습니다.
이 문서에서는 Oceanus를 COS에 연결하는 방법에 대해 설명합니다. 현재 Oceanus는 전용 클러스터 모드에서 사용할 수 있으며, 여기에서 다양한 작업을 실행하고 자신의 클러스터에서 관련 리소스를 관리할 수 있습니다.

준비 작업

Oceanus 클러스터 생성

Oceanus 콘솔에 로그인하여 Oceanus 클러스터를 생성합니다.

COS 버킷 생성

1. COS 콘솔에 로그인합니다.
2. 왼쪽 사이드바에서 버킷 리스트를 클릭합니다.
3. 버킷 생성을 클릭하여 버킷 생성의 안내에 따라 버킷을 생성합니다.
설명:
COS에 데이터를 쓸 때 Oceanus 작업은 COS와 동일한 리전에서 실행되어야 합니다.

실행 순서

Oceanus 콘솔로 이동하여 SQL 작업을 생성하고 COS와 동일한 리전의 클러스터를 선택합니다.

1. Source 생성

CREATE TABLE `random_source` (
f_sequence INT,
f_random INT,
f_random_str VARCHAR
) WITH (
'connector' = 'datagen',
'rows-per-second'='10', -- 초당 생성된 데이터 행 수
'fields.f_sequence.kind'='random', -- 랜덤 숫자
'fields.f_sequence.min'='1', -- 최소 순차 번호
'fields.f_sequence.max'='10', -- 최대 순차 번호
'fields.f_random.kind'='random', -- 랜덤 숫자
'fields.f_random.min'='1', -- 최소 랜덤 숫자
'fields.f_random.max'='100', -- 최대 랜덤 숫자
'fields.f_random_str.length'='10' -- 랜덤 문자열 길이
);
설명:
여기서는 내장 connector 'datagen'이 선택되었습니다. 실제 비즈니스 요구 사항에 따라 데이터 소스를 선택하십시오.

2. Sink 생성

-- <bucket name> 및 <folder name>을 실제 버킷 및 폴더 이름으로 바꿉니다.
CREATE TABLE `cos_sink` (
f_sequence INT,
f_random INT,
f_random_str VARCHAR
) PARTITIONED BY (f_sequence) WITH (
'connector' = 'filesystem',
'path'='cosn://<bucket name>/<folder name>/', --- 데이터가 기록될 디렉터리 경로
'format' = 'json', --- 기록된 데이터의 형식
'sink.rolling-policy.file-size' = '128MB', --- 최대 파일 크기
'sink.rolling-policy.rollover-interval' = '30 min', --- 최대 파일 쓰기 시간
'sink.partition-commit.delay' = '1 s', --- 파티션 커밋 지연
'sink.partition-commit.policy.kind' = 'success-file' --- 파티션 커밋 방법
);
설명:
Sink의 WITH 매개변수에 대한 자세한 내용은 Filesystem (HDFS/COS)을 참고하십시오.

3. 비즈니스 로직 구성

INSERT INTO `cos_sink`
SELECT * FROM `random_source`;
주의:
이는 예시용이며 실제 비즈니스 목적이 없습니다.

4. 작업 매개변수 설정

내장 Connectorflink-connector-cos를 선택하고 고급 매개변수에서 COS URL을 다음과 같이 구성합니다.
fs.AbstractFileSystem.cosn.impl: org.apache.hadoop.fs.CosN
fs.cosn.impl: org.apache.hadoop.fs.CosFileSystem
fs.cosn.credentials.provider: org.apache.flink.fs.cos.OceanusCOSCredentialsProvider
fs.cosn.bucket.region: <COS 리전>
fs.cosn.userinfo.appid: <COS 사용자 appid>
작업은 다음과 같이 구성됩니다.
<COS region>을 ap-guangzhou와 같은 실제 COS 리전으로 바꿉니다.
<COS user appid>를 실제 APPID로 바꿉니다. 이는 계정 센터에서 볼 수 있습니다.
설명:
작업 매개변수 설정에 대한 자세한 내용은 Filesystem (HDFS/COS)을 참고하십시오.

5. 작업 시작

저장 > 구문 확인 > 초안 릴리스를 클릭하고 SQL 작업이 시작될 때까지 기다렸다가 해당 COS 디렉터리로 이동하여 작성된 데이터를 확인합니다.
","recentReleaseTime":"2024-06-24 16:53:18","slate":"[{\"children\":[{\"text\":\"Oceanus 개요\"}],\"nodeId\":\"oceanus-.EA.B0.9C.EC.9A.94\",\"type\":\"h2\"},{\"children\":[{\"text\":\"Oceanus는 빅 데이터 생태계의 강력한 실시간 분석 도구입니다. 이를 통해 웹사이트 클릭스트림 분석, 이커머스 정밀 타켓팅 추천, IoT 등 다양한 애플리케이션을 단 몇 분 만에 쉽게 구축할 수 있습니다. Oceanus는 Apache Flink를 기반으로 개발되었으며 완전 관리형 클라우드 서비스를 제공하므로 인프라의 Ops에 대해 걱정할 필요가 없습니다. 또한 클라우드의 데이터 소스에 연결하여 완전한 지원 서비스를 받을 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"Oceanus는 SQL 분석 문을 작성하고, 사용자 정의 JAR 패키지를 업로드 및 실행하고, 작업을 관리할 수 있는 편리한 콘솔과 함께 제공됩니다. Flink 기술을 기반으로 PB 수준의 데이터 세트에서 1초 미만의 처리 대기 시간을 달성할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"이 문서에서는 Oceanus를 COS에 연결하는 방법에 대해 설명합니다. 현재 Oceanus는 전용 클러스터 모드에서 사용할 수 있으며, 여기에서 다양한 작업을 실행하고 자신의 클러스터에서 관련 리소스를 관리할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"준비 작업\"}],\"nodeId\":\".EC.A4.80.EB.B9.84-.EC.9E.91.EC.97.85\",\"type\":\"h2\"},{\"children\":[{\"text\":\"Oceanus 클러스터 생성\"}],\"nodeId\":\"oceanus-.ED.81.B4.EB.9F.AC.EC.8A.A4.ED.84.B0-.EC.83.9D.EC.84.B1\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"Oceanus 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/oceanus/workspace\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/oceanus/workspace\"},\"type\":\"ref\"},{\"text\":\"에 로그인하여 Oceanus 클러스터를 생성합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"COS 버킷 생성\"}],\"nodeId\":\"cos-.EB.B2.84.ED.82.B7-.EC.83.9D.EC.84.B1\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\"},{\"text\":\"에 로그인합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"왼쪽 사이드바에서 \"},{\"b\":1,\"text\":\"버킷 리스트\"},{\"text\":\"를 클릭합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"버킷 생성\"},{\"text\":\"을 클릭하여 \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13309\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13309\"},\"type\":\"ref\"},{\"text\":\"의 안내에 따라 버킷을 생성합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" COS에 데이터를 쓸 때 Oceanus 작업은 COS와 동일한 리전에서 실행되어야 합니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"실행 순서\"}],\"nodeId\":\".EC.8B.A4.ED.96.89-.EC.88.9C.EC.84.9C\",\"type\":\"h2\"},{\"children\":[{\"children\":[{\"text\":\"Oceanus 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/oceanus/overview\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/oceanus/overview\"},\"type\":\"ref\"},{\"text\":\"로 이동하여 SQL 작업을 생성하고 COS와 동일한 리전의 클러스터를 선택합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"1. Source 생성\"}],\"nodeId\":\"1.-source-.EC.83.9D.EC.84.B1\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"CREATE TABLE `random_source` ( \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" f_sequence INT, \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" f_random INT, \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" f_random_str VARCHAR \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" ) WITH ( \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'connector' = 'datagen', \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'rows-per-second'='10', -- 초당 생성된 데이터 행 수\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'fields.f_sequence.kind'='random', -- 랜덤 숫자\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'fields.f_sequence.min'='1', -- 최소 순차 번호\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'fields.f_sequence.max'='10', -- 최대 순차 번호\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'fields.f_random.kind'='random', -- 랜덤 숫자\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'fields.f_random.min'='1', -- 최소 랜덤 숫자\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'fields.f_random.max'='100', -- 최대 랜덤 숫자\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'fields.f_random_str.length'='10' -- 랜덤 문자열 길이\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\");\"}],\"type\":\"code-line\"}],\"language\":\"sql\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 여기서는 내장 connector 'datagen'이 선택되었습니다. 실제 비즈니스 요구 사항에 따라 데이터 소스를 선택하십시오.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"2. Sink 생성\"}],\"nodeId\":\"2.-sink-.EC.83.9D.EC.84.B1\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"-- \\u003cbucket name\\u003e 및 \\u003cfolder name\\u003e을 실제 버킷 및 폴더 이름으로 바꿉니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"CREATE TABLE `cos_sink` (\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" f_sequence INT, \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" f_random INT, \"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" f_random_str VARCHAR\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\") PARTITIONED BY (f_sequence) WITH (\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'connector' = 'filesystem',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'path'='cosn://\\u003cbucket name\\u003e/\\u003cfolder name\\u003e/', --- 데이터가 기록될 디렉터리 경로\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'format' = 'json', --- 기록된 데이터의 형식\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'sink.rolling-policy.file-size' = '128MB', --- 최대 파일 크기\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'sink.rolling-policy.rollover-interval' = '30 min', --- 최대 파일 쓰기 시간\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'sink.partition-commit.delay' = '1 s', --- 파티션 커밋 지연\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'sink.partition-commit.policy.kind' = 'success-file' --- 파티션 커밋 방법\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\");\"}],\"type\":\"code-line\"}],\"language\":\"sql\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" Sink의 WITH 매개변수에 대한 자세한 내용은 Filesystem (HDFS/COS)을 참고하십시오.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"3. 비즈니스 로직 구성\"}],\"nodeId\":\"3.-.EB.B9.84.EC.A6.88.EB.8B.88.EC.8A.A4-.EB.A1.9C.EC.A7.81-.EA.B5.AC.EC.84.B1\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"INSERT INTO `cos_sink`\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"SELECT * FROM `random_source`;\"}],\"type\":\"code-line\"}],\"language\":\"sql\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 이는 예시용이며 실제 비즈니스 목적이 없습니다.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"type\":\"hint\"},{\"children\":[{\"text\":\"4. 작업 매개변수 설정\"}],\"nodeId\":\"4.-.EC.9E.91.EC.97.85-.EB.A7.A4.EA.B0.9C.EB.B3.80.EC.88.98-.EC.84.A4.EC.A0.95\",\"type\":\"h4\"},{\"children\":[{\"b\":1,\"text\":\"내장 Connector\"},{\"text\":\"로 \"},{\"code\":1,\"text\":\"flink-connector-cos\"},{\"text\":\"를 선택하고 \"},{\"b\":1,\"text\":\"고급 매개변수\"},{\"text\":\"에서 COS URL을 다음과 같이 구성합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"fs.AbstractFileSystem.cosn.impl: org.apache.hadoop.fs.CosN\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"fs.cosn.impl: org.apache.hadoop.fs.CosFileSystem\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"fs.cosn.credentials.provider: org.apache.flink.fs.cos.OceanusCOSCredentialsProvider\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"fs.cosn.bucket.region: \\u003cCOS 리전\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"fs.cosn.userinfo.appid: \\u003cCOS 사용자 appid\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"shell\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"작업은 다음과 같이 구성됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"code\":1,\"text\":\"\\u003cCOS region\\u003e\"},{\"text\":\"을 ap-guangzhou와 같은 실제 COS 리전으로 바꿉니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"code\":1,\"text\":\"\\u003cCOS user appid\\u003e\"},{\"text\":\"를 실제 APPID로 바꿉니다. 이는 \"},{\"children\":[{\"text\":\"계정 센터\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/developer\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/developer\"},\"type\":\"ref\"},{\"text\":\"에서 볼 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 작업 매개변수 설정에 대한 자세한 내용은 Filesystem (HDFS/COS)을 참고하십시오.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"5. 작업 시작\"}],\"nodeId\":\"5.-.EC.9E.91.EC.97.85-.EC.8B.9C.EC.9E.91\",\"type\":\"h4\"},{\"children\":[{\"b\":1,\"text\":\"저장 \\u003e 구문 확인 \\u003e 초안 릴리스\"},{\"text\":\"를 클릭하고 SQL 작업이 시작될 때까지 기다렸다가 해당 COS 디렉터리로 이동하여 작성된 데이터를 확인합니다.\"}],\"type\":\"p\"}]"}},"49774":{"categoryId":436,"weight":16,"type":"page","extension":"","pid":34079,"id":49774,"lang":"ko","title":"PicGo+Typora+COS를 사용하여 이미지 호스팅 서비스 구축","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2022-09-14 22:17:22","recentReleaseTime":"2022-09-14 22:17:22","content":{"title":"PicGo+Typora+COS를 사용하여 이미지 호스팅 서비스 구축","body":"

소개

이미지 호스팅 서비스는 이미지 저장, 처리, 배포 등 다양한 기능을 제공하여 전 세계의 수많은 블로그 사이트와 커뮤니티 포럼에 백엔드 이미지 서비스를 제공합니다. 개발자들은 **Cloud Object Storage(COS)**를 사용하여 이미지 호스팅 서비스를 설정할 수 있습니다. COS는 Tencent Cloud가 출시한 분산 스토리지 서비스로 대용량 파일을 저장하고 더 높은 성능과 안정성을 보장합니다.
이미지 호스팅 시나리오에서 COS의 장점은 다음과 같습니다.
저렴한 비용: 스토리지의 단가가 저렴하고 사용한 만큼만 비용을 지불하면 됩니다.
무제한 속도: 업로드 및 다운로드 속도가 제한되지 않으므로 사용자는 더 이상 느린 loading을 기다릴 필요가 없이 더 나은 액세스 경험을 즐길 수 있습니다.
고가용성: COS는 저장된 데이터가 최대 99.9999999999%의 내구성을 보장하는 고가용성을 위한 SLA를 제공합니다.
무제한 용량: COS는 주문형 용량 사용을 위해 많은 수의 파일을 분산 방식으로 저장합니다.

실행 시나리오

시나리오1: COS로 이미지 호스팅 서비스를 설정하기 위해 이미지 추가

이 시나리오에서는 다음 도구가 사용됩니다.
PicGo: 여러 클라우드 스토리지 구성을 지원하고 이미지 URL을 빠르게 생성하는 도구입니다.
Typora: 여러 출력 형식을 지원하고 로컬 이미지를 이미지 호스팅 서비스에 빠르게 업로드할 수 있는 경량 Markdown 파일 편집기입니다.

작업 단계

1. PicGo를 설치하고 관련 COS 매개변수를 설정합니다.
설명:
이 시나리오에서는 PicGo 2.3.1이 사용됩니다. 구성 프로세스는 버전에 따라 다를 수 있습니다.
PicGo 웹사이트에서 PicGo를 다운로드하여 설치한 후 이미지 호스팅 서비스 설정에서 Tencent Cloud COS를 찾아 다음 매개변수를 구성합니다.
COS 버전: COS v5를 선택합니다.
SecretId 설정: 프로젝트에 사용되는 개발자 소유의 비밀 ID로, API 키 관리 페이지에서 생성 및 획득할 수 있습니다.
SecretKey 설정: 프로젝트에 사용되는 개발자 소유의 비밀 키이며 API 키 관리 페이지에서 얻을 수 있습니다.
Bucket 설정: 버킷. COS에서 데이터 저장에 사용되는 컨테이너이며, 버킷과 관련된 자세한 내용은 버킷 개요 문서를 참고하십시오.
AppId 설정: COS 액세스에 대한 고유한 사용자 레벨 리소스 식별자이며, API 키 관리 페이지에서 얻을 수 있습니다.
스토리지 리전 설정: 버킷 소속 리전 정보, ap-beijing, ap-hongkong 및 eu-frankfurt와 같은 열거 값은 리전 및 액세스 도메인을 참고하십시오.
스토리지 경로 설정: COS 버킷에서 이미지가 저장되는 경로입니다.
사용자 정의 도메인 이름 설정: 이 매개변수는 선택사항입니다. 위에서 지정한 스토리지 공간에 대해 사용자 지정 원본 도메인 이름을 구성한 경우 여기에 입력할 수 있습니다. 자세한 내용은 사용자 정의 원본 서버 도메인 활성화하기를 참고하십시오.
URL 접미사 설정: URL 접미사에 COS 데이터 처리 매개변수를 추가하여 이미지 압축, 크롭핑, 형식 변환 및 기타 작업을 구현합니다. 자세한 내용은 Image Processing을 참고하십시오.
2. typora를 구성합니다(선택 사항).
설명:
편집 요구 사항에 Markdown이 포함되지 않은 경우 이 단계를 건너뛰고 이전 단계에서 설치된 PicGo 도구를 이미지 호스팅 도구로 사용할 수 있습니다.
다음과 같이 구성합니다.
1. typora의 기본 설정 이미지에서 다음을 구성합니다.
이미지 삽입 시이미지 업로드를 선택합니다
이미지 업로드 설정에서 **PicGo(app)**를 선택하고 방금 설치한 PicGo.exe의 위치를 설정합니다.
2. 설정을 적용하려면 typora를 다시 시작하십시오.
3. typora 편집기 영역에 들어가 이미지를 직접 드래그 앤 드롭하거나 붙여넣어 업로드하면 자동으로 COS 파일 URL로 대체됩니다(붙여넣기 후 COS URL로 자동 교체되지 않는다면 PicGo에서 server가 활성화되어 있는지 확인하십시오).

시나리오2: 이미지 호스팅 리포지토리의 이미지를 COS로 빠르게 마이그레이션

이미지 호스팅 서비스를 예로 들면, 로컬 이미지 호스팅 폴더를 찾거나 인터넷에서 전체 폴더를 다운로드한 후 폴더의 모든 이미지를 COS 버킷으로 전송할 수 있습니다. 그런 다음 URL 도메인 이름을 균일하게 교체하여 웹 사이트를 복원합니다.

작업 단계

1단계: 원본 이미지 호스팅 서비스에서 이미지 다운로드

원본 이미지 호스팅 사이트에 로그인하여 이전에 업로드한 이미지 폴더를 다운로드합니다.

2단계: COS 버킷 생성 및 링크 도용 방지 설정

1. Tencent Cloud 계정에 가입하고 버킷 생성의 지침에 따라 공개 읽기/비공개 쓰기 액세스 권한이 있는 버킷을 생성합니다. 버킷 생성을 참고하십시오.
2. 버킷이 생성된 후 이미지가 핫링크되지 않도록 링크 도용 방지 설정의 지침에 따라 버킷에서 링크 도용 방지를 활성화합니다.

3단계: 버킷에 폴더 업로드

방금 생성한 COS 버킷에서 폴더 업로드를 클릭하여 준비된 이미지 폴더를 버킷에 업로드합니다.
설명:
이미지 수가 많으면 COSBrowser를 사용하여 이미지를 빠르게 업로드할 수도 있습니다.

4단계: 도메인 이름을 전역적으로 교체

COS 콘솔의 버킷 개요 페이지에서 버킷의 기본 도메인 이름을 복사합니다(사용자 지정 CDN 가속 도메인 이름을 연결할 수도 있음). 그런 다음 공통 코드 편집기를 사용하여 유효하지 않은 URL 접두사를 검색하고 COS 버킷의 기본 도메인 이름으로 전역적으로 바꿉니다.
설명:
기본 도메인 이름에 대한 자세한 내용은 리전 및 액세스 도메인을 참고하십시오.
vscode를 사용한 검색 및 교체 예시:\n
\"\"

sublime text를 사용한 검색 및 교체 예시:\n
\"\"

","recentReleaseTime":"2024-06-24 16:53:18","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"이미지 호스팅 서비스는 이미지 저장, 처리, 배포 등 다양한 기능을 제공하여 전 세계의 수많은 블로그 사이트와 커뮤니티 포럼에 백엔드 이미지 서비스를 제공합니다. 개발자들은 **Cloud Object Storage(COS)**를 사용하여 이미지 호스팅 서비스를 설정할 수 있습니다. COS는 Tencent Cloud가 출시한 분산 스토리지 서비스로 대용량 파일을 저장하고 더 높은 성능과 안정성을 보장합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"이미지 호스팅 시나리오에서 COS의 장점은 다음과 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"b\":1,\"text\":\"저렴한 비용:\"},{\"text\":\" 스토리지의 단가가 저렴하고 사용한 만큼만 비용을 지불하면 됩니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"무제한 속도:\"},{\"text\":\" 업로드 및 다운로드 속도가 제한되지 않으므로 사용자는 더 이상 느린 loading을 기다릴 필요가 없이 더 나은 액세스 경험을 즐길 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"고가용성:\"},{\"text\":\" COS는 저장된 데이터가 최대 99.9999999999%의 내구성을 보장하는 고가용성을 위한 SLA를 제공합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"무제한 용량:\"},{\"text\":\" COS는 주문형 용량 사용을 위해 많은 수의 파일을 분산 방식으로 저장합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"실행 시나리오\"}],\"nodeId\":\".EC.8B.A4.ED.96.89-.EC.8B.9C.EB.82.98.EB.A6.AC.EC.98.A4\",\"type\":\"h2\"},{\"children\":[{\"text\":\"시나리오1: COS로 이미지 호스팅 서비스를 설정하기 위해 이미지 추가\"}],\"nodeId\":\".EC.8B.9C.EB.82.98.EB.A6.AC.EC.98.A41.3A-cos.EB.A1.9C-.EC.9D.B4.EB.AF.B8.EC.A7.80-.ED.98.B8.EC.8A.A4.ED.8C.85-.EC.84.9C.EB.B9.84.EC.8A.A4.EB.A5.BC-.EC.84.A4.EC.A0.95.ED.95.98.EA.B8.B0-.EC.9C.84.ED.95.B4-.EC.9D.B4.EB.AF.B8.EC.A7.80-.EC.B6.94.EA.B0.80\",\"type\":\"h3\"},{\"children\":[{\"text\":\"이 시나리오에서는 다음 도구가 사용됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"PicGo: 여러 클라우드 스토리지 구성을 지원하고 이미지 URL을 빠르게 생성하는 도구입니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"Typora: 여러 출력 형식을 지원하고 로컬 이미지를 이미지 호스팅 서비스에 빠르게 업로드할 수 있는 경량 Markdown 파일 편집기입니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"작업 단계\"}],\"nodeId\":\".EC.9E.91.EC.97.85-.EB.8B.A8.EA.B3.84\",\"type\":\"h3\"},{\"children\":[{\"text\":\"PicGo를 설치하고 관련 COS 매개변수를 설정합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"이 시나리오에서는 PicGo 2.3.1이 사용됩니다. 구성 프로세스는 버전에 따라 다를 수 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"children\":[{\"text\":\"PicGo 웹사이트\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://molunerfinn.com/PicGo/\",\"props\":{\"type\":\"link\",\"url\":\"https://molunerfinn.com/PicGo/\"},\"type\":\"ref\"},{\"text\":\"에서 PicGo를 다운로드하여 설치한 후 이미지 호스팅 서비스 설정에서 \"},{\"b\":1,\"text\":\"Tencent Cloud COS\"},{\"text\":\"를 찾아 다음 매개변수를 구성합니다.\"}],\"indent\":1,\"type\":\"p\"},{\"children\":[{\"text\":\"COS 버전: COS v5를 선택합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"SecretId 설정: 프로젝트에 사용되는 개발자 소유의 비밀 ID로, \"},{\"children\":[{\"text\":\"API 키 관리\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/capi\"},\"type\":\"ref\"},{\"text\":\" 페이지에서 생성 및 획득할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"SecretKey 설정: 프로젝트에 사용되는 개발자 소유의 비밀 키이며 \"},{\"children\":[{\"text\":\"API 키 관리\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/capi\"},\"type\":\"ref\"},{\"text\":\" 페이지에서 얻을 수 있습니다. \"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"Bucket 설정: 버킷. COS에서 데이터 저장에 사용되는 컨테이너이며, 버킷과 관련된 자세한 내용은 \"},{\"children\":[{\"text\":\"버킷 개요\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13312\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13312\"},\"type\":\"ref\"},{\"text\":\" 문서를 참고하십시오.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"AppId 설정: COS 액세스에 대한 고유한 사용자 레벨 리소스 식별자이며, \"},{\"children\":[{\"text\":\"API 키 관리\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/capi\"},\"type\":\"ref\"},{\"text\":\" 페이지에서 얻을 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"스토리지 리전 설정: 버킷 소속 리전 정보, ap-beijing, ap-hongkong 및 eu-frankfurt와 같은 열거 값은 \"},{\"children\":[{\"text\":\"리전 및 액세스 도메인\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/6224\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/6224\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"스토리지 경로 설정: COS 버킷에서 이미지가 저장되는 경로입니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"사용자 정의 도메인 이름 설정: 이 매개변수는 선택사항입니다. 위에서 지정한 스토리지 공간에 대해 사용자 지정 원본 도메인 이름을 구성한 경우 여기에 입력할 수 있습니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"사용자 정의 원본 서버 도메인 활성화하기\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/31507\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/31507\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"URL 접미사 설정: URL 접미사에 COS 데이터 처리 매개변수를 추가하여 이미지 압축, 크롭핑, 형식 변환 및 기타 작업을 구현합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"Image Processing\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/40118\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/40118\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"typora를 구성합니다(선택 사항).\"}],\"indent\":0,\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"편집 요구 사항에 Markdown이 포함되지 않은 경우 이 단계를 건너뛰고 이전 단계에서 설치된 PicGo 도구를 이미지 호스팅 도구로 사용할 수 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"다음과 같이 구성합니다.\"}],\"indent\":1,\"type\":\"p\"},{\"children\":[{\"text\":\"typora의 기본 설정 \"},{\"b\":1,\"text\":\"이미지\"},{\"text\":\"에서 다음을 구성합니다.\"}],\"indent\":0,\"start\":true,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"이미지 삽입 시\"},{\"b\":1,\"text\":\"이미지 업로드\"},{\"text\":\"를 선택합니다\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"이미지 업로드 설정\"},{\"text\":\"에서 **PicGo(app)**를 선택하고 방금 설치한 PicGo.exe의 위치를 설정합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"설정을 적용하려면 typora를 다시 시작하십시오.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"typora 편집기 영역에 들어가 이미지를 직접 드래그 앤 드롭하거나 붙여넣어 업로드하면 자동으로 COS 파일 URL로 대체됩니다(붙여넣기 후 COS URL로 자동 교체되지 않는다면 PicGo에서 server가 활성화되어 있는지 확인하십시오).\"}],\"indent\":0,\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"시나리오2: 이미지 호스팅 리포지토리의 이미지를 COS로 빠르게 마이그레이션\"}],\"nodeId\":\".EC.8B.9C.EB.82.98.EB.A6.AC.EC.98.A42.3A-.EC.9D.B4.EB.AF.B8.EC.A7.80-.ED.98.B8.EC.8A.A4.ED.8C.85-.EB.A6.AC.ED.8F.AC.EC.A7.80.ED.86.A0.EB.A6.AC.EC.9D.98-.EC.9D.B4.EB.AF.B8.EC.A7.80.EB.A5.BC-cos.EB.A1.9C-.EB.B9.A0.EB.A5.B4.EA.B2.8C-.EB.A7.88.EC.9D.B4.EA.B7.B8.EB.A0.88.EC.9D.B4.EC.85.98\",\"type\":\"h3\"},{\"children\":[{\"text\":\"이미지 호스팅 서비스를 예로 들면, 로컬 이미지 호스팅 폴더를 찾거나 인터넷에서 전체 폴더를 다운로드한 후 폴더의 모든 이미지를 COS 버킷으로 전송할 수 있습니다. 그런 다음 URL 도메인 이름을 균일하게 교체하여 웹 사이트를 복원합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"작업 단계\"}],\"nodeId\":\".EC.9E.91.EC.97.85-.EB.8B.A8.EA.B3.842\",\"type\":\"h3\"},{\"children\":[{\"text\":\"1단계: 원본 이미지 호스팅 서비스에서 이미지 다운로드\"}],\"nodeId\":\"1.EB.8B.A8.EA.B3.84.3A-.EC.9B.90.EB.B3.B8-.EC.9D.B4.EB.AF.B8.EC.A7.80-.ED.98.B8.EC.8A.A4.ED.8C.85-.EC.84.9C.EB.B9.84.EC.8A.A4.EC.97.90.EC.84.9C-.EC.9D.B4.EB.AF.B8.EC.A7.80-.EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"원본 이미지 호스팅 사이트에 로그인하여 이전에 업로드한 이미지 폴더를 다운로드합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"2단계: COS 버킷 생성 및 링크 도용 방지 설정\"}],\"nodeId\":\"2.EB.8B.A8.EA.B3.84.3A-cos-.EB.B2.84.ED.82.B7-.EC.83.9D.EC.84.B1-.EB.B0.8F-.EB.A7.81.ED.81.AC-.EB.8F.84.EC.9A.A9-.EB.B0.A9.EC.A7.80-.EC.84.A4.EC.A0.95\",\"type\":\"h4\"},{\"children\":[{\"text\":\"Tencent Cloud 계정에 가입하고 버킷 생성의 지침에 따라 \"},{\"b\":1,\"text\":\"공개 읽기/비공개 쓰기\"},{\"text\":\" 액세스 권한이 있는 버킷을 생성합니다. \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13309\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13309\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"버킷이 생성된 후 이미지가 핫링크되지 않도록 \"},{\"children\":[{\"text\":\"링크 도용 방지 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13319\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13319\"},\"type\":\"ref\"},{\"text\":\"의 지침에 따라 버킷에서 링크 도용 방지를 활성화합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"3단계: 버킷에 폴더 업로드\"}],\"nodeId\":\"3.EB.8B.A8.EA.B3.84.3A-.EB.B2.84.ED.82.B7.EC.97.90-.ED.8F.B4.EB.8D.94-.EC.97.85.EB.A1.9C.EB.93.9C\",\"type\":\"h4\"},{\"children\":[{\"text\":\"방금 생성한 COS 버킷에서 폴더 업로드를 클릭하여 준비된 이미지 폴더를 버킷에 업로드합니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"이미지 수가 많으면 \"},{\"children\":[{\"text\":\"COSBrowser\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/11366\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/11366\"},\"type\":\"ref\"},{\"text\":\"를 사용하여 이미지를 빠르게 업로드할 수도 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"4단계: 도메인 이름을 전역적으로 교체\"}],\"nodeId\":\"4.EB.8B.A8.EA.B3.84.3A-.EB.8F.84.EB.A9.94.EC.9D.B8-.EC.9D.B4.EB.A6.84.EC.9D.84-.EC.A0.84.EC.97.AD.EC.A0.81.EC.9C.BC.EB.A1.9C-.EA.B5.90.EC.B2.B4\",\"type\":\"h4\"},{\"children\":[{\"text\":\"COS 콘솔의 버킷 개요 페이지에서 버킷의 기본 도메인 이름을 복사합니다(사용자 지정 CDN 가속 도메인 이름을 연결할 수도 있음). 그런 다음 공통 코드 편집기를 사용하여 유효하지 않은 URL 접두사를 검색하고 COS 버킷의 기본 도메인 이름으로 전역적으로 바꿉니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"기본 도메인 이름에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"리전 및 액세스 도메인\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/6224\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/6224\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"vscode를 사용한 검색 및 교체 예시:\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://qcloudimg.tencent-cloud.cn/raw/6d0707a821a6c7f0a978f113afdf05b9.png\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"sublime text를 사용한 검색 및 교체 예시:\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://qcloudimg.tencent-cloud.cn/raw/97855e83ce68cd23254c98f4849e2d41.png\"}],\"start\":false,\"type\":\"uli\"}]"}},"49775":{"categoryId":436,"weight":15,"type":"page","extension":"","pid":34079,"id":49775,"lang":"ko","title":"CloudBerry Explorer를 통한 COS 리소스 관리","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2022-08-31 23:02:30","recentReleaseTime":"2022-08-31 23:02:30","content":{"title":"CloudBerry Explorer를 통한 COS 리소스 관리","body":"

소개

CloudBerry Explorer는 COS(Cloud Object Storage) 관리에 사용할 수 있는 클라이언트 툴입니다. COS는 CloudBerry Explorer를 통해 Windows 등 운영 체제에 마운트할 수 있어 사용자의 COS 파일 액세스, 이동 및 관리가 편리합니다.

지원 시스템

Windows, macOS 시스템을 지원합니다.

다운로드 주소

CloudBerry 공식 다운로드로 이동하십시오.

설치 및 구성

주의:
하기 구성 단계는 CloudBerry Explorer Windows v6.3을 예로 들어 설명합니다. 다른 버전의 구성 과정과 약간의 차이가 있을 수 있습니다.
1. 설치 패키지를 더블클릭하고 프롬프트에 따라 설치를 완료합니다.
2. 툴을 열고 S3 Compatible을 선택하고 더블클릭합니다.
3. 팝업 창에서 다음 정보를 설정하고 Test Connection을 클릭하면 연결이 성공적으로 완료됩니다.\n
\"\"

\n다음은 설정 항목에 관한 설명입니다.
Display name: 사용자 정의 사용자 이름을 입력합니다.
Service point: 형식은 cos.<Region>.myqcloud.com이며, 예를 들어 청두 리전의 버킷에 액세스하려면 cos.ap-chengdu.myqcloud.com을 입력하십시오. 리전 약칭(region)은 리전 및 액세스 도메인을 참고하십시오.
Access key: 액세스 키 정보 SecretId를 입력합니다. Tencent Cloud API 키로 이동하여 생성 및 획득할 수 있습니다.
Secret key: 액세스 키 정보 Secretkey를 입력합니다. Tencent Cloud API 키로 이동하여 생성 및 획득할 수 있습니다.
4. 계정 정보 추가 완료 후 Source에서 이전에 설정한 사용자 이름을 선택하면 해당 사용자 이름 아래에 있는 버킷 리스트를 볼 수 있습니다. 이는 구성이 완료되었음을 의미합니다.\n
\"\"



COS 파일 관리

버킷 리스트 조회

Source에서 이전에 설정한 사용자 이름을 선택하여 사용자 이름 아래의 버킷 리스트를 볼 수 있습니다.
주의:
Service point에서 구성한 리전에 해당하는 버킷만 볼 수 있습니다. 다른 리전의 버킷을 보려면 File > Edit Accounts를 클릭하고 사용자 이름을 선택한 다음 Service point 매개변수를 다른 리전으로 수정합니다.

버킷 생성

이미지의 아이콘을 클릭하고 팝업 창에 전체 버킷 이름을 입력합니다(예: examplebucket-1250000000). 입력이 정확하면 OK를 클릭하여 생성을 완료합니다.\n버킷의 이름 생성 규칙은 버킷 이름 생성 규칙을 참고하십시오.\n
\"\"



버킷 삭제

버킷 리스트에서 삭제할 버킷을 선택하고 Delete를 우클릭하여 삭제합니다.

객체 업로드

버킷 리스트에서 업로드할 객체의 버킷 또는 경로를 선택한 후 로컬 컴퓨터에 업로드할 객체를 선택하고 왼쪽 창으로 드래그하면 업로드 작업이 완료됩니다.\n
\"\"



객체 다운로드

왼쪽 창에서 다운로드할 객체를 선택한 후 오른쪽에 있는 로컬 컴퓨터의 폴더로 객체를 드래그하여 다운로드 작업을 완료합니다.\n
\"\"



객체 복사

툴의 오른쪽 창에서 복사된 객체 타깃 경로를 선택한 후 왼쪽 창에서 복사할 객체를 선택하고 Copy를 우클릭하여 팝업 정보를 확인하면 객체 복사 작업이 완료됩니다.\n
\"\"



객체 이름 변경

버킷에서 이름을 변경할 객체를 찾아 Rename을 우클릭하고 새 이름을 입력합니다.

객체 삭제

버킷에서 삭제하려는 객체를 찾아 Delete를 우클릭하여 객체를 삭제합니다.

객체 이동

툴 오른쪽 창에서 이동된 객체 타깃 경로를 선택한 후 왼쪽 창에서 이동할 객체를 선택하고 Move를 우클릭하여 팝업 창 정보를 확인하면 객체 이동 작업이 완료됩니다.\n
\"\"



기타 기능

상기 기능 외에도 CloudBerry Explorer는 객체 ACL 설정, 객체 메타데이터 조회, 사용자 정의 Headers, 객체 URL 가져오기 등과 같은 다른 기능도 지원합니다. 사용자는 실제 필요에 따라 작업할 수 있습니다.
","recentReleaseTime":"2025-04-18 17:26:02","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"ezyN8OpgJP4vsjIvrkAzz\"},{\"children\":[{\"text\":\"CloudBerry Explorer는 COS(Cloud Object Storage) 관리에 사용할 수 있는 클라이언트 툴입니다. COS는 CloudBerry Explorer를 통해 Windows 등 운영 체제에 마운트할 수 있어 사용자의 COS 파일 액세스, 이동 및 관리가 편리합니다.\"}],\"type\":\"p\",\"id\":\"5HSPaCltP7BvjNDSPCF46\"},{\"children\":[{\"text\":\"지원 시스템\"}],\"nodeId\":\".EC.A7.80.EC.9B.90-.EC.8B.9C.EC.8A.A4.ED.85.9C\",\"type\":\"h2\",\"id\":\"lxssgQM6QTY9A-cRz_3e1\"},{\"children\":[{\"text\":\"Windows, macOS 시스템을 지원합니다.\"}],\"type\":\"p\",\"id\":\"H_i9OG53nhqeg7sThQi5L\"},{\"children\":[{\"text\":\"다운로드 주소\"}],\"nodeId\":\".EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C-.EC.A3.BC.EC.86.8C\",\"type\":\"h2\",\"id\":\"H0kQ4oVWVollQECzWiHIo\"},{\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.msp360.com/explorer/\"},\"children\":[{\"text\":\"CloudBerry 공식 다운로드\"}],\"id\":\"7IE0oO1YTPGakxgiSqSeI\"},{\"text\":\"로 이동하십시오.\"}],\"type\":\"p\",\"id\":\"2RmtClMqWkc-PCuYiqkDO\"},{\"children\":[{\"text\":\"설치 및 구성\"}],\"nodeId\":\".EC.84.A4.EC.B9.98-.EB.B0.8F-.EA.B5.AC.EC.84.B1\",\"type\":\"h2\",\"id\":\"dE1OhAERDLZKR9wnU78Cc\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"UubtyZMitJJ_NY5yWEqrh\"},{\"children\":[{\"text\":\" 하기 구성 단계는 CloudBerry Explorer Windows v6.3을 예로 들어 설명합니다. 다른 버전의 구성 과정과 약간의 차이가 있을 수 있습니다.\"}],\"type\":\"p\",\"id\":\"qnmPZwhj7JHkr2nt_gZfo\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"ZU0lJZYQ9p_Wzl7WXYcrI\"},{\"children\":[{\"text\":\"설치 패키지를 더블클릭하고 프롬프트에 따라 설치를 완료합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"yHuJhtS48v9jLxzEb2Jdc\"},{\"children\":[{\"text\":\"툴을 열고 S3 Compatible을 선택하고 더블클릭합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"Qk7vRHjTm_JNYFXVA0HLT\"},{\"children\":[{\"text\":\"팝업 창에서 다음 정보를 설정하고 Test Connection을 클릭하면 연결이 성공적으로 완료됩니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/d347285b1c3411f091155254007c27c5.png\",\"id\":\"dZ3LMvm9ns9XaQXuiY47r\",\"naturalSize\":[554,415],\"size\":[554,415]},{\"text\":\"\\n다음은 설정 항목에 관한 설명입니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"I68JrwvRwhVKL_OkgMyg0\"},{\"children\":[{\"text\":\"Display name: 사용자 정의 사용자 이름을 입력합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"epFBN4hob3RsewTCmUDnx\"},{\"children\":[{\"text\":\"Service point: 형식은 \"},{\"code\":1,\"text\":\"cos..myqcloud.com\"},{\"text\":\"이며, 예를 들어 청두 리전의 버킷에 액세스하려면 \"},{\"code\":1,\"text\":\"cos.ap-chengdu.myqcloud.com\"},{\"text\":\"을 입력하십시오. 리전 약칭(region)은 \"},{\"children\":[{\"text\":\"리전 및 액세스 도메인\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/6224\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/6224\"},\"type\":\"ref\",\"id\":\"6NDCdHHYIFjMRsDn-umlQ\"},{\"text\":\"을 참고하십시오.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"6V1DS9qzWv5a8h1CFfbdh\"},{\"children\":[{\"text\":\"Access key: 액세스 키 정보 SecretId를 입력합니다. \"},{\"children\":[{\"text\":\"Tencent Cloud API 키\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/capi\"},\"type\":\"ref\",\"id\":\"2hNQIVmxagkrb2HdK_6Ih\"},{\"text\":\"로 이동하여 생성 및 획득할 수 있습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"SvcZPfpVBwmBTI0XOyOSN\"},{\"children\":[{\"text\":\"Secret key: 액세스 키 정보 Secretkey를 입력합니다. \"},{\"children\":[{\"text\":\"Tencent Cloud API 키\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/capi\"},\"type\":\"ref\",\"id\":\"3MLPcsOBIPr02gY6acPIP\"},{\"text\":\"로 이동하여 생성 및 획득할 수 있습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\",\"id\":\"wD38m7-epkHZK45HC8Xdd\"},{\"children\":[{\"text\":\"계정 정보 추가 완료 후 Source에서 이전에 설정한 사용자 이름을 선택하면 해당 사용자 이름 아래에 있는 버킷 리스트를 볼 수 있습니다. 이는 구성이 완료되었음을 의미합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/d34b7a811c3411f091155254007c27c5.png\",\"id\":\"xat1FN_wojgprioSxgQTK\",\"naturalSize\":[479,124],\"size\":[479,124]},{\"text\":\"\"}],\"indent\":0,\"start\":false,\"type\":\"oli\",\"id\":\"O6T1nMrn9qvKnqjnUJP-F\"},{\"children\":[{\"text\":\"COS 파일 관리\"}],\"nodeId\":\"cos-.ED.8C.8C.EC.9D.BC-.EA.B4.80.EB.A6.AC\",\"type\":\"h2\",\"id\":\"n-CJYtNDLCCgVoxTUFVU6\"},{\"children\":[{\"text\":\"버킷 리스트 조회\"}],\"nodeId\":\".EB.B2.84.ED.82.B7-.EB.A6.AC.EC.8A.A4.ED.8A.B8-.EC.A1.B0.ED.9A.8C\",\"type\":\"h3\",\"id\":\"JDUYQbitKDgybcBIVgmNn\"},{\"children\":[{\"text\":\"Source에서 이전에 설정한 사용자 이름을 선택하여 사용자 이름 아래의 버킷 리스트를 볼 수 있습니다.\"}],\"type\":\"p\",\"id\":\"JhfLGM1sdpYY7ESOPTQF2\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"vtqtwY1iHMFy-Ycdu2Uz6\"},{\"children\":[{\"text\":\" Service point에서 구성한 리전에 해당하는 버킷만 볼 수 있습니다. 다른 리전의 버킷을 보려면 \"},{\"b\":1,\"text\":\"File > Edit Accounts\"},{\"text\":\"를 클릭하고 사용자 이름을 선택한 다음 Service point 매개변수를 다른 리전으로 수정합니다.\"}],\"type\":\"p\",\"id\":\"Il2j0panufR6gLL1BSiMN\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"DZxo4uN9KWpb881H8OfO2\"},{\"children\":[{\"text\":\"버킷 생성\"}],\"nodeId\":\".EB.B2.84.ED.82.B7-.EC.83.9D.EC.84.B1\",\"type\":\"h3\",\"id\":\"cduW_xW5m_k2QKjdPrBFa\"},{\"children\":[{\"text\":\"이미지의 아이콘을 클릭하고 팝업 창에 전체 버킷 이름을 입력합니다(예: examplebucket-1250000000). 입력이 정확하면 \"},{\"b\":1,\"text\":\"OK\"},{\"text\":\"를 클릭하여 생성을 완료합니다.\\n버킷의 이름 생성 규칙은 \"},{\"children\":[{\"text\":\"버킷 이름 생성 규칙\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13312\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13312\"},\"type\":\"ref\",\"id\":\"2Q9BllQUzaA9QsvXCf5mi\"},{\"text\":\"을 참고하십시오.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/d34360c91c3411f08c8d525400bf7822.png\",\"id\":\"8GqsFngt6_Qw-FGE9lnSb\",\"naturalSize\":[478,312],\"size\":[478,312]},{\"text\":\"\"}],\"type\":\"p\",\"id\":\"Jc74MzErGfDbf1jqWsH1b\"},{\"children\":[{\"text\":\"버킷 삭제\"}],\"nodeId\":\".EB.B2.84.ED.82.B7-.EC.82.AD.EC.A0.9C\",\"type\":\"h3\",\"id\":\"z-9o3zoIUhwUm066Vfvs9\"},{\"children\":[{\"text\":\"버킷 리스트에서 삭제할 버킷을 선택하고 \"},{\"b\":1,\"text\":\"Delete\"},{\"text\":\"를 우클릭하여 삭제합니다.\"}],\"type\":\"p\",\"id\":\"vW8Fgc95poHT6tcbN9V-q\"},{\"children\":[{\"text\":\"객체 업로드\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EC.97.85.EB.A1.9C.EB.93.9C\",\"type\":\"h3\",\"id\":\"Ke0aRRX-X7z9gwHKRPCbS\"},{\"children\":[{\"text\":\"버킷 리스트에서 업로드할 객체의 버킷 또는 경로를 선택한 후 로컬 컴퓨터에 업로드할 객체를 선택하고 왼쪽 창으로 드래그하면 업로드 작업이 완료됩니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/d34628391c3411f099e05254005ef0f7.png\",\"id\":\"J1PqWDTTQuCgw9gXcfZm9\",\"naturalSize\":[1192,327],\"size\":[974,267]},{\"text\":\"\"}],\"type\":\"p\",\"id\":\"rUMWArMAwoLDfrpnpHfOc\"},{\"children\":[{\"text\":\"객체 다운로드\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EB.8B.A4.EC.9A.B4.EB.A1.9C.EB.93.9C\",\"type\":\"h3\",\"id\":\"p1vJo4pGS9JYIcvW-5gQo\"},{\"children\":[{\"text\":\"왼쪽 창에서 다운로드할 객체를 선택한 후 오른쪽에 있는 로컬 컴퓨터의 폴더로 객체를 드래그하여 다운로드 작업을 완료합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/d3439f241c3411f081f552540099c741.png\",\"id\":\"gSQD5AE_fiq1KhM0-Ae9a\",\"naturalSize\":[1194,378],\"size\":[974,308]},{\"text\":\"\"}],\"type\":\"p\",\"id\":\"jTd_mExVV98t7LYfbngYG\"},{\"children\":[{\"text\":\"객체 복사\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EB.B3.B5.EC.82.AC\",\"type\":\"h3\",\"id\":\"QBK8yrICHCrT3_duxGl0m\"},{\"children\":[{\"text\":\"툴의 오른쪽 창에서 복사된 객체 타깃 경로를 선택한 후 왼쪽 창에서 복사할 객체를 선택하고 \"},{\"b\":1,\"text\":\"Copy\"},{\"text\":\"를 우클릭하여 팝업 정보를 확인하면 객체 복사 작업이 완료됩니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/d34c3ba61c3411f091155254007c27c5.png\",\"id\":\"lXpcqJTq-YlEC36BFnz1m\",\"naturalSize\":[1101,233],\"size\":[974,206]},{\"text\":\"\"}],\"type\":\"p\",\"id\":\"aA4FtIyrBA__Zxa-CD5HC\"},{\"children\":[{\"text\":\"객체 이름 변경\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EC.9D.B4.EB.A6.84-.EB.B3.80.EA.B2.BD\",\"type\":\"h3\",\"id\":\"Ev2RShUkuA9tdLNcVEgY3\"},{\"children\":[{\"text\":\"버킷에서 이름을 변경할 객체를 찾아 \"},{\"b\":1,\"text\":\"Rename\"},{\"text\":\"을 우클릭하고 새 이름을 입력합니다.\"}],\"type\":\"p\",\"id\":\"etV4FXpyfLALn3iXyxs37\"},{\"children\":[{\"text\":\"객체 삭제\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EC.82.AD.EC.A0.9C\",\"type\":\"h3\",\"id\":\"L7aomWqLBL_MDZ6PiEd8t\"},{\"children\":[{\"text\":\"버킷에서 삭제하려는 객체를 찾아 \"},{\"b\":1,\"text\":\"Delete\"},{\"text\":\"를 우클릭하여 객체를 삭제합니다.\"}],\"type\":\"p\",\"id\":\"DNKu5Kl5R4vVRgfLeFvTm\"},{\"children\":[{\"text\":\"객체 이동\"}],\"nodeId\":\".EA.B0.9D.EC.B2.B4-.EC.9D.B4.EB.8F.99\",\"type\":\"h3\",\"id\":\"smpBlro0T99OBl6anRKFD\"},{\"children\":[{\"text\":\"툴 오른쪽 창에서 이동된 객체 타깃 경로를 선택한 후 왼쪽 창에서 이동할 객체를 선택하고 \"},{\"b\":1,\"text\":\"Move\"},{\"text\":\"를 우클릭하여 팝업 창 정보를 확인하면 객체 이동 작업이 완료됩니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/d3459f571c3411f0bda3525400e889b2.png\",\"id\":\"G9jxQ70BrWDXXcGGQBJPM\",\"naturalSize\":[1099,135],\"size\":[974,119]},{\"text\":\"\"}],\"type\":\"p\",\"id\":\"nWUYTLhr6D5QdSJFy60m3\"},{\"children\":[{\"text\":\"기타 기능\"}],\"nodeId\":\".EA.B8.B0.ED.83.80-.EA.B8.B0.EB.8A.A5\",\"type\":\"h3\",\"id\":\"O8SiTvvw6yRS8TIRJi2pP\"},{\"children\":[{\"text\":\"상기 기능 외에도 CloudBerry Explorer는 객체 ACL 설정, 객체 메타데이터 조회, 사용자 정의 Headers, 객체 URL 가져오기 등과 같은 다른 기능도 지원합니다. 사용자는 실제 필요에 따라 작업할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"kgKx-VM1H8TE4sOovMLwZ\"}]"}},"51186":{"categoryId":436,"weight":90,"type":"page","extension":"","pid":48291,"id":51186,"lang":"ko","title":"TCPlayer 사용하여 COS에서 비디오 재생","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2022-11-14 22:34:51","recentReleaseTime":"2022-11-14 22:34:51","content":{"title":"TCPlayer 사용하여 COS에서 비디오 재생","body":"

소개

본문은 TCToolkit SDK에 통합된 TCPlayer와 CI(Cloud Infinite)의 풍부한 오디오/비디오 기능을 사용하여 웹 브라우저에서 COS에 저장된 비디오 파일을 재생하는 방법을 설명합니다.

통합 가이드

1단계: 플레이어 양식 및 스크립트 파일을 페이지로 가져오기

<!--플레이어 양식 파일-->
<link href="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.1/tcplayer.min.css" rel="stylesheet">
<!--플레이어 스크립트 파일-->
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.0/tcplayer.v4.5.0.min.js"></script>
설명:
플레이어 SDK를 사용할 때 위의 정적 리소스를 직접 배포하는 것이 좋습니다. 플레이어 리소스를 다운로드하려면 여기 클릭하십시오.
압축 해제 후 생성된 폴더를 배포합니다. 폴더의 디렉터리를 조정하지 마십시오. 그렇지 않으면 리소스 가져오기 예외가 발생할 수 있습니다.

2단계: 플레이어 컨테이너 노드 설정

플레이어를 표시할 페이지에 플레이어 컨테이너를 추가합니다. 예를 들어 index.html에 다음 코드를 추가합니다(컨테이너 ID와 너비 및 높이를 사용자 지정할 수 있음).
<video id="player-container-id" width="414" height="270" preload="auto" playsinline webkit-playsinline>
</video>
설명:
플레이어 컨테이너는 <video> 태그여야 합니다.
예시의 player-container-id는 사용자 정의할 수 있는 플레이어 컨테이너의 ID입니다.
CSS를 통해 플레이어 컨테이너 영역의 크기를 설정하는 것이 좋습니다. CSS는 속성보다 유연하고 전체 화면에 맞추기 및 컨테이너 적응과 같은 효과를 얻을 수 있습니다.
예시의 preload 속성은 페이지가 로딩된 후 비디오 로딩 여부를 지정하며 일반적으로 재생을 더 빨리 시작하기 위해 auto로 설정됩니다. 다른 옵션에는 meta(페이지가 로딩된 후에만 메타데이터를 로딩함) 및 none(페이지가 로딩된 후 비디오를 로딩하지 않음)이 있습니다. 시스템 제한으로 인해 동영상은 모바일 장치에 자동으로 로딩되지 않습니다.
playsinlinewebkit-playsinline 속성은 표준 모바일 브라우저가 비디오 재생을 가로채지 않을 때 인라인 재생을 구현하는 데 사용됩니다. 여기에서는 참고용일 뿐이며 필요에 따라 사용할 수 있습니다.
x5-playsinline 속성을 설정하면 TBS 커널에서 X5 UI 플레이어가 사용됩니다.

3단계: 비디오 파일 객체 주소 가져오기

3. https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.<비디오 형식> 형식의 비디오 파일 객체 주소를 가져옵니다.
설명:
Cross-Origin 액세스가 포함된 경우 CORS 설정에서 설명한 대로 버킷에 대한 CORS를 설정해야 합니다.
버킷 권한이 비공개 읽기/쓰기인 경우 객체 주소에 서명이 있어야 합니다. 자세한 내용은 Request Signature를 참고하십시오.

4단계: 플레이어 초기화 및 COS 동영상 파일 객체 URL 전달

var player = TCPlayer("player-container-id", {}); // player-container-id는 플레이어 컨테이너 ID로 html과 동일해야 합니다.
player.src("https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4"); // COS 비디오 객체 주소

기능 가이드



다양한 형식의 비디오 파일 재생

1. COS 버킷에 있는 비디오 파일의 객체 주소를 가져옵니다.
설명:
트랜스코딩되지 않은 비디오는 재생 중에 호환성 문제가 발생할 수 있으므로 재생을 위해 비디오를 트랜스코딩하는 것이 좋습니다. CI의 Audio/Video Transcoding 기능을 사용하여 다양한 형식의 비디오 파일을 얻을 수 있습니다.
2. 다른 비디오 형식의 경우 다른 브라우저와의 호환성을 보장하기 위해 해당 종속성을 가져와야 합니다.
MP4: 다른 종속성을 가져올 필요가 없습니다.
HLS: Chrome 및 Firefox와 같은 최신 브라우저에서 HTML5를 통해 HLS 동영상을 재생하려면 tcplayer.min.js를 가져오기 전에 hls.min.js를 가져와야 합니다.
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.1/libs/hls.min.0.13.2m.js"></script>
FLV: Chrome 및 Firefox와 같은 최신 브라우저에서 H5를 통해 FLV 비디오를 재생하려면 tcplayer.min.js를 가져오기 전에 flv.min.js를 가져와야 합니다.
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.2/libs/flv.min.1.6.2.js"></script>
DASH: dash.all.min.js 파일을 가져와야 합니다.
<script src="https://cos-video-1258344699.cos.ap-guangzhou.myqcloud.com/lib/dash.all.min.js"></script>
3. 플레이어를 초기화하고 객체 주소를 전달합니다.
var player = TCPlayer("player-container-id", {}); // player-container-id는 플레이어 컨테이너 ID로 html과 동일해야 합니다.
player.src("https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4"); // COS 비디오 주소
코드 샘플 가져오기:


PM3U8 비디오 재생

PM3U8은 개인 M3U8 비디오 파일을 나타냅니다. COS는 개인 M3U8 TS 리소스를 가져오기 위한 다운로드 권한 API를 제공합니다. 자세한 내용은 Private M3U8 API를 참고하십시오.
var player = TCPlayer("player-container-id", {
poster: "https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.m3u8?ci-process=pm3u8&expires=3600" // 개인 TS 리소스 URL에 대한 다운로드 자격 증명의 상대 유효 기간, 3600
});
코드 샘플 가져오기:


썸네일 설정

1. COS 버킷에 있는 썸네일의 객체 주소를 가져옵니다.
주의:
CI의 Intelligent Thumbnail 기능은 최적의 프레임을 추출하여 썸네일을 생성하여 비디오 콘텐츠를 더 매력적으로 만들 수 있습니다.
2. 썸네일을 설정합니다.
var player = TCPlayer("player-container-id", {
poster: "https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.png"
});
코드 샘플 가져오기:


HLS 암호화 비디오 재생

CI는 동영상 콘텐츠의 보안을 확보하고 동영상의 무단 다운로드 및 배포를 방지하기 위해 개인이 읽을 수 있는 파일보다 안전한 HLS 동영상 콘텐츠를 암호화하는 기능을 제공합니다. 암호화된 비디오는 재생 액세스 권한이 없는 사용자에게 배포할 수 없습니다. 다운로드하더라도 여전히 암호화되어 악의적으로 재배포할 수 없습니다. 이렇게 하면 비디오 저작권이 침해되는 것을 방지할 수 있습니다.
작업 순서는 다음과 같습니다.
1. HLS 암호화 비디오 재생의 지침에 따라 암호화된 비디오를 생성합니다.
2. 플레이어를 초기화하고 비디오 객체 주소를 전달합니다.
var player = TCPlayer("player-container-id", {}); // player-container-id는 플레이어 컨테이너 ID로 html 상의 것과 일치해야 합니다.
player.src("https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.m3u8"); // hls 암호화된 비디오 주소
코드 샘플 가져오기:


해상도 전환

CI의 Adaptive Bitrate Streaming 기능은 비디오를 트랜스코딩하고 출력을 위해 어댑티브 비트스트림으로 리먹스할 수 있으므로 다양한 네트워크 조건에서 비디오 콘텐츠를 빠르게 배포할 수 있습니다. 플레이어는 현재 대역폭을 기반으로 비디오를 재생하는 데 가장 적절한 비트레이트를 동적으로 선택할 수 있습니다.\n작업 순서는 다음과 같습니다.
1. CI의 어댑티브 비트레이트 스트리밍 기능을 사용하여 다중 비트레이트 어댑티브 HLS 또는 DASH 대상 파일을 생성합니다.
2. 플레이어를 초기화하고 비디오 객체 주소를 전달합니다.
var player = TCPlayer("player-container-id", {}); // player-container-id는 플레이어 컨테이너 ID로 html 상의 것과 일치해야 합니다.
player.src("https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.m3u8"); // 다중 비트레이트 비디오 주소
코드 샘플 가져오기:


동적 워터마크 설정

플레이어는 비디오에 위치와 속도가 변화하는 동적 워터마크 추가를 지원합니다. 동적 워터마크 기능을 사용할 때 플레이어 객체의 참고가 전역 환경에 노출되어서는 안 됩니다. 그렇지 않으면 동적 워터마크를 쉽게 제거할 수 있습니다. CI를 사용하면 클라우드의 비디오에 동적 워터마크를 추가할 수도 있습니다. 자세한 내용은 워터마크 템플릿 API를 참고하십시오.
var player = TCPlayer("player-container-id", {
plugins:{
DynamicWatermark: {
speed: 0.2, // 속도
content: "Tencent Cloud CI", // 텍스트
opacity: 0.7 // 불투명도
}
}
});
코드 샘플 가져오기:


롤 이미지 광고 설정

작업 순서는 다음과 같습니다.
1. 광고 썸네일과 링크를 준비합니다.
2. 플레이어를 초기화하고, 광고 썸네일과 링크를 설정하고, 광고 노드를 설정합니다.
var PosterImage = TCPlayer.getComponent('PosterImage');
PosterImage.prototype.handleClick = function () {
window.open('https://cloud.tencent.com/product/ci'); // 광고 링크 설정
};

var player = TCPlayer('player-container-id', {
poster: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx..png', // 광고 미리보기 이미지
});
player.src('https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4');

var adTextNode = document.createElement('span');
adTextNode.className = 'ad-text-node';
adTextNode.innerHTML = ‘광고’;

var adCloseIconNode = document.createElement('i');
adCloseIconNode.className = 'ad-close-icon-node';
adCloseIconNode.onclick = function (e) {
e.stopPropagation();
player.posterImage.hide();
};

player.posterImage.el_.appendChild(adTextNode);
player.posterImage.el_.appendChild(adCloseIconNode);
코드 샘플 가져오기:


비디오 진행 썸네일 설정(이미지 스프라이트)

작업 순서는 다음과 같습니다.
1. CI의 Video Frame Capturing 기능을 사용하여 이미지 스프라이트를 생성합니다.
2. 1단계에서 생성된 이미지 스프라이트 및 VTT(이미지 스프라이트 위치 설명 파일)의 객체 주소를 가져옵니다.
3. 플레이어를 초기화하고 비디오 및 VTT 파일 주소를 설정합니다.
var player = TCPlayer('player-container-id', {
plugins: {
VttThumbnail: {
vttUrl: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.vtt' // VTT 파일
},
},
});
player.src('https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4');
코드 샘플 가져오기:


동영상 자막 설정

작업 순서는 다음과 같습니다.
1. CI의 음성 인식 기능으로 자막 파일을 생성합니다.
2. 1단계에서 생성된 SRT 파일의 객체 주소를 가져옵니다.
3. 플레이어를 초기화하고 비디오 및 SRT 파일 주소를 설정합니다.
var player = TCPlayer('player-container-id', {});
player.src('https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4');
player.on('ready', function () {
// 자막 파일 추가
var subTrack = player.addRemoteTextTrack({
src: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.srt', // 자막 파일
kind: 'subtitles',
srclang: 'zh-cn',
label: '중국어',
default: 'true',
}, true);
});
코드 샘플 가져오기:


다국어 동영상 자막 설정

작업 순서는 다음과 같습니다.
1. CI의 음성 인식 기능으로 자막 파일을 생성하고 다국어로 번역합니다.
2. 1단계에서 생성된 다국어 SRT 파일의 객체 주소를 가져옵니다.
3. 플레이어를 초기화하고 비디오 및 다국어 SRT 파일 주소를 설정합니다.
var player = TCPlayer('player-container-id', {});
player.src('https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4');
player.on('ready', function () {
// 중국어 자막 설정
var subTrack = player.addRemoteTextTrack({
src: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/zh.srt', // 자막 파일
kind: 'subtitles',
srclang: 'zh-cn',
label: '중국어',
default: 'true',
}, true);
// 영어 자막 설정
var subTrack = player.addRemoteTextTrack({
src: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/en.srt', // 자막 파일
kind: 'subtitles',
srclang: 'en',
label: '영어',
default: 'false',
}, true);
});
코드 샘플 가져오기:
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"본문은 TCToolkit SDK에 통합된 TCPlayer와 \"},{\"children\":[{\"text\":\"CI(Cloud Infinite)\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/1045/46980\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/1045/46980\"},\"type\":\"ref\"},{\"text\":\"의 풍부한 오디오/비디오 기능을 사용하여 웹 브라우저에서 COS에 저장된 비디오 파일을 재생하는 방법을 설명합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"통합 가이드\"}],\"nodeId\":\".ED.86.B5.ED.95.A9-.EA.B0.80.EC.9D.B4.EB.93.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"1단계: 플레이어 양식 및 스크립트 파일을 페이지로 가져오기\"}],\"nodeId\":\"1.EB.8B.A8.EA.B3.84.3A-.ED.94.8C.EB.A0.88.EC.9D.B4.EC.96.B4-.EC.96.91.EC.8B.9D-.EB.B0.8F-.EC.8A.A4.ED.81.AC.EB.A6.BD.ED.8A.B8-.ED.8C.8C.EC.9D.BC.EC.9D.84-.ED.8E.98.EC.9D.B4.EC.A7.80.EB.A1.9C-.EA.B0.80.EC.A0.B8.EC.98.A4.EA.B8.B0\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"\\u003c!--플레이어 양식 파일--\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003clink href=\\\"https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.1/tcplayer.min.css\\\" rel=\\\"stylesheet\\\"\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c!--플레이어 스크립트 파일--\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cscript src=\\\"https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.0/tcplayer.v4.5.0.min.js\\\"\\u003e\\u003c/script\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"플레이어 SDK를 사용할 때 위의 정적 리소스를 직접 배포하는 것이 좋습니다. \"},{\"children\":[{\"text\":\"플레이어 리소스를 다운로드하려면 여기 클릭\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.2/release.zip\",\"props\":{\"type\":\"link\",\"url\":\"https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.2/release.zip\"},\"type\":\"ref\"},{\"text\":\"하십시오.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"압축 해제 후 생성된 폴더를 배포합니다. 폴더의 디렉터리를 조정하지 마십시오. 그렇지 않으면 리소스 가져오기 예외가 발생할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"2단계: 플레이어 컨테이너 노드 설정\"}],\"nodeId\":\"2.EB.8B.A8.EA.B3.84.3A-.ED.94.8C.EB.A0.88.EC.9D.B4.EC.96.B4-.EC.BB.A8.ED.85.8C.EC.9D.B4.EB.84.88-.EB.85.B8.EB.93.9C-.EC.84.A4.EC.A0.95\",\"type\":\"h4\"},{\"children\":[{\"text\":\"플레이어를 표시할 페이지에 플레이어 컨테이너를 추가합니다. 예를 들어 index.html에 다음 코드를 추가합니다(컨테이너 ID와 너비 및 높이를 사용자 지정할 수 있음).\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"\\u003cvideo id=\\\"player-container-id\\\" width=\\\"414\\\" height=\\\"270\\\" preload=\\\"auto\\\" playsinline webkit-playsinline\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/video\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"플레이어 컨테이너는 \"},{\"code\":1,\"text\":\"\\u003cvideo\\u003e\"},{\"text\":\" 태그여야 합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"예시의 \"},{\"code\":1,\"text\":\"player-container-id\"},{\"text\":\"는 사용자 정의할 수 있는 플레이어 컨테이너의 ID입니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"CSS를 통해 플레이어 컨테이너 영역의 크기를 설정하는 것이 좋습니다. CSS는 속성보다 유연하고 전체 화면에 맞추기 및 컨테이너 적응과 같은 효과를 얻을 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"예시의 \"},{\"code\":1,\"text\":\"preload\"},{\"text\":\" 속성은 페이지가 로딩된 후 비디오 로딩 여부를 지정하며 일반적으로 재생을 더 빨리 시작하기 위해 \"},{\"code\":1,\"text\":\"auto\"},{\"text\":\"로 설정됩니다. 다른 옵션에는 \"},{\"code\":1,\"text\":\"meta\"},{\"text\":\"(페이지가 로딩된 후에만 메타데이터를 로딩함) 및 \"},{\"code\":1,\"text\":\"none\"},{\"text\":\"(페이지가 로딩된 후 비디오를 로딩하지 않음)이 있습니다. 시스템 제한으로 인해 동영상은 모바일 장치에 자동으로 로딩되지 않습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"code\":1,\"text\":\"playsinline\"},{\"text\":\" 및 \"},{\"code\":1,\"text\":\"webkit-playsinline\"},{\"text\":\" 속성은 표준 모바일 브라우저가 비디오 재생을 가로채지 않을 때 인라인 재생을 구현하는 데 사용됩니다. 여기에서는 참고용일 뿐이며 필요에 따라 사용할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"code\":1,\"text\":\"x5-playsinline\"},{\"text\":\" 속성을 설정하면 TBS 커널에서 X5 UI 플레이어가 사용됩니다.\"}],\"start\":false,\"type\":\"uli\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"3단계: 비디오 파일 객체 주소 가져오기\"}],\"nodeId\":\"3.EB.8B.A8.EA.B3.84.3A-.EB.B9.84.EB.94.94.EC.98.A4-.ED.8C.8C.EC.9D.BC-.EA.B0.9D.EC.B2.B4-.EC.A3.BC.EC.86.8C-.EA.B0.80.EC.A0.B8.EC.98.A4.EA.B8.B0\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"버킷 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13309\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13309\"},\"type\":\"ref\"},{\"text\":\".\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"동영상 파일 객체 업로드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13321\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13321\"},\"type\":\"ref\"},{\"text\":\".\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"code\":1,\"text\":\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.\\u003c비디오 형식\\u003e\"},{\"text\":\" 형식의 비디오 파일 객체 주소를 가져옵니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"Cross-Origin 액세스가 포함된 경우 \"},{\"children\":[{\"text\":\"CORS 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13318\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13318\"},\"type\":\"ref\"},{\"text\":\"에서 설명한 대로 버킷에 대한 CORS를 설정해야 합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"버킷 권한이 비공개 읽기/쓰기인 경우 객체 주소에 서명이 있어야 합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"Request Signature\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7778\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7778\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"start\":false,\"type\":\"uli\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"4단계: 플레이어 초기화 및 COS 동영상 파일 객체 URL 전달\"}],\"nodeId\":\"4.EB.8B.A8.EA.B3.84.3A-.ED.94.8C.EB.A0.88.EC.9D.B4.EC.96.B4-.EC.B4.88.EA.B8.B0.ED.99.94-.EB.B0.8F-cos-.EB.8F.99.EC.98.81.EC.83.81-.ED.8C.8C.EC.9D.BC-.EA.B0.9D.EC.B2.B4-url-.EC.A0.84.EB.8B.AC\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"var player = TCPlayer(\\\"player-container-id\\\", {}); // player-container-id는 플레이어 컨테이너 ID로 html과 동일해야 합니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"player.src(\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4\\\"); // COS 비디오 객체 주소\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"기능 가이드\"}],\"nodeId\":\".EA.B8.B0.EB.8A.A5-.EA.B0.80.EC.9D.B4.EB.93.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"다양한 형식의 비디오 파일 재생\"}],\"nodeId\":\".EB.8B.A4.EC.96.91.ED.95.9C-.ED.98.95.EC.8B.9D.EC.9D.98-.EB.B9.84.EB.94.94.EC.98.A4-.ED.8C.8C.EC.9D.BC-.EC.9E.AC.EC.83.9D\",\"type\":\"h3\"},{\"children\":[{\"text\":\"COS 버킷에 있는 비디오 파일의 객체 주소를 가져옵니다.\"}],\"nodeId\":\"1\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 트랜스코딩되지 않은 비디오는 재생 중에 호환성 문제가 발생할 수 있으므로 재생을 위해 비디오를 트랜스코딩하는 것이 좋습니다. CI의 \"},{\"children\":[{\"text\":\"Audio/Video Transcoding\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/49543\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/49543\"},\"type\":\"ref\"},{\"text\":\" 기능을 사용하여 다양한 형식의 비디오 파일을 얻을 수 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"다른 비디오 형식의 경우 다른 브라우저와의 호환성을 보장하기 위해 해당 종속성을 가져와야 합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"MP4: 다른 종속성을 가져올 필요가 없습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"HLS: Chrome 및 Firefox와 같은 최신 브라우저에서 HTML5를 통해 HLS 동영상을 재생하려면 tcplayer.min.js를 가져오기 전에 hls.min.js를 가져와야 합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\" \\u003cscript src=\\\"https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.1/libs/hls.min.0.13.2m.js\\\"\\u003e\\u003c/script\\u003e\"}],\"type\":\"code-line\"}],\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"FLV: Chrome 및 Firefox와 같은 최신 브라우저에서 H5를 통해 FLV 비디오를 재생하려면 tcplayer.min.js를 가져오기 전에 flv.min.js를 가져와야 합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\" \\u003cscript src=\\\"https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.2/libs/flv.min.1.6.2.js\\\"\\u003e\\u003c/script\\u003e\"}],\"type\":\"code-line\"}],\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"DASH: dash.all.min.js 파일을 가져와야 합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\" \\u003cscript src=\\\"https://cos-video-1258344699.cos.ap-guangzhou.myqcloud.com/lib/dash.all.min.js\\\"\\u003e\\u003c/script\\u003e\"}],\"type\":\"code-line\"}],\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 객체 주소를 전달합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"var player = TCPlayer(\\\"player-container-id\\\", {}); // player-container-id는 플레이어 컨테이너 ID로 html과 동일해야 합니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"player.src(\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4\\\"); // COS 비디오 주소\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"MP4 재생을 위한 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/mp4.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/mp4.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"FLV 재생을 위한 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/flv.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/flv.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"HLS 재생을 위한 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/m3u8.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/m3u8.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"DASH 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/dash.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/dash.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"PM3U8 비디오 재생\"}],\"nodeId\":\"pm3u8-.EB.B9.84.EB.94.94.EC.98.A4-.EC.9E.AC.EC.83.9D\",\"type\":\"h3\"},{\"children\":[{\"text\":\"PM3U8은 개인 M3U8 비디오 파일을 나타냅니다. COS는 개인 M3U8 TS 리소스를 가져오기 위한 다운로드 권한 API를 제공합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"Private M3U8 API\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/47220\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/47220\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"nodeId\":\"2\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"var player = TCPlayer(\\\"player-container-id\\\", {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" poster: \\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.m3u8?ci-process=pm3u8\\u0026expires=3600\\\" // 개인 TS 리소스 URL에 대한 다운로드 자격 증명의 상대 유효 기간, 3600초\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"PM3U8 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/pm3u8.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/pm3u8.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"썸네일 설정\"}],\"nodeId\":\".EC.8D.B8.EB.84.A4.EC.9D.BC-.EC.84.A4.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"text\":\"COS 버킷에 있는 썸네일의 객체 주소를 가져옵니다.\"}],\"nodeId\":\"3\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"CI의 \"},{\"children\":[{\"text\":\"Intelligent Thumbnail\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/47740\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/47740\"},\"type\":\"ref\"},{\"text\":\" 기능은 최적의 프레임을 추출하여 썸네일을 생성하여 비디오 콘텐츠를 더 매력적으로 만들 수 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"썸네일을 설정합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"var player = TCPlayer(\\\"player-container-id\\\", {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" poster: \\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.png\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"썸네일 구성 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/poster.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/poster.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"HLS 암호화 비디오 재생\"}],\"nodeId\":\"hls-.EC.95.94.ED.98.B8.ED.99.94-.EB.B9.84.EB.94.94.EC.98.A4-.EC.9E.AC.EC.83.9D\",\"type\":\"h3\"},{\"children\":[{\"text\":\"CI는 동영상 콘텐츠의 보안을 확보하고 동영상의 무단 다운로드 및 배포를 방지하기 위해 개인이 읽을 수 있는 파일보다 안전한 HLS 동영상 콘텐츠를 암호화하는 기능을 제공합니다. 암호화된 비디오는 재생 액세스 권한이 없는 사용자에게 배포할 수 없습니다. 다운로드하더라도 여전히 암호화되어 악의적으로 재배포할 수 없습니다. 이렇게 하면 비디오 저작권이 침해되는 것을 방지할 수 있습니다.\"}],\"nodeId\":\"4\",\"type\":\"p\"},{\"children\":[{\"text\":\"작업 순서는 다음과 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"HLS 암호화 비디오 재생\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/48293\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/48293\"},\"type\":\"ref\"},{\"text\":\"의 지침에 따라 암호화된 비디오를 생성합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 비디오 객체 주소를 전달합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"var player = TCPlayer(\\\"player-container-id\\\", {}); // player-container-id는 플레이어 컨테이너 ID로 html 상의 것과 일치해야 합니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"player.src(\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.m3u8\\\"); // hls 암호화된 비디오 주소\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"HLS 암호화 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/m3u8.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/m3u8.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"해상도 전환\"}],\"nodeId\":\".ED.95.B4.EC.83.81.EB.8F.84-.EC.A0.84.ED.99.98\",\"type\":\"h3\"},{\"children\":[{\"text\":\"CI의 \"},{\"children\":[{\"text\":\"Adaptive Bitrate Streaming\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/47745\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/47745\"},\"type\":\"ref\"},{\"text\":\" 기능은 비디오를 트랜스코딩하고 출력을 위해 어댑티브 비트스트림으로 리먹스할 수 있으므로 다양한 네트워크 조건에서 비디오 콘텐츠를 빠르게 배포할 수 있습니다. 플레이어는 현재 대역폭을 기반으로 비디오를 재생하는 데 가장 적절한 비트레이트를 동적으로 선택할 수 있습니다.\\n작업 순서는 다음과 같습니다.\"}],\"nodeId\":\"5\",\"type\":\"p\"},{\"children\":[{\"text\":\"CI의 \"},{\"children\":[{\"text\":\"어댑티브 비트레이트 스트리밍\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"\",\"props\":{\"type\":\"link\",\"url\":\"\"},\"type\":\"ref\"},{\"text\":\" 기능을 사용하여 다중 비트레이트 어댑티브 HLS 또는 DASH 대상 파일을 생성합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 비디오 객체 주소를 전달합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"var player = TCPlayer(\\\"player-container-id\\\", {}); // player-container-id는 플레이어 컨테이너 ID로 html 상의 것과 일치해야 합니다.\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"player.src(\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.m3u8\\\"); // 다중 비트레이트 비디오 주소\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"해상도 전환을 위한 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/multiDefinition.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/multiDefinition.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"동적 워터마크 설정\"}],\"nodeId\":\".EB.8F.99.EC.A0.81-.EC.9B.8C.ED.84.B0.EB.A7.88.ED.81.AC-.EC.84.A4.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"text\":\"플레이어는 비디오에 위치와 속도가 변화하는 동적 워터마크 추가를 지원합니다. 동적 워터마크 기능을 사용할 때 플레이어 객체의 참고가 전역 환경에 노출되어서는 안 됩니다. 그렇지 않으면 동적 워터마크를 쉽게 제거할 수 있습니다. CI를 사용하면 클라우드의 비디오에 동적 워터마크를 추가할 수도 있습니다. 자세한 내용은 워터마크 템플릿 API를 참고하십시오.\"}],\"nodeId\":\"6\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"var player = TCPlayer(\\\"player-container-id\\\", {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" plugins:{\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" DynamicWatermark: {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" speed: 0.2, // 속도\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" content: \\\"Tencent Cloud CI\\\", // 텍스트\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" opacity: 0.7 // 불투명도\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"동적 워터마크 설정을 위한 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/dynamicWatermark.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/dynamicWatermark.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"롤 이미지 광고 설정\"}],\"nodeId\":\".EB.A1.A4-.EC.9D.B4.EB.AF.B8.EC.A7.80-.EA.B4.91.EA.B3.A0-.EC.84.A4.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"text\":\"작업 순서는 다음과 같습니다.\"}],\"nodeId\":\"7\",\"type\":\"p\"},{\"children\":[{\"text\":\"광고 썸네일과 링크를 준비합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"플레이어를 초기화하고, 광고 썸네일과 링크를 설정하고, 광고 노드를 설정합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"var PosterImage = TCPlayer.getComponent('PosterImage');\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"PosterImage.prototype.handleClick = function () {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" window.open('https://cloud.tencent.com/product/ci'); // 광고 링크 설정\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"};\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"var player = TCPlayer('player-container-id', {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" poster: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx..png', // 광고 미리보기 이미지\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"player.src('https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4');\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"var adTextNode = document.createElement('span');\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"adTextNode.className = 'ad-text-node';\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"adTextNode.innerHTML = ‘광고’;\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"var adCloseIconNode = document.createElement('i');\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"adCloseIconNode.className = 'ad-close-icon-node';\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"adCloseIconNode.onclick = function (e) {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" e.stopPropagation();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" player.posterImage.hide();\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"};\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"player.posterImage.el_.appendChild(adTextNode);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"player.posterImage.el_.appendChild(adCloseIconNode);\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"롤 이미지 광고 구성을 위한 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/advertise.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/advertise.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"비디오 진행 썸네일 설정(이미지 스프라이트)\"}],\"nodeId\":\".EB.B9.84.EB.94.94.EC.98.A4-.EC.A7.84.ED.96.89-.EC.8D.B8.EB.84.A4.EC.9D.BC-.EC.84.A4.EC.A0.95(.EC.9D.B4.EB.AF.B8.EC.A7.80-.EC.8A.A4.ED.94.84.EB.9D.BC.EC.9D.B4.ED.8A.B8)\",\"type\":\"h3\"},{\"children\":[{\"text\":\"작업 순서는 다음과 같습니다.\"}],\"nodeId\":\"8\",\"type\":\"p\"},{\"children\":[{\"text\":\"CI의 \"},{\"children\":[{\"text\":\"Video Frame Capturing\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/47736\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/47736\"},\"type\":\"ref\"},{\"text\":\" 기능을 사용하여 이미지 스프라이트를 생성합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"1단계에서 생성된 이미지 스프라이트 및 VTT(이미지 스프라이트 위치 설명 파일)의 객체 주소를 가져옵니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 비디오 및 VTT 파일 주소를 설정합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"var player = TCPlayer('player-container-id', {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" plugins: {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" VttThumbnail: {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" vttUrl: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.vtt' // VTT 파일\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"player.src('https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4');\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"이미지 스프라이트 구성을 위한 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/preview.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/preview.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"동영상 자막 설정\"}],\"nodeId\":\".EB.8F.99.EC.98.81.EC.83.81-.EC.9E.90.EB.A7.89-.EC.84.A4.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"text\":\"작업 순서는 다음과 같습니다.\"}],\"nodeId\":\"9\",\"type\":\"p\"},{\"children\":[{\"text\":\"CI의 음성 인식 기능으로 자막 파일을 생성합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"1단계에서 생성된 SRT 파일의 객체 주소를 가져옵니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 비디오 및 SRT 파일 주소를 설정합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"var player = TCPlayer('player-container-id', {});\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"player.src('https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4');\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"player.on('ready', function () {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 자막 파일 추가\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" var subTrack = player.addRemoteTextTrack({\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" src: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.srt', // 자막 파일\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" kind: 'subtitles',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" srclang: 'zh-cn',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" label: '중국어',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" default: 'true',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }, true);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"동영상 자막 구성을 위한 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/subtitle.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/subtitle.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"다국어 동영상 자막 설정\"}],\"nodeId\":\".EB.8B.A4.EA.B5.AD.EC.96.B4-.EB.8F.99.EC.98.81.EC.83.81-.EC.9E.90.EB.A7.89-.EC.84.A4.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"text\":\"작업 순서는 다음과 같습니다.\"}],\"nodeId\":\"10\",\"type\":\"p\"},{\"children\":[{\"text\":\"CI의 음성 인식 기능으로 자막 파일을 생성하고 다국어로 번역합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"1단계에서 생성된 다국어 SRT 파일의 객체 주소를 가져옵니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 비디오 및 다국어 SRT 파일 주소를 설정합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"var player = TCPlayer('player-container-id', {});\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"player.src('https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4');\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"player.on('ready', function () {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 중국어 자막 설정\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" var subTrack = player.addRemoteTextTrack({\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" src: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/zh.srt', // 자막 파일\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" kind: 'subtitles',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" srclang: 'zh-cn',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" label: '중국어',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" default: 'true',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }, true);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 영어 자막 설정\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" var subTrack = player.addRemoteTextTrack({\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" src: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/en.srt', // 자막 파일\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" kind: 'subtitles',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" srclang: 'en',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" label: '영어',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" default: 'false',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }, true);\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"]\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"다국어 자막 구성을 위한 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/multiLanguage.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/tcplayer/multiLanguage.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"}]"}},"53812":{"categoryId":436,"weight":60,"type":"page","extension":"","pid":48291,"id":53812,"lang":"ko","title":"DPlayer를 사용하여 COS에서 비디오 재생","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2023-03-14 22:29:03","recentReleaseTime":"2023-03-14 22:29:03","content":{"title":"DPlayer를 사용하여 COS에서 비디오 재생","body":"

소개

본문은 DPlayerCloud Infinite(CI)의 풍부한 오디오/비디오 기능과 함께 사용하여 Web 브라우저에서 COS에 저장된 비디오 파일을 재생하는 방법을 설명합니다.

통합 가이드

1단계: 플레이어 스크립트 파일 및 필요한 종속성 파일을 페이지로 가져오기

<!-- 플레이어 스크립트 파일 -->
<script src="https://cdn.jsdelivr.net/npm/dplayer@1.26.0/dist/DPlayer.min.js"></script>
설명:
플레이어 사용 시 상기 정적 리소스를 직접 배포하는 것을 권장합니다.

2단계: 플레이어 컨테이너 노드 설정

플레이어를 표시할 페이지에 플레이어 컨테이너를 추가합니다. 예를 들어 index.html에 다음 코드를 추가합니다(컨테이너 ID와 너비 및 높이를 사용자 지정할 수 있음).
<div id="dplayer" style="width: 100%; height: 100%"></div>

3단계: 비디오 파일 객체 주소 가져오기

1. 버킷을 생성합니다.
3. https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.<비디오 형식> 형식의 비디오 파일 객체 주소를 가져옵니다.
설명:
Cross-Origin 액세스가 포함된 경우 CORS 설정을 참고하여 버킷에 대한 CORS를 설정해야 합니다.
버킷 권한이 비공개 읽기/쓰기인 경우 객체 주소에 서명이 있어야 합니다. 자세한 내용은 Request Signature를 참고하십시오.

4단계: 플레이어 초기화 및 COS 동영상 파일 객체 URL 전달

const dp = new DPlayer({
container: document.getElementById('dplayer'),
video: {
url: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4', // COS 비디오 객체 주소
},
});

기능 가이드



다양한 형식의 비디오 파일 재생

1. COS 버킷에 있는 비디오 파일의 객체 주소를 가져옵니다.
설명:
트랜스코딩되지 않은 비디오는 재생 중에 호환성 문제가 발생할 수 있으므로 재생을 위해 비디오를 트랜스코딩하는 것이 좋습니다. CI의 Audio/Video Transcoding 기능을 사용하여 다양한 형식의 비디오 파일을 얻을 수 있습니다.
2. 다른 비디오 형식의 경우 다른 브라우저와의 호환성을 보장하기 위해 해당 종속성을 가져와야 합니다.
MP4: 다른 종속성을 가져올 필요가 없습니다.
HLS: Chrome 및 Firefox와 같은 최신 브라우저에서 HTML5를 통해 HLS 동영상을 재생하려면 tcplayer.min.js를 가져오기 전에 hls.min.js를 가져와야 합니다.
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.1/libs/hls.min.0.13.2m.js"></script>
FLV: Chrome 및 Firefox와 같은 최신 브라우저에서 H5를 통해 FLV 비디오를 재생하려면 tcplayer.min.js를 가져오기 전에 flv.min.js를 가져와야 합니다.
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.2/libs/flv.min.1.6.2.js"></script>
DASH: dash.all.min.js 파일을 가져와야 합니다.
<script src="https://cos-video-1258344699.cos.ap-guangzhou.myqcloud.com/lib/dash.all.min.js"></script>
3. 플레이어를 초기화하고 객체 주소를 전달합니다.
const dp = new DPlayer({
container: document.getElementById('dplayer'),
video: {
url: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4', // COS 비디오 객체 주소
},
});
코드 샘플 가져오기:


PM3U8 비디오 재생

PM3U8은 비공개 M3U8 비디오 파일을 나타냅니다. COS는 비공개 M3U8 TS 리소스를 얻기 위한 다운로드 인증 API를 제공합니다. 자세한 내용은 Private M3U8 API를 참고하십시오.
const dp = new DPlayer({
container: document.getElementById('dplayer'),
// pm3u8에 대한 자세한 내용: https://www.tencentcloud.com/document/product/436/47220
video: {
url: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.m3u8?ci-process=pm3u8&expires=3600' // 비공개 ts 리소스 url에 대한 다운로드 자격 증명의 상대적 유효 기간(3600)
}
});
코드 샘플 가져오기:


썸네일 설정

1. COS 버킷에 있는 썸네일의 객체 주소를 가져옵니다.
주의:
CI의 Intelligent Thumbnail 기능은 최적의 프레임을 추출하여 썸네일을 생성하여 비디오 콘텐츠를 더 매력적으로 만들 수 있습니다.
2. 플레이어를 초기화하고 썸네일 이미지를 설정합니다.
const dp = new DPlayer({
container: document.getElementById('dplayer'),
video: {
url: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4',
pic: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.png',
},
});
코드 샘플 가져오기:


HLS 암호화 비디오 재생

CI는 동영상 콘텐츠의 보안을 확보하고 동영상의 무단 다운로드 및 배포를 방지하기 위해 개인이 읽을 수 있는 파일보다 안전한 HLS 동영상 콘텐츠를 암호화하는 기능을 제공합니다. 암호화된 비디오는 재생 액세스 권한이 없는 사용자에게 배포할 수 없습니다. 다운로드하더라도 여전히 암호화되어 악의적으로 재배포할 수 없습니다. 이렇게 하면 비디오 저작권이 침해되는 것을 방지할 수 있습니다.\n작업 순서는 다음과 같습니다.
1. HLS 암호화 비디오 재생COS 오디오/비디오 실습 | 비디오 암호화를 참고하여 암호화된 비디오를 생성합니다.
2. 플레이어를 초기화하고 비디오 객체 주소를 전달합니다.
const dp = new DPlayer({
container: document.getElementById('dplayer'),
video: {
url: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.m3u8' // 암호화된 비디오 주소
}
});
코드 샘플 가져오기:


다중 해상도 전환

CI의 Adaptive Bitrate Streaming 기능은 비디오를 트랜스코딩하고 이를 어댑티 비트스트림으로 리먹싱하여 출력할 수 있으므로 다양한 네트워크 조건에서 비디오 콘텐츠를 빠르게 배포할 수 있습니다. 플레이어는 현재 대역폭에 따라 비디오를 재생하는 데 가장 적합한 비트레이트를 동적으로 선택할 수 있습니다. 자세한 내용은 COS 오디오/비디오 실습 | 데이터 처리 워크플로로 다중 해상도 비디오 재생을 참고하십시오.
작업 순서는 다음과 같습니다.
1. CI의 Adaptive Bitrate Streaming 기능으로 멀티 비트레이트 어댑티브 HLS 또는 DASH 대상 파일을 생성합니다.
2. 플레이어를 초기화하고 비디오 객체 주소를 전달합니다.
const dp = new DPlayer({
container: document.getElementById('dplayer'),
video: {
url: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.m3u8', // 멀티 비트레이트 HLS/DASH 비디오
},
});
코드 샘플 가져오기:


왼쪽 상단 LOGO 설정

플레이어를 사용하면 왼쪽 상단 모서리에 LOGO를 설정할 수 있습니다.\n작업 순서는 다음과 같습니다.
1. COS 버킷에서 LOGO의 객체 주소를 가져옵니다.
2. 플레이어를 초기화하고 LOGO를 설정합니다.
const dp = new DPlayer({
container: document.getElementById('dplayer'),
video: {
url: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4',
},
logo: 'https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.svg'
});
코드 샘플 가져오기:
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"본문은 \"},{\"children\":[{\"text\":\"DPlayer\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://dplayer.js.org/\",\"props\":{\"type\":\"link\",\"url\":\"https://dplayer.js.org/\"},\"type\":\"ref\"},{\"text\":\"를 \"},{\"children\":[{\"text\":\"Cloud Infinite(CI)\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/1045/46980\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/1045/46980\"},\"type\":\"ref\"},{\"text\":\"의 풍부한 오디오/비디오 기능과 함께 사용하여 Web 브라우저에서 COS에 저장된 비디오 파일을 재생하는 방법을 설명합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"통합 가이드\"}],\"nodeId\":\".ED.86.B5.ED.95.A9-.EA.B0.80.EC.9D.B4.EB.93.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"1단계: 플레이어 스크립트 파일 및 필요한 종속성 파일을 페이지로 가져오기\"}],\"nodeId\":\"1.EB.8B.A8.EA.B3.84.3A-.ED.94.8C.EB.A0.88.EC.9D.B4.EC.96.B4-.EC.8A.A4.ED.81.AC.EB.A6.BD.ED.8A.B8-.ED.8C.8C.EC.9D.BC-.EB.B0.8F-.ED.95.84.EC.9A.94.ED.95.9C-.EC.A2.85.EC.86.8D.EC.84.B1-.ED.8C.8C.EC.9D.BC.EC.9D.84-.ED.8E.98.EC.9D.B4.EC.A7.80.EB.A1.9C-.EA.B0.80.EC.A0.B8.EC.98.A4.EA.B8.B0\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"\\u003c!-- 플레이어 스크립트 파일 --\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cscript src=\\\"https://cdn.jsdelivr.net/npm/dplayer@1.26.0/dist/DPlayer.min.js\\\"\\u003e\\u003c/script\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"플레이어 사용 시 상기 정적 리소스를 직접 배포하는 것을 권장합니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"2단계: 플레이어 컨테이너 노드 설정\"}],\"nodeId\":\"2.EB.8B.A8.EA.B3.84.3A-.ED.94.8C.EB.A0.88.EC.9D.B4.EC.96.B4-.EC.BB.A8.ED.85.8C.EC.9D.B4.EB.84.88-.EB.85.B8.EB.93.9C-.EC.84.A4.EC.A0.95\",\"type\":\"h4\"},{\"children\":[{\"text\":\"플레이어를 표시할 페이지에 플레이어 컨테이너를 추가합니다. 예를 들어 index.html에 다음 코드를 추가합니다(컨테이너 ID와 너비 및 높이를 사용자 지정할 수 있음).\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"\\u003cdiv id=\\\"dplayer\\\" style=\\\"width: 100%; height: 100%\\\"\\u003e\\u003c/div\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"3단계: 비디오 파일 객체 주소 가져오기\"}],\"nodeId\":\"3.EB.8B.A8.EA.B3.84.3A-.EB.B9.84.EB.94.94.EC.98.A4-.ED.8C.8C.EC.9D.BC-.EA.B0.9D.EC.B2.B4-.EC.A3.BC.EC.86.8C-.EA.B0.80.EC.A0.B8.EC.98.A4.EA.B8.B0\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"버킷을 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13309\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13309\"},\"type\":\"ref\"},{\"text\":\"합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"비디오 파일 객체를 업로드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13321\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13321\"},\"type\":\"ref\"},{\"text\":\"합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"code\":1,\"text\":\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.\\u003c비디오 형식\\u003e\"},{\"text\":\" 형식의 비디오 파일 객체 주소를 가져옵니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"Cross-Origin 액세스가 포함된 경우 \"},{\"children\":[{\"text\":\"CORS 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13318\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13318\"},\"type\":\"ref\"},{\"text\":\"을 참고하여 버킷에 대한 CORS를 설정해야 합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"버킷 권한이 비공개 읽기/쓰기인 경우 객체 주소에 서명이 있어야 합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"Request Signature\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7778\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7778\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"start\":false,\"type\":\"uli\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"4단계: 플레이어 초기화 및 COS 동영상 파일 객체 URL 전달\"}],\"nodeId\":\"4.EB.8B.A8.EA.B3.84.3A-.ED.94.8C.EB.A0.88.EC.9D.B4.EC.96.B4-.EC.B4.88.EA.B8.B0.ED.99.94-.EB.B0.8F-cos-.EB.8F.99.EC.98.81.EC.83.81-.ED.8C.8C.EC.9D.BC-.EA.B0.9D.EC.B2.B4-url-.EC.A0.84.EB.8B.AC\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"const dp = new DPlayer({\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" container: document.getElementById('dplayer'),\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" video: {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4', // COS 비디오 객체 주소\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"기능 가이드\"}],\"nodeId\":\".EA.B8.B0.EB.8A.A5-.EA.B0.80.EC.9D.B4.EB.93.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"다양한 형식의 비디오 파일 재생\"}],\"nodeId\":\".EB.8B.A4.EC.96.91.ED.95.9C-.ED.98.95.EC.8B.9D.EC.9D.98-.EB.B9.84.EB.94.94.EC.98.A4-.ED.8C.8C.EC.9D.BC-.EC.9E.AC.EC.83.9D\",\"type\":\"h3\"},{\"children\":[{\"text\":\"COS 버킷에 있는 비디오 파일의 객체 주소를 가져옵니다.\"}],\"nodeId\":\"1\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 트랜스코딩되지 않은 비디오는 재생 중에 호환성 문제가 발생할 수 있으므로 재생을 위해 비디오를 트랜스코딩하는 것이 좋습니다. CI의 \"},{\"children\":[{\"text\":\"Audio/Video Transcoding\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/49543\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/49543\"},\"type\":\"ref\"},{\"text\":\" 기능을 사용하여 다양한 형식의 비디오 파일을 얻을 수 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"다른 비디오 형식의 경우 다른 브라우저와의 호환성을 보장하기 위해 해당 종속성을 가져와야 합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"MP4: 다른 종속성을 가져올 필요가 없습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"HLS: Chrome 및 Firefox와 같은 최신 브라우저에서 HTML5를 통해 HLS 동영상을 재생하려면 tcplayer.min.js를 가져오기 전에 hls.min.js를 가져와야 합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\" \\u003cscript src=\\\"https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.1/libs/hls.min.0.13.2m.js\\\"\\u003e\\u003c/script\\u003e\"}],\"type\":\"code-line\"}],\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"FLV: Chrome 및 Firefox와 같은 최신 브라우저에서 H5를 통해 FLV 비디오를 재생하려면 tcplayer.min.js를 가져오기 전에 flv.min.js를 가져와야 합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\" \\u003cscript src=\\\"https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.2/libs/flv.min.1.6.2.js\\\"\\u003e\\u003c/script\\u003e\"}],\"type\":\"code-line\"}],\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"DASH: dash.all.min.js 파일을 가져와야 합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\" \\u003cscript src=\\\"https://cos-video-1258344699.cos.ap-guangzhou.myqcloud.com/lib/dash.all.min.js\\\"\\u003e\\u003c/script\\u003e\"}],\"type\":\"code-line\"}],\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 객체 주소를 전달합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"const dp = new DPlayer({\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" container: document.getElementById('dplayer'),\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" video: {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4', // COS 비디오 객체 주소\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"MP4 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/mp4.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/mp4.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"FLV 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/flv.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/flv.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"HLS 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/m3u8.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/m3u8.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"DASH 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/dash.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/dash.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"PM3U8 비디오 재생\"}],\"nodeId\":\"pm3u8-.EB.B9.84.EB.94.94.EC.98.A4-.EC.9E.AC.EC.83.9D\",\"type\":\"h3\"},{\"children\":[{\"text\":\"PM3U8은 비공개 M3U8 비디오 파일을 나타냅니다. COS는 비공개 M3U8 TS 리소스를 얻기 위한 다운로드 인증 API를 제공합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"Private M3U8 API\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/47220\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/47220\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"nodeId\":\"2\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\" const dp = new DPlayer({\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" container: document.getElementById('dplayer'),\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" // pm3u8에 대한 자세한 내용: https://intl.cloud.tencent.com/document/product/436/47220\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" video: {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.m3u8?ci-process=pm3u8\\u0026expires=3600' // 비공개 ts 리소스 url에 대한 다운로드 자격 증명의 상대적 유효 기간(3600초)\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"PM3U8 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/pm3u8.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/pm3u8.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"썸네일 설정\"}],\"nodeId\":\".EC.8D.B8.EB.84.A4.EC.9D.BC-.EC.84.A4.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"text\":\"COS 버킷에 있는 썸네일의 객체 주소를 가져옵니다.\"}],\"nodeId\":\"3\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"CI의 \"},{\"children\":[{\"text\":\"Intelligent Thumbnail\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/47740\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/47740\"},\"type\":\"ref\"},{\"text\":\" 기능은 최적의 프레임을 추출하여 썸네일을 생성하여 비디오 콘텐츠를 더 매력적으로 만들 수 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 썸네일 이미지를 설정합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"const dp = new DPlayer({\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" container: document.getElementById('dplayer'),\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" video: {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" pic: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.png',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"썸네일 구성 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/poster.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/poster.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"HLS 암호화 비디오 재생\"}],\"nodeId\":\"hls-.EC.95.94.ED.98.B8.ED.99.94-.EB.B9.84.EB.94.94.EC.98.A4-.EC.9E.AC.EC.83.9D\",\"type\":\"h3\"},{\"children\":[{\"text\":\"CI는 동영상 콘텐츠의 보안을 확보하고 동영상의 무단 다운로드 및 배포를 방지하기 위해 개인이 읽을 수 있는 파일보다 안전한 HLS 동영상 콘텐츠를 암호화하는 기능을 제공합니다. 암호화된 비디오는 재생 액세스 권한이 없는 사용자에게 배포할 수 없습니다. 다운로드하더라도 여전히 암호화되어 악의적으로 재배포할 수 없습니다. 이렇게 하면 비디오 저작권이 침해되는 것을 방지할 수 있습니다.\\n작업 순서는 다음과 같습니다.\"}],\"nodeId\":\"4\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"HLS 암호화 비디오 재생\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/48293\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/48293\"},\"type\":\"ref\"},{\"text\":\" 및 \"},{\"children\":[{\"text\":\"COS 오디오/비디오 실습 | 비디오 암호화\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://mp.weixin.qq.com/s/4f-GKyAG0S-FcZ2BZCn7jA\",\"props\":{\"type\":\"link\",\"url\":\"https://mp.weixin.qq.com/s/4f-GKyAG0S-FcZ2BZCn7jA\"},\"type\":\"ref\"},{\"text\":\"를 참고하여 암호화된 비디오를 생성합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 비디오 객체 주소를 전달합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\" const dp = new DPlayer({\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"container: document.getElementById('dplayer'),\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"video: {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.m3u8' // 암호화된 비디오 주소\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"HLS 암호화 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/m3u8.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/m3u8.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"다중 해상도 전환\"}],\"nodeId\":\".EB.8B.A4.EC.A4.91-.ED.95.B4.EC.83.81.EB.8F.84-.EC.A0.84.ED.99.98\",\"type\":\"h3\"},{\"children\":[{\"text\":\"CI의 \"},{\"children\":[{\"text\":\"Adaptive Bitrate Streaming\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/47745\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/47745\"},\"type\":\"ref\"},{\"text\":\" 기능은 비디오를 트랜스코딩하고 이를 어댑티 비트스트림으로 리먹싱하여 출력할 수 있으므로 다양한 네트워크 조건에서 비디오 콘텐츠를 빠르게 배포할 수 있습니다. 플레이어는 현재 대역폭에 따라 비디오를 재생하는 데 가장 적합한 비트레이트를 동적으로 선택할 수 있습니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"COS 오디오/비디오 실습 | 데이터 처리 워크플로로 다중 해상도 비디오 재생\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://mp.weixin.qq.com/s/THUhur1FV_55T9zzqT2MFQ\",\"props\":{\"type\":\"link\",\"url\":\"https://mp.weixin.qq.com/s/THUhur1FV_55T9zzqT2MFQ\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"nodeId\":\"5\",\"type\":\"p\"},{\"children\":[{\"text\":\"작업 순서는 다음과 같습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"CI의 \"},{\"children\":[{\"text\":\"Adaptive Bitrate Streaming\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/47745\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/47745\"},\"type\":\"ref\"},{\"text\":\" 기능으로 멀티 비트레이트 어댑티브 HLS 또는 DASH 대상 파일을 생성합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 비디오 객체 주소를 전달합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"const dp = new DPlayer({\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" container: document.getElementById('dplayer'),\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" video: {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.m3u8', // 멀티 비트레이트 HLS/DASH 비디오\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"해상도 전환 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/multiDefinition.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/multiDefinition.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"왼쪽 상단 LOGO 설정\"}],\"nodeId\":\".EC.99.BC.EC.AA.BD-.EC.83.81.EB.8B.A8-logo-.EC.84.A4.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"text\":\"플레이어를 사용하면 왼쪽 상단 모서리에 LOGO를 설정할 수 있습니다.\\n작업 순서는 다음과 같습니다.\"}],\"nodeId\":\"6\",\"type\":\"p\"},{\"children\":[{\"text\":\"COS 버킷에서 LOGO의 객체 주소를 가져옵니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 LOGO를 설정합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"const dp = new DPlayer({\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" container: document.getElementById('dplayer'),\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" video: {\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4',\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" logo: 'https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.svg'\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"좌측 상단 LOGO 설정 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/logo.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/dplayer/logo.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"}]"}},"53813":{"categoryId":436,"weight":50,"type":"page","extension":"","pid":48291,"id":53813,"lang":"ko","title":"VideojsPlayer를 사용하여 COS에서 비디오 재생","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2023-03-14 22:29:03","recentReleaseTime":"2023-03-14 22:29:03","content":{"title":"VideojsPlayer를 사용하여 COS에서 비디오 재생","body":"

소개

본문은 VideojsPlayerCloud Infinite (CI)의 풍부한 오디오/비디오 기능과 함께 사용하여 Web 브라우저에서 COS에 저장된 비디오 파일을 재생하는 방법을 설명합니다.

통합 가이드

1단계: 플레이어 양식 및 스크립트 파일을 페이지로 가져오기

<!-- 플레이어 양식 파일 -->
<link href="https://vjs.zencdn.net/7.19.2/video-js.css" rel="stylesheet" />
<!-- 플레이어 스크립트 파일 -->
<script src="https://vjs.zencdn.net/7.19.2/video.min.js"></script>
설명:
플레이어 사용 시 위의 정적 리소스를 직접 배포하는 것을 권장합니다.

2단계: 플레이어 컨테이너 노드 설정

플레이어를 표시할 페이지에 플레이어 컨테이너를 추가합니다. 예를 들어 index.html에 다음 코드를 추가합니다(컨테이너 ID와 너비 및 높이를 사용자 지정할 수 있음).
<video
id="my-video"
class="video-js"
controls
preload="auto"
width="100%"
height="100%"
data-setup="{}"
></video>

3단계: 비디오 파일 객체 주소 가져오기

1. 버킷을 생성합니다.
3. https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.<비디오 형식> 형식의 비디오 파일 객체 주소를 가져옵니다.
설명:
Cross-Origin 액세스가 포함된 경우 CORS 설정을 참고하여 버킷에 대한 CORS를 설정해야 합니다.
버킷 권한이 비공개 읽기/쓰기인 경우 객체 주소에 서명이 있어야 합니다. 자세한 내용은 Request Signature를 참고하십시오.

4단계: 플레이어 컨테이너에 비디오 주소를 설정하고 COS 비디오 파일 객체 URL을 전달합니다.

<video
id="my-video"
class="video-js"
controls
preload="auto"
width="100%"
height="100%"
data-setup="{}"
>
<source
src="https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4"
type="video/mp4"
/>
</video>

기능 가이드



다양한 형식의 비디오 파일 재생

1. COS 버킷에 있는 비디오 파일의 객체 주소를 가져옵니다.
설명:
트랜스코딩되지 않은 비디오는 재생 중에 호환성 문제가 발생할 수 있으므로 재생을 위해 비디오를 트랜스코딩하는 것이 좋습니다. CI의 Audio/Video Transcoding 기능을 사용하여 다양한 형식의 비디오 파일을 얻을 수 있습니다.
2. 다른 비디오 형식의 경우 다른 브라우저와의 호환성을 보장하기 위해 해당 종속성을 가져와야 합니다.
MP4: 다른 종속성을 가져올 필요가 없습니다.
HLS: Chrome 및 Firefox와 같은 최신 브라우저에서 HTML5를 통해 HLS 동영상을 재생하려면 tcplayer.min.js를 가져오기 전에 hls.min.js를 가져와야 합니다.
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.1/libs/hls.min.0.13.2m.js"></script>
FLV: Chrome 및 Firefox와 같은 최신 브라우저에서 H5를 통해 FLV 비디오를 재생하려면 tcplayer.min.js를 가져오기 전에 flv.min.js를 가져와야 합니다.
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.2/libs/flv.min.1.6.2.js"></script>
DASH: dash.all.min.js 파일을 가져와야 합니다.
<script src="https://cos-video-1258344699.cos.ap-guangzhou.myqcloud.com/lib/dash.all.min.js"></script>
3. 플레이어를 초기화하고 객체 주소를 전달합니다.
<!-- MP4 -->
<source
src="https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4"
type="video/mp4"
/>

<!-- HLS -->
<source
src="https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.m3u8"
type="application/x-mpegURL"
/>

<!-- FLV -->
<source
src="https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.flv"
type="video/x-flv"
/>

<!-- DASH -->
<source
src="https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mpd"
type="application/dash+xml"
/>
코드 샘플 가져오기:


PM3U8 비디오 재생

PM3U8은 개인 M3U8 비디오 파일을 나타냅니다. COS는 개인 M3U8 TS 리소스를 가져오기 위한 다운로드 권한 API를 제공합니다. 자세한 내용은 Private M3U8 API를 참고하십시오.
<source
src="https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.m3u8?ci-process=pm3u8&expires=3600"
type="application/x-mpegURL"
/>
코드 샘플 가져오기:


썸네일 설정

1. COS 버킷에 있는 썸네일의 객체 주소를 가져옵니다.
주의:
CI의 Intelligent Thumbnail 기능은 최적의 프레임을 추출하여 썸네일을 생성하여 비디오 콘텐츠를 더 매력적으로 만들 수 있습니다.
2. 플레이어를 초기화하고 썸네일 이미지를 설정합니다.
<video
id="my-video"
class="video-js"
controls
preload="auto"
width="100%"
height="100%"
data-setup="{}"
poster="https://<BucketName-APPID>.cos.<Region>.myqcloud.com/poster.png"
>
<source
src="https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4"
type="video/mp4"
/>
</video>
코드 샘플 가져오기:


HLS 암호화 비디오 재생

CI는 동영상 콘텐츠의 보안을 확보하고 동영상의 무단 다운로드 및 배포를 방지하기 위해 개인이 읽을 수 있는 파일보다 안전한 HLS 동영상 콘텐츠를 암호화하는 기능을 제공합니다. 암호화된 비디오는 재생 액세스 권한이 없는 사용자에게 배포할 수 없습니다. 다운로드하더라도 여전히 암호화되어 악의적으로 재배포할 수 없습니다. 이렇게 하면 비디오 저작권이 침해되는 것을 방지할 수 있습니다.\n작업 순서는 다음과 같습니다.
1. HLS 암호화 비디오 재생COS 오디오/비디오 실습 | 비디오 암호화를 참고하여 암호화된 비디오를 생성합니다.
2. 플레이어를 초기화하고 비디오 객체 주소를 전달합니다.
<source
src="https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.m3u8"
type="application/x-mpegURL"
/>
코드 샘플 가져오기:
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"본문은 \"},{\"children\":[{\"text\":\"VideojsPlayer\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://videojs.com/\",\"props\":{\"type\":\"link\",\"url\":\"https://videojs.com/\"},\"type\":\"ref\"},{\"text\":\"를 \"},{\"children\":[{\"text\":\"Cloud Infinite (CI)\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/1045/46980\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/1045/46980\"},\"type\":\"ref\"},{\"text\":\"의 풍부한 오디오/비디오 기능과 함께 사용하여 Web 브라우저에서 COS에 저장된 비디오 파일을 재생하는 방법을 설명합니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"통합 가이드\"}],\"nodeId\":\".ED.86.B5.ED.95.A9-.EA.B0.80.EC.9D.B4.EB.93.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"1단계: 플레이어 양식 및 스크립트 파일을 페이지로 가져오기\"}],\"nodeId\":\"1.EB.8B.A8.EA.B3.84.3A-.ED.94.8C.EB.A0.88.EC.9D.B4.EC.96.B4-.EC.96.91.EC.8B.9D-.EB.B0.8F-.EC.8A.A4.ED.81.AC.EB.A6.BD.ED.8A.B8-.ED.8C.8C.EC.9D.BC.EC.9D.84-.ED.8E.98.EC.9D.B4.EC.A7.80.EB.A1.9C-.EA.B0.80.EC.A0.B8.EC.98.A4.EA.B8.B0\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"\\u003c!-- 플레이어 양식 파일 --\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003clink href=\\\"https://vjs.zencdn.net/7.19.2/video-js.css\\\" rel=\\\"stylesheet\\\" /\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c!-- 플레이어 스크립트 파일 --\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003cscript src=\\\"https://vjs.zencdn.net/7.19.2/video.min.js\\\"\\u003e\\u003c/script\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"플레이어 사용 시 위의 정적 리소스를 직접 배포하는 것을 권장합니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"2단계: 플레이어 컨테이너 노드 설정\"}],\"nodeId\":\"2.EB.8B.A8.EA.B3.84.3A-.ED.94.8C.EB.A0.88.EC.9D.B4.EC.96.B4-.EC.BB.A8.ED.85.8C.EC.9D.B4.EB.84.88-.EB.85.B8.EB.93.9C-.EC.84.A4.EC.A0.95\",\"type\":\"h4\"},{\"children\":[{\"text\":\"플레이어를 표시할 페이지에 플레이어 컨테이너를 추가합니다. 예를 들어 index.html에 다음 코드를 추가합니다(컨테이너 ID와 너비 및 높이를 사용자 지정할 수 있음).\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"\\u003cvideo\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" id=\\\"my-video\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" class=\\\"video-js\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" controls\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" preload=\\\"auto\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" width=\\\"100%\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" height=\\\"100%\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" data-setup=\\\"{}\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003e\\u003c/video\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"3단계: 비디오 파일 객체 주소 가져오기\"}],\"nodeId\":\"3.EB.8B.A8.EA.B3.84.3A-.EB.B9.84.EB.94.94.EC.98.A4-.ED.8C.8C.EC.9D.BC-.EA.B0.9D.EC.B2.B4-.EC.A3.BC.EC.86.8C-.EA.B0.80.EC.A0.B8.EC.98.A4.EA.B8.B0\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"버킷을 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13309\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13309\"},\"type\":\"ref\"},{\"text\":\"합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"비디오 파일 객체를 업로드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13321\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13321\"},\"type\":\"ref\"},{\"text\":\"합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"code\":1,\"text\":\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.\\u003c비디오 형식\\u003e\"},{\"text\":\" 형식의 비디오 파일 객체 주소를 가져옵니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"Cross-Origin 액세스가 포함된 경우 \"},{\"children\":[{\"text\":\"CORS 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13318\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13318\"},\"type\":\"ref\"},{\"text\":\"을 참고하여 버킷에 대한 CORS를 설정해야 합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"버킷 권한이 비공개 읽기/쓰기인 경우 객체 주소에 서명이 있어야 합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"Request Signature\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/7778\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/7778\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"start\":false,\"type\":\"uli\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"4단계: 플레이어 컨테이너에 비디오 주소를 설정하고 COS 비디오 파일 객체 URL을 전달합니다.\"}],\"nodeId\":\"4.EB.8B.A8.EA.B3.84.3A-.ED.94.8C.EB.A0.88.EC.9D.B4.EC.96.B4-.EC.BB.A8.ED.85.8C.EC.9D.B4.EB.84.88.EC.97.90-.EB.B9.84.EB.94.94.EC.98.A4-.EC.A3.BC.EC.86.8C.EB.A5.BC-.EC.84.A4.EC.A0.95.ED.95.98.EA.B3.A0-cos-.EB.B9.84.EB.94.94.EC.98.A4-.ED.8C.8C.EC.9D.BC-.EA.B0.9D.EC.B2.B4-url.EC.9D.84-.EC.A0.84.EB.8B.AC.ED.95.A9.EB.8B.88.EB.8B.A4.\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"\\u003cvideo\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" id=\\\"my-video\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" class=\\\"video-js\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" controls\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" preload=\\\"auto\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" width=\\\"100%\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" height=\\\"100%\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" data-setup=\\\"{}\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003csource\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" src=\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" type=\\\"video/mp4\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" /\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/video\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"기능 가이드\"}],\"nodeId\":\".EA.B8.B0.EB.8A.A5-.EA.B0.80.EC.9D.B4.EB.93.9C\",\"type\":\"h2\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"다양한 형식의 비디오 파일 재생\"}],\"nodeId\":\".EB.8B.A4.EC.96.91.ED.95.9C-.ED.98.95.EC.8B.9D.EC.9D.98-.EB.B9.84.EB.94.94.EC.98.A4-.ED.8C.8C.EC.9D.BC-.EC.9E.AC.EC.83.9D\",\"type\":\"h3\"},{\"children\":[{\"text\":\"COS 버킷에 있는 비디오 파일의 객체 주소를 가져옵니다.\"}],\"nodeId\":\"1\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 트랜스코딩되지 않은 비디오는 재생 중에 호환성 문제가 발생할 수 있으므로 재생을 위해 비디오를 트랜스코딩하는 것이 좋습니다. CI의 \"},{\"children\":[{\"text\":\"Audio/Video Transcoding\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/49543\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/49543\"},\"type\":\"ref\"},{\"text\":\" 기능을 사용하여 다양한 형식의 비디오 파일을 얻을 수 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"다른 비디오 형식의 경우 다른 브라우저와의 호환성을 보장하기 위해 해당 종속성을 가져와야 합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"MP4: 다른 종속성을 가져올 필요가 없습니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"HLS: Chrome 및 Firefox와 같은 최신 브라우저에서 HTML5를 통해 HLS 동영상을 재생하려면 tcplayer.min.js를 가져오기 전에 hls.min.js를 가져와야 합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\" \\u003cscript src=\\\"https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.1/libs/hls.min.0.13.2m.js\\\"\\u003e\\u003c/script\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"FLV: Chrome 및 Firefox와 같은 최신 브라우저에서 H5를 통해 FLV 비디오를 재생하려면 tcplayer.min.js를 가져오기 전에 flv.min.js를 가져와야 합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\" \\u003cscript src=\\\"https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.2/libs/flv.min.1.6.2.js\\\"\\u003e\\u003c/script\\u003e\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"DASH: dash.all.min.js 파일을 가져와야 합니다.\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\" \\u003cscript src=\\\"https://cos-video-1258344699.cos.ap-guangzhou.myqcloud.com/lib/dash.all.min.js\\\"\\u003e\\u003c/script\\u003e\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 객체 주소를 전달합니다.\"}],\"indent\":0,\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"\\u003c!-- MP4 --\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003csource\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" src=\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" type=\\\"video/mp4\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"/\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c!-- HLS --\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003csource\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" src=\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.m3u8\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" type=\\\"application/x-mpegURL\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"/\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c!-- FLV --\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003csource\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" src=\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.flv\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" type=\\\"video/x-flv\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"/\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c!-- DASH --\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003csource\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" src=\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mpd\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" type=\\\"application/dash+xml\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"/\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"MP4 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/mp4.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/mp4.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"FLV 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/flv.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/flv.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"HLS 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/m3u8.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/m3u8.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"DASH 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/dash.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/dash.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"PM3U8 비디오 재생\"}],\"nodeId\":\"pm3u8-.EB.B9.84.EB.94.94.EC.98.A4-.EC.9E.AC.EC.83.9D\",\"type\":\"h3\"},{\"children\":[{\"text\":\"PM3U8은 개인 M3U8 비디오 파일을 나타냅니다. COS는 개인 M3U8 TS 리소스를 가져오기 위한 다운로드 권한 API를 제공합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"Private M3U8 API\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/47220\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/47220\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"nodeId\":\"2\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"\\u003csource\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" src=\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.m3u8?ci-process=pm3u8\\u0026expires=3600\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" type=\\\"application/x-mpegURL\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"/\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"PM3U8 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/pm3u8.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/pm3u8.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"썸네일 설정\"}],\"nodeId\":\".EC.8D.B8.EB.84.A4.EC.9D.BC-.EC.84.A4.EC.A0.95\",\"type\":\"h3\"},{\"children\":[{\"text\":\"COS 버킷에 있는 썸네일의 객체 주소를 가져옵니다.\"}],\"nodeId\":\"3\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"CI의 \"},{\"children\":[{\"text\":\"Intelligent Thumbnail\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/47740\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/47740\"},\"type\":\"ref\"},{\"text\":\" 기능은 최적의 프레임을 추출하여 썸네일을 생성하여 비디오 콘텐츠를 더 매력적으로 만들 수 있습니다.\"}],\"type\":\"p\"}],\"hintType\":\"alert\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 썸네일 이미지를 설정합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"\\u003cvideo\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" id=\\\"my-video\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" class=\\\"video-js\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" controls\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" preload=\\\"auto\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" width=\\\"100%\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" height=\\\"100%\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" data-setup=\\\"{}\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" poster=\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/poster.png\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\u003csource\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" src=\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.mp4\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" type=\\\"video/mp4\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" /\\u003e\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"\\u003c/video\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"썸네일 구성 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/poster.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/poster.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"HLS 암호화 비디오 재생\"}],\"nodeId\":\"hls-.EC.95.94.ED.98.B8.ED.99.94-.EB.B9.84.EB.94.94.EC.98.A4-.EC.9E.AC.EC.83.9D\",\"type\":\"h3\"},{\"children\":[{\"text\":\"CI는 동영상 콘텐츠의 보안을 확보하고 동영상의 무단 다운로드 및 배포를 방지하기 위해 개인이 읽을 수 있는 파일보다 안전한 HLS 동영상 콘텐츠를 암호화하는 기능을 제공합니다. 암호화된 비디오는 재생 액세스 권한이 없는 사용자에게 배포할 수 없습니다. 다운로드하더라도 여전히 암호화되어 악의적으로 재배포할 수 없습니다. 이렇게 하면 비디오 저작권이 침해되는 것을 방지할 수 있습니다.\\n작업 순서는 다음과 같습니다.\"}],\"nodeId\":\"4\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"HLS 암호화 비디오 재생\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/48293\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/48293\"},\"type\":\"ref\"},{\"text\":\" 및 \"},{\"children\":[{\"text\":\"COS 오디오/비디오 실습 | 비디오 암호화\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://mp.weixin.qq.com/s/4f-GKyAG0S-FcZ2BZCn7jA\",\"props\":{\"type\":\"link\",\"url\":\"https://mp.weixin.qq.com/s/4f-GKyAG0S-FcZ2BZCn7jA\"},\"type\":\"ref\"},{\"text\":\"를 참고하여 암호화된 비디오를 생성합니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"플레이어를 초기화하고 비디오 객체 주소를 전달합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"\\u003csource\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" src=\\\"https://\\u003cBucketName-APPID\\u003e.cos.\\u003cRegion\\u003e.myqcloud.com/xxx.m3u8\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\" type=\\\"application/x-mpegURL\\\"\"}],\"type\":\"code-line\"},{\"children\":[{\"text\":\"/\\u003e\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"코드 샘플 가져오기:\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"HLS 암호화 재생 샘플 코드\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/m3u8.html\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/blob/main/cos-video/examples/web/videojs/m3u8.html\"},\"type\":\"ref\"}],\"start\":false,\"type\":\"uli\"}]"}},"53924":{"categoryId":436,"weight":45,"type":"page","extension":"","pid":34079,"id":53924,"lang":"ko","title":"COS에 Ghost 첨부 파일 저장하기","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2023-03-14 23:56:49","recentReleaseTime":"2023-03-14 23:56:49","content":{"title":"COS에 Ghost 첨부 파일 저장하기","body":"

소개

Ghost는 블로그 웹 사이트를 빠르게 구축하기 위한 Node.js 기반 프레임워크입니다. 공식 cli 툴을 사용하여 개인 웹사이트를 빠르게 생성하고 CVM 또는 Docker에 배포할 수 있습니다.
블로그 사이트로서 첨부파일 업로드는 필수 기능입니다. Ghost는 기본적으로 첨부 파일을 로컬에 저장합니다. 이 문서는 플러그인을 통해 COS(Cloud Object Storage)에 첨부 파일을 저장하는 방법을 설명합니다. COS에 포럼 첨부 파일을 저장하면 다음과 같은 이점이 있습니다.
첨부 파일의 신뢰성이 높아집니다.
포럼 첨부 파일을 위해 서버에 추가 스토리지 용량을 준비할 필요가 없습니다.
다운스트림 대역폭을 차지하거나 자신의 서버에서 트래픽을 증가시키는 대신 COS 서버를 통해 이미지 첨부 파일에 더 빠르게 액세스합니다.
Content Delivery Network(CDN)을 통해 이미지 첨부 파일에 대한 포럼 사용자 액세스를 가속화할 수 있습니다.

준비 작업

Ghost 웹사이트 구축

1. Node.js 환경을 설치합니다.
2. ghost-cli를 설치합니다.
npm install ghost-cli@latest -g
3. 프로젝트를 생성하고 프로젝트의 루트 디렉터리에서 다음 명령을 실행합니다.
ghost install local
성공적으로 생성된 후 프로젝트 구조는 다음과 같습니다.\n
\"\"


4. 브라우저를 열고 localhost:2368에 액세스합니다. 가입 페이지에서 계정에 가입하고 관리 백엔드로 이동합니다.\n
\"\"



COS 버킷 생성

1. COS 콘솔에서 버킷 생성에 설명된 대로 공개 읽기/비공개 쓰기 액세스 권한의 버킷을 생성합니다. 자세한 내용은 버킷 생성을 참고하십시오.
2. **보안 관리 > CORS(Cross-Origin Resource Sharing)**를 클릭하고 CORS 설정에 설명된 대로 CORS 구성을 추가합니다. 다음 구성을 사용하여 디버깅을 용이하게 할 수 있습니다.

Ghost를 COS 버킷과 연결

주의:
리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한의 원칙 설명을 따르는 것이 좋습니다. 서브 계정 키를 가져오는 방법에 대한 자세한 내용은 액세스 키를 참고하십시오.
1. Ghost 프로젝트의 루트 디렉터리에 있는 config.development.json 구성 파일에 다음 구성을 추가합니다.
"storage": {
"active": "ghost-cos-store",
"ghost-cos-store": {
"BasePath": "ghost/", // 디렉터리 이름으로 변경할 수 있습니다. 비워두면 기본적으로 루트 디렉터리가 사용됩니다.
"SecretId": "AKID*************",
"SecretKey": "***************",
"Bucket": "xxx-125********",
"Region": "**-*******"
}
}
매개변수 설명은 다음과 같습니다.
설정 항목
설정 항목
BasePath
파일이 저장되는 COS 경로입니다. 필요에 따라 수정할 수 있습니다. 비워두면 기본적으로 루트 디렉터리가 사용됩니다.
SecretId
API Key 관리페이지에서 생성 및 획득할 수 있는 액세스 키 정보입니다.
SecretKey
API Key 관리페이지에서 생성 및 획득할 수 있는 액세스 키 정보입니다.
Bucket
examplebucket-1250000000과 같이 버킷 생성 중에 사용자 정의된 이름입니다.
Region
버킷 생성 중에 선택한 리전입니다.
2. 사용자 지정 스토리지 디렉터리를 생성하고 프로젝트의 루트 디렉터리에서 다음 명령을 실행합니다.
mkdir -p content/adapters/storage
3. Tencent Cloud에서 제공하는 ghost-cos-store 플러그인을 설치합니다.
3.1 npm을 통해 설치합니다.
npm install ghost-cos-store
3.2 storage 디렉터리에 다음 콘텐츠가 포함된 ghost-cos-store.js 파일을 생성합니다.
// content/adapters/storage/ghost-cos-store.js
module.exports = require('ghost-cos-store');
3.3 git clone을 통해 실행합니다.
cd content/adapters/storage
git clone https://github.com/tencentyun/ghost-cos-store.git
cd ghost-cos-store
npm i
3.4 설치 후 Ghost를 다시 시작합니다.
ghost restart

게시물 게시 및 업로드 테스트

1. Ghost 콘솔에서 +를 클릭하여 게시물을 게시합니다.\n
\"\"


2. +를 클릭하여 이미지를 업로드합니다. 브라우저에서 캡처한 패킷에서 upload 요청이 성공하고 이미지의 COS URL이 반환되는 것을 확인할 수 있습니다.
","recentReleaseTime":"2024-06-24 16:53:18","slate":"[{\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".EC.86.8C.EA.B0.9C\",\"type\":\"h2\",\"id\":\"dGCY43eeuWFJOwGAm2Dw3\"},{\"children\":[{\"children\":[{\"text\":\"Ghost\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://ghost.org/docs\",\"props\":{\"type\":\"link\",\"url\":\"https://ghost.org/docs\"},\"type\":\"ref\",\"id\":\"vru2u6nssB4SOnCx78wem\"},{\"text\":\"는 블로그 웹 사이트를 빠르게 구축하기 위한 Node.js 기반 프레임워크입니다. 공식 cli 툴을 사용하여 개인 웹사이트를 빠르게 생성하고 CVM 또는 Docker에 배포할 수 있습니다.\"}],\"type\":\"p\",\"id\":\"E2H8TuTBwjl1GiNIcZEms\"},{\"children\":[{\"text\":\"블로그 사이트로서 첨부파일 업로드는 필수 기능입니다. Ghost는 기본적으로 첨부 파일을 로컬에 저장합니다. 이 문서는 플러그인을 통해 \"},{\"children\":[{\"text\":\"COS(Cloud Object Storage)\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/products/cos\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/products/cos\"},\"type\":\"ref\",\"id\":\"f4NOkNNmfQOiij5fdTFow\"},{\"text\":\"에 첨부 파일을 저장하는 방법을 설명합니다. COS에 포럼 첨부 파일을 저장하면 다음과 같은 이점이 있습니다.\"}],\"type\":\"p\",\"id\":\"p496CgPiv-VuuHnlzKkq-\"},{\"children\":[{\"text\":\"첨부 파일의 신뢰성이 높아집니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"o0IVM2AMuSLplg5WtYgkx\"},{\"children\":[{\"text\":\"포럼 첨부 파일을 위해 서버에 추가 스토리지 용량을 준비할 필요가 없습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"VbgKDmv-buPWYAAD9p31C\"},{\"children\":[{\"text\":\"다운스트림 대역폭을 차지하거나 자신의 서버에서 트래픽을 증가시키는 대신 COS 서버를 통해 이미지 첨부 파일에 더 빠르게 액세스합니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"R9oxfYzGVW_9Z7eujcgyt\"},{\"children\":[{\"children\":[{\"text\":\"Content Delivery Network(CDN)\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/products/cdn\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/products/cdn\"},\"type\":\"ref\",\"id\":\"BsiJWGqqEXasGZLtkxZ-w\"},{\"text\":\"을 통해 이미지 첨부 파일에 대한 포럼 사용자 액세스를 가속화할 수 있습니다.\"}],\"start\":false,\"type\":\"uli\",\"id\":\"-ZDyrIfuy4agmSYKMMgB_\"},{\"children\":[{\"text\":\"준비 작업\"}],\"nodeId\":\".EC.A4.80.EB.B9.84-.EC.9E.91.EC.97.85\",\"type\":\"h2\",\"id\":\"_W5y63Z5r4AiYzEGaYbxT\"},{\"children\":[{\"text\":\"Ghost 웹사이트 구축\"}],\"nodeId\":\"ghost-.EC.9B.B9.EC.82.AC.EC.9D.B4.ED.8A.B8-.EA.B5.AC.EC.B6.95\",\"type\":\"h3\",\"id\":\"ME9lJjXdu0EPoLp8gOdMT\"},{\"children\":[{\"children\":[{\"text\":\"Node.js\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://nodejs.org/en/download/\",\"props\":{\"type\":\"link\",\"url\":\"https://nodejs.org/en/download/\"},\"type\":\"ref\",\"id\":\"F9A3W2oqA2ZaPjlrAxXdg\"},{\"text\":\" 환경을 설치합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"JL0QyyP4KSAHFk1rwuhJg\"},{\"children\":[{\"text\":\"ghost-cli를 설치합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"lkhbiyUdI3YmEGLxsktlS\"},{\"children\":[{\"children\":[{\"text\":\"npm install ghost-cli@latest -g\"}],\"type\":\"code-line\",\"id\":\"qu10NO3rdit6ss8n3NT9Z\"}],\"indent\":1,\"language\":\"js\",\"type\":\"code-block\",\"id\":\"IIGukIN6WSh1oX2UKMd-P\",\"autoWrap\":false},{\"children\":[{\"text\":\"프로젝트를 생성하고 프로젝트의 루트 디렉터리에서 다음 명령을 실행합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"obtONjdOSmZBaU_wLMckq\"},{\"children\":[{\"children\":[{\"text\":\"ghost install local\"}],\"type\":\"code-line\",\"id\":\"CtN9IBdPfvFawpfxAzuIZ\"}],\"indent\":1,\"language\":\"js\",\"type\":\"code-block\",\"id\":\"AUzAEzbHdfkQ_TJFtkxjl\",\"autoWrap\":false},{\"children\":[{\"text\":\"성공적으로 생성된 후 프로젝트 구조는 다음과 같습니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/554107ca292211ef94525254005f7176.jpeg\",\"id\":\"9YTEWpx5kQN27wC5Q7ccK\",\"naturalSize\":[377,231],\"size\":[377,231]},{\"text\":\"\"}],\"indent\":1,\"type\":\"p\",\"id\":\"HTxmksjh0RP2-VCGjA5U1\"},{\"children\":[{\"text\":\"브라우저를 열고 localhost:2368에 액세스합니다. 가입 페이지에서 계정에 가입하고 관리 백엔드로 이동합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/554f726e292211ef9dd5525400441de3.jpeg\",\"id\":\"H3poB_8CVnCGgrrSL5zlM\",\"naturalSize\":[1107,818],\"size\":[586,433]},{\"text\":\"\"}],\"start\":false,\"type\":\"oli\",\"id\":\"Fjwqg50auaDrjJw3Nc6SC\"},{\"children\":[{\"text\":\"COS 버킷 생성\"}],\"nodeId\":\"cos-.EB.B2.84.ED.82.B7-.EC.83.9D.EC.84.B1\",\"type\":\"h3\",\"id\":\"AzZEIgW9w0EDOCRDnJ-Zq\"},{\"children\":[{\"children\":[{\"text\":\"COS 콘솔\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos/bucket\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos/bucket\"},\"type\":\"ref\",\"id\":\"UXQDME4tLXcobGK2iAeOf\"},{\"text\":\"에서 버킷 생성에 설명된 대로 \"},{\"b\":1,\"text\":\"공개 읽기/비공개 쓰기\"},{\"text\":\" 액세스 권한의 버킷을 생성합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13309\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13309\"},\"type\":\"ref\",\"id\":\"7D1qsrIQ8aJT4Yyy25cVJ\"},{\"text\":\"을 참고하십시오.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"JAwqBZTbfskBrlu9tHFKB\"},{\"children\":[{\"text\":\"**보안 관리 > CORS(Cross-Origin Resource Sharing)**를 클릭하고 \"},{\"children\":[{\"text\":\"CORS 설정\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/13318\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/13318\"},\"type\":\"ref\",\"id\":\"QItCWLwWlTzZJNeMmmu1b\"},{\"text\":\"에 설명된 대로 CORS 구성을 추가합니다. 다음 구성을 사용하여 디버깅을 용이하게 할 수 있습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"4mGbDBG9i0Q1UqDT0WkhU\"},{\"children\":[{\"text\":\"Ghost를 COS 버킷과 연결\"}],\"nodeId\":\"ghost.EB.A5.BC-cos-.EB.B2.84.ED.82.B7.EA.B3.BC-.EC.97.B0.EA.B2.B0\",\"type\":\"h2\",\"id\":\"RESQP6mv8Gm5wPgtLCt1Z\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"3HqWk0N2lYAE6HsaguqKR\"},{\"children\":[{\"text\":\"리스크를 줄이기 위해 서브 계정 키를 사용하고 \"},{\"children\":[{\"text\":\"최소 권한의 원칙 설명\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/436/32972\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/436/32972\"},\"type\":\"ref\",\"id\":\"QdNvoCt7-i-JgRtp4XCua\"},{\"text\":\"을 따르는 것이 좋습니다. 서브 계정 키를 가져오는 방법에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"액세스 키\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/598/32675\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/598/32675\"},\"type\":\"ref\",\"id\":\"7WuXRtt1N9kzd9fE6eOHH\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\",\"id\":\"6OPVw7o3gcoHURezaJ-4l\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"eo7TSjFeKB8WktqEWtz0f\"},{\"children\":[{\"text\":\"Ghost 프로젝트의 루트 디렉터리에 있는 config.development.json 구성 파일에 다음 구성을 추가합니다.\"}],\"start\":true,\"type\":\"oli\",\"id\":\"mecC7gEvCRahEKaienVIK\"},{\"children\":[{\"children\":[{\"text\":\" \\\"storage\\\": {\"}],\"type\":\"code-line\",\"id\":\"KY9wkxG_qJRNqcia_Ct-H\"},{\"children\":[{\"text\":\" \\\"active\\\": \\\"ghost-cos-store\\\",\"}],\"type\":\"code-line\",\"id\":\"zfovo1wEPK0-unp27uW7k\"},{\"children\":[{\"text\":\" \\\"ghost-cos-store\\\": { \"}],\"type\":\"code-line\",\"id\":\"tw600IlflMLzX1Tb1TZGV\"},{\"children\":[{\"text\":\" \\\"BasePath\\\": \\\"ghost/\\\", // 디렉터리 이름으로 변경할 수 있습니다. 비워두면 기본적으로 루트 디렉터리가 사용됩니다. \"}],\"type\":\"code-line\",\"id\":\"zmDxCNaSUXirshyg2EAtN\"},{\"children\":[{\"text\":\" \\\"SecretId\\\": \\\"AKID*************\\\",\"}],\"type\":\"code-line\",\"id\":\"vxr1CdDAG0S-fRSxw_LZp\"},{\"children\":[{\"text\":\" \\\"SecretKey\\\": \\\"***************\\\",\"}],\"type\":\"code-line\",\"id\":\"qJ8bxkAYVzDP-kaao02VS\"},{\"children\":[{\"text\":\" \\\"Bucket\\\": \\\"xxx-125********\\\", \"}],\"type\":\"code-line\",\"id\":\"XNsW0m2_PN_pmZY9DHszH\"},{\"children\":[{\"text\":\" \\\"Region\\\": \\\"**-*******\\\"\"}],\"type\":\"code-line\",\"id\":\"lDS51qNZcTPy6xM5ARXVt\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"tOmUXJu3Y5lk7ChKA6MvM\"},{\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\",\"id\":\"QzR63afqcpJ17b-ZIpHsv\"}],\"indent\":1,\"language\":\"json\",\"type\":\"code-block\",\"id\":\"pMxxKMLd5ZX7yUO3USCIE\",\"autoWrap\":false},{\"children\":[{\"text\":\"매개변수 설명은 다음과 같습니다.\"}],\"indent\":1,\"type\":\"p\",\"id\":\"j1OloPrrklqHxpjuMExPD\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"설정 항목 \"}],\"type\":\"p\",\"id\":\"fR6PoHliZEsHzTy8-14MN\"}],\"type\":\"cell\",\"id\":\"JmOviiRv_Ps-zOSwP_-kD\"},{\"children\":[{\"children\":[{\"text\":\"설정 항목\"}],\"type\":\"p\",\"id\":\"6f6-wpxeLCPaNChDdPuU4\"}],\"type\":\"cell\",\"id\":\"QTYWaiNdmoU4EKjQy42B8\"}],\"type\":\"row\",\"id\":\"XatJgymGGF0wrFjUzbVpv\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"BasePath\"}],\"type\":\"p\",\"id\":\"UfLefVbbEALVhvfvprztJ\"}],\"type\":\"cell\",\"id\":\"q9OHmLvTz3hhubQb8s3lf\"},{\"children\":[{\"children\":[{\"text\":\"파일이 저장되는 COS 경로입니다. 필요에 따라 수정할 수 있습니다. 비워두면 기본적으로 루트 디렉터리가 사용됩니다.\"}],\"type\":\"p\",\"id\":\"UR_QcaJRgO1lLyfuvsplC\"}],\"type\":\"cell\",\"id\":\"qJXX-rjXaPpY6_7LACJ37\"}],\"type\":\"row\",\"id\":\"bLx7_Ww4Z-hhiAAlnuoL3\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"SecretId\"}],\"type\":\"p\",\"id\":\"KEj0vi_YOneTJe_SMU8Zp\"}],\"type\":\"cell\",\"id\":\"9xWZ48ijd60SueLkqdnii\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"API Key 관리\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/capi\"},\"type\":\"ref\",\"id\":\"QCna8aNsOSMxEkljw4Efg\"},{\"text\":\"페이지에서 생성 및 획득할 수 있는 액세스 키 정보입니다.\"}],\"type\":\"p\",\"id\":\"xZxGK6ZHCMXJ98CyoLhCH\"}],\"type\":\"cell\",\"id\":\"z2j8ToYNvHdUkERXTqJvn\"}],\"type\":\"row\",\"id\":\"_NvIo5jHgK6vlzKreh6gr\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"SecretKey\"}],\"type\":\"p\",\"id\":\"jp2_37VqhhzeE5hBUcn8h\"}],\"type\":\"cell\",\"id\":\"ygKUdvCN4sxc5-8CjlfWV\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"API Key 관리\"}],\"linkTarget\":\"self\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/capi\"},\"type\":\"ref\",\"id\":\"rj7LNIcGqC3_ArOx0a1E4\"},{\"text\":\"페이지에서 생성 및 획득할 수 있는 액세스 키 정보입니다.\"}],\"type\":\"p\",\"id\":\"gaupr99z7Ow24ffcXfKCU\"}],\"type\":\"cell\",\"id\":\"zY-JQEtEt5sXnJ0x-r4RA\"}],\"type\":\"row\",\"id\":\"N_7ad_mxzGUD8aqdSWrE1\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Bucket\"}],\"type\":\"p\",\"id\":\"aGhXZ5mKhNpaVspaMg4g2\"}],\"type\":\"cell\",\"id\":\"nZrx_dPQ30EmsXcTMAkP-\"},{\"children\":[{\"children\":[{\"text\":\"examplebucket-1250000000과 같이 버킷 생성 중에 사용자 정의된 이름입니다.\"}],\"type\":\"p\",\"id\":\"lhfsydMFCI6nfYLnwRENL\"}],\"type\":\"cell\",\"id\":\"5wnl-MbE9Jy-OvGbbR2kM\"}],\"type\":\"row\",\"id\":\"0CeNg7qmnOK2Ok0JYZHNG\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Region\"}],\"type\":\"p\",\"id\":\"W7l4ueaqHRskxVhlMxl7y\"}],\"type\":\"cell\",\"id\":\"Vv0eeeiR5rmgKQDbhc25z\"},{\"children\":[{\"children\":[{\"text\":\"버킷 생성 중에 선택한 리전입니다.\"}],\"type\":\"p\",\"id\":\"c5l5a9tJQOGv8lnnRBdfg\"}],\"type\":\"cell\",\"id\":\"06VoSLxl0xeGDq19IL7Oc\"}],\"type\":\"row\",\"id\":\"5X-fWjaQdtQVEIo_jMQJ1\"}],\"rowHeader\":true,\"type\":\"table\",\"widths\":[14,86],\"id\":\"MOVqizCv5JwLkzgSlh1x4\",\"widthMode\":\"percentage\"},{\"children\":[{\"text\":\"사용자 지정 스토리지 디렉터리를 생성하고 프로젝트의 루트 디렉터리에서 다음 명령을 실행합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"qgbdwYVFHh8eRhWpB1Ueg\"},{\"children\":[{\"children\":[{\"text\":\"mkdir -p content/adapters/storage\"}],\"type\":\"code-line\",\"id\":\"Gv69sSNA9grhXlyoKfotz\"}],\"indent\":1,\"language\":\"js\",\"type\":\"code-block\",\"id\":\"D-oP8HEwWyne-KMEdBpwK\",\"autoWrap\":false},{\"children\":[{\"text\":\"Tencent Cloud에서 제공하는 \"},{\"children\":[{\"text\":\"ghost-cos-store\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/ghost-cos-store\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/ghost-cos-store\"},\"type\":\"ref\",\"id\":\"MIc81ROMEVKWZL7RxkEUE\"},{\"text\":\" 플러그인을 설치합니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"iKK5XDc9sPd4Or6iwjBOZ\"},{\"children\":[{\"text\":\"npm을 통해 설치합니다.\"}],\"indent\":1,\"start\":true,\"type\":\"oli\",\"id\":\"D7Q2Q5tl-XzlMDIvayCoL\"},{\"children\":[{\"children\":[{\"text\":\"npm install ghost-cos-store\"}],\"type\":\"code-line\",\"id\":\"9W57Njy-UY0JVPq_AdgCm\"}],\"indent\":2,\"language\":\"js\",\"type\":\"code-block\",\"id\":\"dDxnFHq64BUNa7jnkowsZ\",\"autoWrap\":false},{\"children\":[{\"text\":\"storage 디렉터리에 다음 콘텐츠가 포함된 ghost-cos-store.js 파일을 생성합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"oli\",\"id\":\"W7MtcW-NZW6TZLYx-Z00W\"},{\"children\":[{\"children\":[{\"text\":\"// content/adapters/storage/ghost-cos-store.js\"}],\"type\":\"code-line\",\"id\":\"yqfp7q9lUz_ay588R0d7a\"},{\"children\":[{\"text\":\"module.exports = require('ghost-cos-store');\"}],\"type\":\"code-line\",\"id\":\"KP9akLFNziCI4fz7fmu4s\"}],\"indent\":2,\"language\":\"js\",\"type\":\"code-block\",\"id\":\"gH9l-7-wOeWehISvCnBq2\",\"autoWrap\":false},{\"children\":[{\"text\":\"git clone을 통해 실행합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"oli\",\"id\":\"KefOt78833r1UljaP-u9G\"},{\"children\":[{\"children\":[{\"text\":\"cd content/adapters/storage\"}],\"type\":\"code-line\",\"id\":\"aOBR_Nr2DP3Rs5E9UDyJi\"},{\"children\":[{\"text\":\"git clone https://github.com/tencentyun/ghost-cos-store.git\"}],\"type\":\"code-line\",\"id\":\"N9IT-DDPelwaKU0eXkyAR\"},{\"children\":[{\"text\":\"cd ghost-cos-store \"}],\"type\":\"code-line\",\"id\":\"leHw72pU_3xcGJOMe2z1F\"},{\"children\":[{\"text\":\"npm i\"}],\"type\":\"code-line\",\"id\":\"8jx7DZq9MaULlbCEGNhtC\"}],\"indent\":2,\"language\":\"js\",\"type\":\"code-block\",\"id\":\"YufEq8Mu4ybvxaRg5PP1t\",\"autoWrap\":false},{\"children\":[{\"text\":\"설치 후 Ghost를 다시 시작합니다.\"}],\"indent\":1,\"start\":false,\"type\":\"oli\",\"id\":\"kyWlhQtRFnR8wWnoxelA-\"},{\"children\":[{\"children\":[{\"text\":\"ghost restart\"}],\"type\":\"code-line\",\"id\":\"AeWn8zUYNretb7DAsLRDo\"}],\"indent\":2,\"language\":\"js\",\"type\":\"code-block\",\"id\":\"8Y8cVdfhBGsU4KBTZ1jE6\",\"autoWrap\":false},{\"children\":[{\"text\":\"게시물 게시 및 업로드 테스트\"}],\"nodeId\":\".EA.B2.8C.EC.8B.9C.EB.AC.BC-.EA.B2.8C.EC.8B.9C-.EB.B0.8F-.EC.97.85.EB.A1.9C.EB.93.9C-.ED.85.8C.EC.8A.A4.ED.8A.B8\",\"type\":\"h2\",\"id\":\"LwjORba7fPynIcjYwTzMS\"},{\"children\":[{\"text\":\"Ghost 콘솔에서 +를 클릭하여 게시물을 게시합니다.\\n\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"inline\":true,\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/553f7fd1292211efa45a5254008fe934.jpeg\",\"id\":\"z1Tzwug1jieZISVN8nRid\",\"naturalSize\":[1226,582],\"size\":[974,462]},{\"text\":\"\"}],\"start\":true,\"type\":\"oli\",\"id\":\"lHvrB_Bx9vlrPrwdl4CbW\"},{\"children\":[{\"text\":\"+를 클릭하여 이미지를 업로드합니다. 브라우저에서 캡처한 패킷에서 upload 요청이 성공하고 이미지의 COS URL이 반환되는 것을 확인할 수 있습니다.\"}],\"start\":false,\"type\":\"oli\",\"id\":\"1YigMHm-565dolEXG9NJe\"}]"}},"53925":{"categoryId":436,"weight":100,"type":"page","extension":"","pid":48291,"id":53925,"lang":"ko","title":"하이브리드 워터마크","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2023-03-15 00:10:46","recentReleaseTime":"2023-03-15 00:10:46","content":{"title":"하이브리드 워터마크","body":"
본문은 클라우드에서 COS 오디오/비디오 파일을 처리하고 클라이언트에서 재생하는 방법을 설명합니다. 이 문서의 예시는 오디오/비디오 처리를 위해 지원되는 프로토콜 및 기능을 다루며 재생 성능을 향상시키기 위해 CI에서 Media Processing Service의 풍부한 오디오/비디오 처리 기능을 기반으로 제품 기능을 사용하는 방법에 대해 더 많은 아이디어를 제공합니다.

지원되는 프로토콜

오디오/비디오 프로토콜
URL 형식
PC 브라우저
모바일 브라우저
MP3
https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp3
지원
지원
MP4
https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mp4
지원
지원
HLS(M3U8)
https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.m3u8
지원
지원
FLV
https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.flv
지원
지원
DASH
https://<BucketName-APPID>.cos.<Region>.myqcloud.com/xxx.mpd
지원
지원
주의:
HLS, FLV, DASH 비디오는 일부 브라우저 환경에서 재생하려면 Media Source Extensions 에 종속해야 합니다.

지원되는 기능

기능
TCPlayer
DPlayer
Videojs Player
MP4 비디오 재생
상세 보기
상세 보기
상세 보기
HLS 비디오 재생
상세 보기
상세 보기
상세 보기
FLV 비디오 재생
상세 보기
상세 보기
상세 보기
DASH 비디오 재생
상세 보기
상세 보기
상세 보기
PM3U8(개인 M3U8) 비디오 재생
상세 보기
상세 보기
상세 보기
썸네일 구성
상세 보기
상세 보기
상세 보기
표준 HLS 암호화 구성
상세 보기
상세 보기
상세 보기
해상도 전환
상세 보기
상세 보기
-
동적 워터마크 구성
상세 보기
-
-
왼쪽 상단 LOGO 구성
-
상세 보기
-
진행률 표시줄 미리보기 이미지 구성
상세 보기
-
-
자막 구성
상세 보기
-
-
다국어 구성
상세 보기
-
-
롤 이미지 광고 구성
상세 보기
-
-
설명:
플레이어는 일반 브라우저와 호환되며 최적의 재생 구성표를 사용할 플랫폼을 자동으로 식별할 수 있습니다. 예를 들어 Chrome과 같은 최신 브라우저에서 비디오 재생을 위해 HTML5 기술을 사용하고 모바일 브라우저에서 HTML5 기술 또는 브라우저 커널 기능을 직접 사용하는 것이 좋습니다.

사용 가이드

TCPlayer 사용하여 COS에서 비디오 재생
DPlayer 사용하여 COS에서 비디오 재생
VideojsPlayer 사용하여 COS 비디오 재생
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"본문은 클라우드에서 COS 오디오/비디오 파일을 처리하고 클라이언트에서 재생하는 방법을 설명합니다. 이 문서의 예시는 오디오/비디오 처리를 위해 지원되는 프로토콜 및 기능을 다루며 재생 성능을 향상시키기 위해 CI에서 \"},{\"children\":[{\"text\":\"Media Processing Service\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/1045/46980\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/1045/46980\"},\"type\":\"ref\",\"id\":\"LqIwkoHcuWIC2mnFBO1eJ\"},{\"text\":\"의 풍부한 오디오/비디오 처리 기능을 기반으로 제품 기능을 사용하는 방법에 대해 더 많은 아이디어를 제공합니다.\"}],\"type\":\"p\",\"id\":\"OjtO2MhlEVa6sugA2U1Ac\"},{\"children\":[{\"text\":\"지원되는 프로토콜\"}],\"nodeId\":\".EC.A7.80.EC.9B.90.EB.90.98.EB.8A.94-.ED.94.84.EB.A1.9C.ED.86.A0.EC.BD.9C\",\"type\":\"h2\",\"id\":\"VXDJyfDBqnXSRwZyfKdGn\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"오디오/비디오 프로토콜\"}],\"type\":\"p\",\"id\":\"doKkOhWcD8_6gQA0C-_7_\"}],\"type\":\"cell\",\"id\":\"fCDz_JjlWi70gJmCaVVVG\"},{\"children\":[{\"children\":[{\"text\":\"URL 형식\"}],\"type\":\"p\",\"id\":\"wqL3Nh2szMvQLkk60JloW\"}],\"type\":\"cell\",\"id\":\"43AW0eiRmELRzmHWNubV_\"},{\"children\":[{\"children\":[{\"text\":\"PC 브라우저\"}],\"type\":\"p\",\"id\":\"tDujqwNaP9mnOhyCBWuPa\"}],\"type\":\"cell\",\"id\":\"m1yXEdthqoaKoRZd1Osqi\"},{\"children\":[{\"children\":[{\"text\":\"모바일 브라우저\"}],\"type\":\"p\",\"id\":\"CLHO0wwSJsq2bmHAiO8lU\"}],\"type\":\"cell\",\"id\":\"pLRdB59or9DzIL3Nfa5iH\"}],\"type\":\"row\",\"id\":\"wCgbqELasHEqZEpLhchHa\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"MP3\"}],\"type\":\"p\",\"id\":\"VYew4N2S-L4n9B0dE9MFP\"}],\"type\":\"p\",\"id\":\"fu6ZQx-E_fLUI8pm8unmq\"}],\"type\":\"cell\",\"id\":\"q20qSQOu8tSG_9ddO4iDI\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"https://.cos..myqcloud.com/xxx.mp3\"}],\"type\":\"p\",\"id\":\"8HBYYLqVLIAFM-XzW00lX\"}],\"type\":\"p\",\"id\":\"11BmCVhp9Ku5R72mSgAPC\"}],\"type\":\"cell\",\"id\":\"PGaWeUuFB3pSVee-imTX4\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"ooM9p-l3CuTTtcrcZqrHA\"}],\"type\":\"p\",\"id\":\"q6N9gd4uz42qFlm4XETxe\"}],\"type\":\"cell\",\"id\":\"wiLz4xWY5jYGhP8RXvnbO\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"7YjbCxPWNwhox2wuF90-e\"}],\"type\":\"p\",\"id\":\"xcv4_c2PssS-FYaqJ0OlI\"}],\"type\":\"cell\",\"id\":\"8zOpxLrpsWVM2atg21_2i\"}],\"type\":\"row\",\"id\":\"5MBEaL232tznERDozpDQX\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"MP4\"}],\"type\":\"p\",\"id\":\"IjWJWzzFXS1a22H3yVHFw\"}],\"type\":\"p\",\"id\":\"gVjDilti7o7DYiNdwivbv\"}],\"type\":\"cell\",\"id\":\"bBWOkw933_YwvEU4sgRoD\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"https://.cos..myqcloud.com/xxx.mp4\"}],\"type\":\"p\",\"id\":\"yK5kU_slULkSe6VFnd7qh\"}],\"type\":\"p\",\"id\":\"8SH9C3Ti5vBFDVwDjLhG6\"}],\"type\":\"cell\",\"id\":\"9txIng3Ew2qTWt-lIVouM\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"Cknl0BHyU5AbhLSv7Tw70\"}],\"type\":\"p\",\"id\":\"gmhk4Zpp-Fq6nmxThaA5b\"}],\"type\":\"cell\",\"id\":\"n2g2rCvPAUcioT-qa-yqV\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"Xh-NmzDrz3j2pNRwX0OLR\"}],\"type\":\"p\",\"id\":\"2GjuoHTcYQ586WxGnrR5o\"}],\"type\":\"cell\",\"id\":\"F6dgIMEfGlS9C6qaO7Icb\"}],\"type\":\"row\",\"id\":\"nreSwref8z0EUQEBoZ8we\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"HLS(M3U8)\"}],\"type\":\"p\",\"id\":\"0c3btml_r3t7SfeCao1uM\"}],\"type\":\"cell\",\"id\":\"WidIskybdtnTXDu7Rrxqb\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"https://.cos..myqcloud.com/xxx.m3u8\"}],\"type\":\"p\",\"id\":\"Dgqtz3iXmItfJXGOK5WVI\"}],\"type\":\"p\",\"id\":\"pP6AiH_uQuwmeklOgbnL2\"}],\"type\":\"cell\",\"id\":\"jFAbDmV6loS8Tb2-4XwDM\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"yxDLI0rIi_kMjuGWdjSyQ\"}],\"type\":\"p\",\"id\":\"kp0SSryyRiNek0jxv6EC5\"}],\"type\":\"cell\",\"id\":\"W8fOvGCoR1oTnZxaMuqZy\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"1bXG3LFs71UrqltQB-KkQ\"}],\"type\":\"p\",\"id\":\"YMjSmgZqCO3aKKa73iqnY\"}],\"type\":\"cell\",\"id\":\"nGS4KdrFXel655u3aHjuh\"}],\"type\":\"row\",\"id\":\"TqTQQ4BZLi9RskCFr_PPW\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"FLV\"}],\"type\":\"p\",\"id\":\"XAde4bMuOs7lWAp7dliWN\"}],\"type\":\"p\",\"id\":\"QFm6vagkc6fgD4fB4ME0e\"}],\"type\":\"cell\",\"id\":\"k3lu7ZybJl--jFTvuwYIn\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"https://.cos..myqcloud.com/xxx.flv\"}],\"type\":\"p\",\"id\":\"juC_OoEgY8VdvLy5pyJf5\"}],\"type\":\"p\",\"id\":\"gH2rXG3Plv76it7NKSB_V\"}],\"type\":\"cell\",\"id\":\"nqAPSCGfw5nOzJnAi1vTE\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"iikDypRyrq9hkOauzWuyA\"}],\"type\":\"p\",\"id\":\"9oEVdqAiFrOtVCn2rYpH2\"}],\"type\":\"cell\",\"id\":\"mvRBU94O3So04ciuJog-z\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"Ha1eD1uHTNdIucTQIxV6T\"}],\"type\":\"p\",\"id\":\"3cbUYDMr6-I643dRzBkpU\"}],\"type\":\"cell\",\"id\":\"31z6XSsyzV2p7Z0GaU62B\"}],\"type\":\"row\",\"id\":\"ZdiLv06YNEk0YhWCattSr\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"DASH\"}],\"type\":\"p\",\"id\":\"PNMTqruXFzq65ImdL3dtA\"}],\"type\":\"p\",\"id\":\"xj7WXuYTpXpFr38GnsOdh\"}],\"type\":\"cell\",\"id\":\"0uEMVD3BG6fMdj3jIYyLf\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"https://.cos..myqcloud.com/xxx.mpd\"}],\"type\":\"p\",\"id\":\"lJWJq7Nu7izYmt5wpBCa7\"}],\"type\":\"p\",\"id\":\"du_f0pn1t64zARmpqyqV3\"}],\"type\":\"cell\",\"id\":\"41WWkvwjWmRQtQWJ7m29A\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"tecY_KlVDBodkujyyyUxL\"}],\"type\":\"p\",\"id\":\"qodgSwp4Ia6VHeMlnzA6r\"}],\"type\":\"cell\",\"id\":\"hVdMVS9u_I6i6TVfYsx6T\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"지원\"}],\"type\":\"p\",\"id\":\"xQ9BR5tb8EL7eSWavCGa8\"}],\"type\":\"p\",\"id\":\"l0xGd1QsylkS-YUu6m2al\"}],\"type\":\"cell\",\"id\":\"gODa8t4ram3dyQARA90dk\"}],\"type\":\"row\",\"id\":\"uWw3xc-mf4yisZ-R_oPVO\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\",\"id\":\"JdfkuPfFQoGcwyhWmiPXs\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"#04C8DC\",\"text\":\"주의:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"w5D6TQw2DDs3QIvyTfcfv\"},{\"children\":[{\"text\":\"HLS, FLV, DASH 비디오는 일부 브라우저 환경에서 재생하려면 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://caniuse.com/?search=Media Source Extensions\"},\"children\":[{\"text\":\"Media Source Extensions\"}],\"id\":\"IkVXUtU0PslNJc2LuRs2h\"},{\"text\":\" 에 종속해야 합니다.\"}],\"type\":\"p\",\"id\":\"bKc_U-DOY5ooLpYy7axeq\"}],\"hintType\":\"alert\",\"type\":\"hint\",\"id\":\"B813-s2FS7UX1BBnzuuHt\"},{\"children\":[{\"text\":\"지원되는 기능\"}],\"nodeId\":\".EC.A7.80.EC.9B.90.EB.90.98.EB.8A.94-.EA.B8.B0.EB.8A.A5\",\"type\":\"h2\",\"id\":\"bsXdi_YrpgHJ25G1PeDwn\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"기능\"}],\"type\":\"p\",\"id\":\"CkOqNXsmHaIXo9r196qHj\"}],\"type\":\"cell\",\"id\":\"35khYLBDXqZvlIQubdBBB\"},{\"children\":[{\"children\":[{\"text\":\"TCPlayer\"}],\"type\":\"p\",\"id\":\"3rWet2egG2Dpg2Hnf19Hb\"}],\"type\":\"cell\",\"id\":\"-KSJABeAntj3G6jf5iGWv\"},{\"children\":[{\"children\":[{\"text\":\"DPlayer\"}],\"type\":\"p\",\"id\":\"MsHTRIVo_kfUWkhU6qpbV\"}],\"type\":\"cell\",\"id\":\"MdIOkAOOsOKqtgtMNobYZ\"},{\"children\":[{\"children\":[{\"text\":\"Videojs Player\"}],\"type\":\"p\",\"id\":\"O6WOGXmrkpSlZ-Hx7bMfx\"}],\"type\":\"cell\",\"id\":\"SVycafykiPrRf0MjvFzkq\"}],\"type\":\"row\",\"id\":\"MYhh8nCTSBJn6PNZMNR_r\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"MP4 비디오 재생\"}],\"type\":\"p\",\"id\":\"pZsPp6vPvwmiPpmfwo4JY\"}],\"type\":\"p\",\"id\":\"STqOJlE1diXyMbEQKhJDx\"}],\"type\":\"cell\",\"id\":\"g-atlpVfn9C2qJjv1Bi11\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"_X-70qFVAiEn1J600poL_\"}],\"type\":\"p\",\"id\":\"xPMOP6jw6OSjMLupK50BS\"}],\"type\":\"cell\",\"id\":\"8jk_ZmTGXOQO_I4c_p6Jc\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"xX_ZFfVkMoOkmypOeEGLj\"}],\"type\":\"p\",\"id\":\"ieHWBKlinya1gjP_BIv5Y\"}],\"type\":\"cell\",\"id\":\"kJI8LM2JvZ1rhaIUifemJ\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"UpHljJjIBbsm9VB2zjOpi\"}],\"type\":\"p\",\"id\":\"m07kpnhO4UPozAet8hr7k\"}],\"type\":\"cell\",\"id\":\"IzIUjXg7SbKzqGbJxAdT7\"}],\"type\":\"row\",\"id\":\"7Idm85kHgriKaiRVFW-7Z\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"HLS 비디오 재생\"}],\"type\":\"p\",\"id\":\"spIOeLMwTLYsrR4BaENWZ\"}],\"type\":\"p\",\"id\":\"LmFDSH3XdH5oB5frAhrdB\"}],\"type\":\"cell\",\"id\":\"sy2YCoOnAclhoPvUAeXE8\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"00JEf9kltWBT1vvyQmnUx\"}],\"type\":\"p\",\"id\":\"RMC7ySWLeZQmxaBdqPcnw\"}],\"type\":\"cell\",\"id\":\"YTW9qNEoFqtgMFZ0WyM3s\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"LzDi78PfSNk1ufvjjSCsI\"}],\"type\":\"p\",\"id\":\"BgqnuLgPlVHtzOxpGWgR5\"}],\"type\":\"cell\",\"id\":\"yWESqbFagIGPpgA-6XEr7\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"UMm6PDduPU9z82dwOZuG9\"}],\"type\":\"p\",\"id\":\"r6kMIjSnwdo47EXPUHIZL\"}],\"type\":\"cell\",\"id\":\"ObQH650D6-KJtfG835qzf\"}],\"type\":\"row\",\"id\":\"W7odMlZyitxyjH7IQTCwD\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"FLV 비디오 재생\"}],\"type\":\"p\",\"id\":\"zEFm8jXguZdrKu6MZiL1e\"}],\"type\":\"p\",\"id\":\"334DQFI0roEtcpfNSCC91\"}],\"type\":\"cell\",\"id\":\"pYl_W2oE8Uh_ZeMptV-P7\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"Mn28pm1aeSJUHQ8rxo-Zr\"}],\"type\":\"p\",\"id\":\"W4OzrDjR8p8Pi_UsLUSOU\"}],\"type\":\"cell\",\"id\":\"mk7dDqz3QVUIwdLNK30U5\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"17HwlSAdtDR8ETojy2LJt\"}],\"type\":\"p\",\"id\":\"k0eNhcYCTB_PY249QXSgB\"}],\"type\":\"cell\",\"id\":\"o3eEelk3UtudO8ssQ2KA7\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"UZRVUjtF1kwLN0_OCVvRa\"}],\"type\":\"p\",\"id\":\"UXw2cqTNHyx70lLVtlAQ0\"}],\"type\":\"cell\",\"id\":\"BcH2IZuNRyKurzOw_C3Yn\"}],\"type\":\"row\",\"id\":\"XzzZUjQHc0CCy8MXxjlKf\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"DASH 비디오 재생\"}],\"type\":\"p\",\"id\":\"mCGVg4yrChW-zqaLpDCzl\"}],\"type\":\"p\",\"id\":\"_YXlblDP3IvqQS2UTAGRQ\"}],\"type\":\"cell\",\"id\":\"rRN16u7JqWMIlRyZ630BH\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"mKzVavO-K7-tAZE7Sm6Gr\"}],\"type\":\"p\",\"id\":\"xUWYq_eaTdjRnOVpc19KG\"}],\"type\":\"cell\",\"id\":\"cXFhnKuid-ZAt0vjIrKf_\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"ne3WKCwg5IUs0cMBmUZFF\"}],\"type\":\"p\",\"id\":\"9YVumj9jfSGAklgZk9zFZ\"}],\"type\":\"cell\",\"id\":\"kQLWLeLNECSCsr9Hd2jyI\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"l-28lDk77_2MqS0ioXWOF\"}],\"type\":\"p\",\"id\":\"0NmSX0HmkzlmUB1m9Ith8\"}],\"type\":\"cell\",\"id\":\"RKjqW5VbXsKqusfC45ryl\"}],\"type\":\"row\",\"id\":\"cAoZSDGIQ2--_OBpsh6lE\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"PM3U8(개인 M3U8) 비디오 재생\"}],\"type\":\"p\",\"id\":\"C2eaQwZ9Inu1Yc9MzJdie\"}],\"type\":\"p\",\"id\":\"09Q5trRkCgasaGCfie81J\"}],\"type\":\"cell\",\"id\":\"B9uMyx7qPB5Vy40NdJxcq\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"qDsMFg4Va5wgafpxnOquT\"}],\"type\":\"p\",\"id\":\"T4rBdbBf3ME3H3FIKVHWF\"}],\"type\":\"cell\",\"id\":\"KOKaUr4mDoCwNyjVHi3wd\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"LJLMDPL2CHNNRV7AesHKK\"}],\"type\":\"p\",\"id\":\"kjtBfpSNGiIYuFLcHTQA2\"}],\"type\":\"cell\",\"id\":\"kyPwKe7krs0TLzUFkzL5E\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"r6VuZ4nKFPiPdXEjFwCac\"}],\"type\":\"p\",\"id\":\"pD61-Dg0ZBRvDY8Kwku3w\"}],\"type\":\"cell\",\"id\":\"B6LJZOdW34qyH_KlmxTRU\"}],\"type\":\"row\",\"id\":\"Hhkf6bBHE6FnvAeBYHzCB\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"썸네일 구성\"}],\"type\":\"p\",\"id\":\"qxpSfhU8n-76qEB3D-yZC\"}],\"type\":\"p\",\"id\":\"LAdHZO6KlPdBgJGPBcv6R\"}],\"type\":\"cell\",\"id\":\"WINs1Qo0FEVXoV_tRjF4B\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"GGlKQ93xISQvo7wAzt0Bw\"}],\"type\":\"p\",\"id\":\"ruzDE8oJSbi0dUGsy48oy\"}],\"type\":\"cell\",\"id\":\"9m5tNQ3_XrmkEay-mi06V\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"cBUycERwULWpdAUnSttaT\"}],\"type\":\"p\",\"id\":\"wzdPux5OBtGlUvQAZudF7\"}],\"type\":\"cell\",\"id\":\"c05n3JJNaoIU381L1ZScF\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"eCBMQnkjqlAOJadqBGVN7\"}],\"type\":\"p\",\"id\":\"XxG0ocdYsRTvSKP8lxwT-\"}],\"type\":\"cell\",\"id\":\"AxbxlNqcazxoNvR4UCwHb\"}],\"type\":\"row\",\"id\":\"W1lKwZ6koY33E6JshDA2d\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"표준 HLS 암호화 구성\"}],\"type\":\"p\",\"id\":\"hg3DGonXAq6sp6k4DDs9r\"}],\"type\":\"p\",\"id\":\"XV8XhWB7m_QUCd1HOT2oM\"}],\"type\":\"cell\",\"id\":\"lzDt_fWz6rga8GZNgu6ke\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"ojOvXa0BMTIDcZ-vTyQ4T\"}],\"type\":\"p\",\"id\":\"Y0jm0O34u9ySoPhgjxUGv\"}],\"type\":\"cell\",\"id\":\"NgznFR8-eWrQCFmrrgbJ9\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"OD5uvIcPaiIlVnkS9eycw\"}],\"type\":\"p\",\"id\":\"nMa6nGX2xPXzSvkSiazvw\"}],\"type\":\"cell\",\"id\":\"oAswsYd0MA3iNRP-LSMf2\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"UQ1lAT1UXr7ToGf59AJ3z\"}],\"type\":\"p\",\"id\":\"axrMt_qxfmPlYi87cfq6z\"}],\"type\":\"cell\",\"id\":\"EN9HUdEw8q_xJCt3B7BU4\"}],\"type\":\"row\",\"id\":\"zyxPBd4xGtHYlE8276VFI\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"해상도 전환\"}],\"type\":\"p\",\"id\":\"8gTH3hEm4rYMV-w5BCRKR\"}],\"type\":\"p\",\"id\":\"VjPGS_CIDv6VEp7TZjxCp\"}],\"type\":\"cell\",\"id\":\"eg3Yufmbs2xcLkwDXgSr5\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"qsusYJ6HDySDYZRuTecOq\"}],\"type\":\"p\",\"id\":\"xVxH3Zx-NYFz7byzltkyN\"}],\"type\":\"cell\",\"id\":\"59JUDb5fkhefpGo1c6c8i\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"5WhUloAK7VP7UqXRRJoLo\"}],\"type\":\"p\",\"id\":\"RDjLFJN6EhfhEmUDAKIRK\"}],\"type\":\"cell\",\"id\":\"wYH5GPT8dcwJsrPv3XibM\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"sm_x9AOfkXhSzZdZ5hJxb\"}],\"type\":\"p\",\"id\":\"nmctnAMnu7V5dQ_M8kuQ3\"}],\"type\":\"cell\",\"id\":\"4wUpo5oZPMRO25SLSS2iI\"}],\"type\":\"row\",\"id\":\"oaUMbfkNuhiWaahi7QJOw\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"동적 워터마크 구성\"}],\"type\":\"p\",\"id\":\"TADaUL9O_0CVAoBn_cXNm\"}],\"type\":\"p\",\"id\":\"Ty_qhqzPPxH9zItIeU9Qt\"}],\"type\":\"cell\",\"id\":\"75aP7NqadEYSLXIivkG82\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"F--oRhAvgz375RtCSxLdJ\"}],\"type\":\"p\",\"id\":\"dOy-Az2WRE7ALaHrk-N4E\"}],\"type\":\"cell\",\"id\":\"HEdtoU-Qs72FZ27-M4TgE\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"2PZEJLKgLvf04w_ARp1Xs\"}],\"type\":\"p\",\"id\":\"Jds6sVXeVMuz-TfKIhzmV\"}],\"type\":\"cell\",\"id\":\"v1Cdwb0rmvEdPUQtgyiAt\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"wkIrVhlkerAoXNc89XirP\"}],\"type\":\"p\",\"id\":\"zVTi5LpdVuUTN7DtWFa-q\"}],\"type\":\"cell\",\"id\":\"zZavLIRgn4nrOeq9njfwW\"}],\"type\":\"row\",\"id\":\"2ZmeR6st520l9R3BLJp9s\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"왼쪽 상단 LOGO 구성\"}],\"type\":\"p\",\"id\":\"Qa0RtH0kWca--R5It8v2J\"}],\"type\":\"p\",\"id\":\"DTkTh-lrsAer1aDSVQ68b\"}],\"type\":\"cell\",\"id\":\"vpz2F8r-jKID-v4aOo5BG\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"FRsxJ2kncKf-CEyk1y4nz\"}],\"type\":\"p\",\"id\":\"_jbbFKVKKIFrQpZw2ub_J\"}],\"type\":\"cell\",\"id\":\"-6PcE3fvGuysbWJhURFEk\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"jVN4_KhmVxwlTjU866n7A\"}],\"type\":\"p\",\"id\":\"N_oE7ZTtUVzp-XQPvD-tQ\"}],\"type\":\"cell\",\"id\":\"NZ7-8WbS-ikYKk6lRg6we\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"ThpqvUfskKCdsH9UXih2-\"}],\"type\":\"p\",\"id\":\"0U6ZuJgqH7SDTuQFAOW7Z\"}],\"type\":\"cell\",\"id\":\"0g_CsisUOnAagD741-g5S\"}],\"type\":\"row\",\"id\":\"UTuuBsvgLbWDi4e9T_2EK\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"진행률 표시줄 미리보기 이미지 구성\"}],\"type\":\"p\",\"id\":\"HRTRfOoFOu2Hnq40enQoj\"}],\"type\":\"p\",\"id\":\"vRilP7t8LyIxZOP7g6VlJ\"}],\"type\":\"cell\",\"id\":\"jpohRjDuT69ML4_58Hq20\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"AediakBoGVKzBMXqt4XVn\"}],\"type\":\"p\",\"id\":\"pwmu4yfB82OyRlu54wXjn\"}],\"type\":\"cell\",\"id\":\"pTBWF4XzJ4f7My_FJN9SK\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"hFi1Mrip2vYDnFRxRVAY3\"}],\"type\":\"p\",\"id\":\"vYjzWZTll-_GkdNv-k7Bg\"}],\"type\":\"cell\",\"id\":\"RtUp5CqH4x1fNudSDfwze\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"zZ9iz9vfUs5gel4Q_MW5T\"}],\"type\":\"p\",\"id\":\"bL1CNX7TEAJVQ71UHVd6I\"}],\"type\":\"cell\",\"id\":\"x78OxSCgTw34Kbhr4W3TF\"}],\"type\":\"row\",\"id\":\"J5uOPrL_OEJ9zsUXOm_A6\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"자막 구성\"}],\"type\":\"p\",\"id\":\"I49lYcHR0s1S7AFA6yXij\"}],\"type\":\"p\",\"id\":\"ZS6s09QFK_asgvwz2Bd7f\"}],\"type\":\"cell\",\"id\":\"kaD-B5QDjTEEsLYswWi1S\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"RJVbehqxpZjZsyaLJ3cXr\"}],\"type\":\"p\",\"id\":\"7nNub8f0bIXWPz69Inj8S\"}],\"type\":\"cell\",\"id\":\"32BrUq9Nvww2gpxYKw-c9\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"OqvRSTa-Nqpa4G5xnD6KW\"}],\"type\":\"p\",\"id\":\"mOnITZLW2iSWfEBStkYG_\"}],\"type\":\"cell\",\"id\":\"sFNczZJujMvlO0bUfC-S7\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"k7KlQhdQ2Hkzy01mYX-3l\"}],\"type\":\"p\",\"id\":\"UoVNdC5HeVXQLQqL4VZaL\"}],\"type\":\"cell\",\"id\":\"4ybXiZmBLEt5tUM_SteHD\"}],\"type\":\"row\",\"id\":\"2UhcAbuw3bCuBj0_8WJol\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"다국어 구성\"}],\"type\":\"p\",\"id\":\"OWtGA0h4I5Z5JCRkX9BBv\"}],\"type\":\"p\",\"id\":\"w9BT7CaSqdTCiJAifbwn7\"}],\"type\":\"cell\",\"id\":\"R-_e3ZoULudMTphUspCJh\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"_LO7eyMSMp5tZY_kbfxww\"}],\"type\":\"p\",\"id\":\"9MBa2LjsrB26dkqwUTu8R\"}],\"type\":\"cell\",\"id\":\"FepsF8qAVkGy3jLdnuTYW\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"Eo1u4ukLmmpgvIo-UEhW_\"}],\"type\":\"p\",\"id\":\"tOSd7I00Qh5QNEZzW-P9D\"}],\"type\":\"cell\",\"id\":\"GW0vpEK9ZlCaWvJym-WTC\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"C3R07Gp6Q_9uaSoN1ZY_D\"}],\"type\":\"p\",\"id\":\"V3bNqtpyzlUp-ybAGpsvf\"}],\"type\":\"cell\",\"id\":\"VroFFn5--AyAy34udWJdb\"}],\"type\":\"row\",\"id\":\"u6uPmyQUtqk54sTGXK5nu\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"롤 이미지 광고 구성\"}],\"type\":\"p\",\"id\":\"YGp0NvpcmtQuGluLnS2SH\"}],\"type\":\"p\",\"id\":\"vrNHzdyYmbAXW1wAcgnUg\"}],\"type\":\"cell\",\"id\":\"dzGSKdNrVsuUl_hry8pDG\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"상세 보기\"}],\"type\":\"p\",\"id\":\"YJwNA9FC5Q63qvkXQ1p5K\"}],\"type\":\"p\",\"id\":\"ZEgj1WPdyBJWTfOepbIEE\"}],\"type\":\"cell\",\"id\":\"hze1UxrIv7lcPp--VkkY1\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"XrrWKyrEHIKLOI4lvemME\"}],\"type\":\"p\",\"id\":\"mP1UT1y39bMeTcueOD1hi\"}],\"type\":\"cell\",\"id\":\"GWjT7kR1wGwv27kYjOdDc\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"-\"}],\"type\":\"p\",\"id\":\"nxw1WGCSyEVg1SA811at5\"}],\"type\":\"p\",\"id\":\"UnwsKBxnlgA7ZOUqJQpv4\"}],\"type\":\"cell\",\"id\":\"fo2TAJkpnlEkcguGka1VT\"}],\"type\":\"row\",\"id\":\"FJiaruzzGwUPjuSKdRnWZ\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\",\"id\":\"IQFZQx7hnophTRPcA6NJ2\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\",\"id\":\"LaH6dGZ9-fjMt7A7AaVxK\"},{\"children\":[{\"text\":\" 플레이어는 일반 브라우저와 호환되며 최적의 재생 구성표를 사용할 플랫폼을 자동으로 식별할 수 있습니다. 예를 들어 Chrome과 같은 최신 브라우저에서 비디오 재생을 위해 HTML5 기술을 사용하고 모바일 브라우저에서 HTML5 기술 또는 브라우저 커널 기능을 직접 사용하는 것이 좋습니다.\"}],\"type\":\"p\",\"id\":\"EsBQr38Ky2Z-grU1qulSV\"}],\"hintType\":\"info\",\"type\":\"hint\",\"id\":\"69USFgz-redmRj_plU4q0\"},{\"children\":[{\"text\":\"사용 가이드\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9-.EA.B0.80.EC.9D.B4.EB.93.9C\",\"type\":\"h2\",\"id\":\"hRRtbnb9pOlYhdmR470ib\"},{\"children\":[{\"text\":\"TCPlayer 사용하여 COS에서 비디오 재생\"}],\"start\":false,\"type\":\"uli\",\"id\":\"L229V4rIx8-qql-_emY8P\"},{\"children\":[{\"text\":\"DPlayer 사용하여 COS에서 비디오 재생\"}],\"start\":false,\"type\":\"uli\",\"id\":\"Y3gO09GbHn5H05U8uUj9T\"},{\"children\":[{\"text\":\"VideojsPlayer 사용하여 COS 비디오 재생\"}],\"start\":false,\"type\":\"uli\",\"id\":\"DkNVJTqY8vUJObNc_lmFy\"}]"}},"53928":{"categoryId":436,"weight":80,"type":"page","extension":"","pid":53926,"id":53928,"lang":"ko","title":"COS 오디오/비디오 플레이어 개요","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2023-03-15 00:10:46","recentReleaseTime":"2023-03-15 00:10:46","content":{"title":"COS 오디오/비디오 플레이어 개요","body":"

작업 시나리오

CI의 기본 이미지 처리 기능으로 이미지에 이미지 워터마크 또는 텍스트 워터마크를 추가할 수 있습니다. 그러나 실제 비즈니스 시나리오에서는 이미지에 고정 Logo 워터마크와 동적으로 변경되는 텍스트 워터마크(사용자 이름)가 모두 포함될 수 있습니다. 이러한 시나리오를 위해 다음과 같은 통합 방법이 제공됩니다. 실제 비즈니스 시나리오에 따라 적절한 것을 선택할 수 있습니다.

메소드 비교

메소드
장점
단점
1
통합 및 구현이 쉽습니다.
워터마크 크기는 이미지 크기에 따라 동적으로 변경될 수 없으며, 채우기할 수 없습니다.
2
이미지 크기가 자주 변경될 때 이미지에 더 잘 맞을 수 있습니다.
통합이 어렵고 처리 요금이 두 번 청구됩니다.

사용 방법

방법1: 파이프라인 연산자를 사용하여 URL 하나만으로 두 가지 유형의 워터마크 추가

CI(Cloud Infinite)의 기본 이미지 처리 기능을 통해 파이프라인 연산자 "|"를 사용할 수 있습니다. 처리 및 트래픽 요금의 일회성 요금으로, 단 한 번의 요청으로 이미지를 여러 번 처리합니다. 이 방법은 반복 요청으로 인한 대기 시간과 추가 요금을 크게 줄입니다.

작업 순서

1. 이미지 워터마크에 설명된 대로 이미지 워터마크 매개변수를 정의합니다.\nAPI 매개변수에 익숙하지 않은 경우 콘솔에서 스타일을 추가하여 기본 처리에 설명된 대로 매개변수를 생성할 수 있습니다.
다음은 처리 매개변수입니다.
watermark/1/image/aHR0cDovL2V4YW1wbGVzLTEyNTgxMjU2MzguY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vbG9nby5wbmc/dissolve/60/dx/10/dy/50/gravity/southeast
설명:
여기서 aHR0cDovL2V4YW1wbGVzLTEyNTgxMjU2MzguY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vbG9nby5wbmc는 이미지 워터마크(COS bucket에 저장된 이미지)의 URL 보안 base64 인코딩 URL입니다.
2. 텍스트 워터마크에 설명된 대로 텍스트 워터마크 매개변수를 정의합니다.\nAPI 매개변수에 익숙하지 않은 경우 콘솔에서 스타일을 추가하여 기본 처리에 설명된 대로 매개변수를 생성할 수 있습니다.
watermark/2/text/VUlOOiAxMjM0NTY3OA/font/SGVsdmV0aWNhLmRmb250/fontsize/36/fill/IzAwMDAwMA/dissolve/50/gravity/southeast/dx/10/dy/10
설명:
여기서 VUlOOiAxMjM0NTY3OAUIN: 12345678의 URL 보안 base64 인코딩 텍스트입니다.
3. 파이프라인 연산자를 사용하여 이미지 및 텍스트 워터마크 매개변수를 연결합니다.
watermark/2/text/VUlOOiAxMjM0NTY3OA/font/SGVsdmV0aWNhLmRmb250/fontsize/36/fill/IzAwMDAwMA/dissolve/50/gravity/southeast/dx/10/dy/10|watermark/1/image/aHR0cDovL2V4YW1wbGVzLTEyNTgxMjU2MzguY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vbG9nby5wbmc/gravity/southeast/dx/10/dy/50/dissolve/60
4. 이미지 다운로드 URL 끝에 연결된 매개변수를 추가합니다.
https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/preview.png?watermark/2/text/VUlOOiAxMjM0NTY3OA/font/SGVsdmV0aWNhLmRmb250/fontsize/36/fill/IzAwMDAwMA/dissolve/50/gravity/southeast/dx/10/dy/10|watermark/1/image/aHR0cDovL2V4YW1wbGVzLTEyNTgxMjU2MzguY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vbG9nby5wbmc/gravity/southeast/dx/10/dy/50/dissolve/60
혼합 워터마크 이미지를 가져올 수 있습니다.
URL을 단축하려면 기본 처리의 지침에 따라 콘솔에서 watermark1 스타일로 이미지 워터마크(변경되지 않음)의 일부를 추가할 수 있습니다.
이런 식으로 URL은 다음과 같이 단축될 수 있습니다.
https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/preview.png/watermark1?watermark/2/text/VUlOOiAxMjM0NTY3OA/font/SGVsdmV0aWNhLmRmb250/fontsize/36/fill/IzAwMDAwMA/dissolve/50/gravity/southeast/dx/10/dy/10
추후에 텍스트 콘텐츠를 변경해야 하는 경우 URL의 VUlOOiAxMjM0NTY3OA만 업데이트된 base64 코드로 바꾸면 됩니다. 예를 들어 UIN: 88888888VUlOOiA4ODg4ODg4OA로 인코딩되므로 텍스트를 바꾸려면 URL을 다음 콘텐츠로 변경하기만 하면 됩니다.
https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/preview.png/watermark1?watermark/2/text/VUlOOiA4ODg4ODg4OA/font/SGVsdmV0aWNhLmRmb250/fontsize/36/fill/IzAwMDAwMA/dissolve/50/gravity/southeast/dx/10/dy/10

방법2: 텍스트 및 이미지 워터마크를 투명 이미지에 출력하고 이를 최종 이미지 워터마크로 사용

1. 400px * 400px의 투명 PNG 이미지를 파일 관리의 지시에 따라 버킷에 업로드합니다.\n예시: https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/transparent.png
2. 방법1의 1 - 3단계에 설명된 대로 이미지 및 텍스트 워터마크 매개변수를 생성하고 연결합니다.
3. 투명한 PNG 이미지의 다운로드 URL 끝에 연결된 매개변수를 추가합니다.
https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/transparent.png?watermark/2/text/VUlOOiAxMjM0NTY/font/SGVsdmV0aWNhLmRmb250/fontsize/48/fill/IzAwMDAwMA/dissolve/60/gravity/south/dx/0/dy/60|watermark/1/image/aHR0cDovL2V4YW1wbGVzLTEyNTgxMjU2MzguY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vbG9nby5wbmc/gravity/center/dx/0/dy/0/dissolve/71
4. 투명 이미지를 이미지 워터마크로 사용하고 원본 이미지에 워터마크를 추가합니다.
https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/preview.png?watermark/1/image/aHR0cDovL2V0ZXJuYXV4LTEzMDE0NTM1NTAuY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vdHJhbnNwYXJlbnQucG5nP3dhdGVybWFyay8yL3RleHQvVlVsT09pQXhNak0wTlRZL2ZvbnQvU0dWc2RtVjBhV05oTG1SbWIyNTAvZm9udHNpemUvNDgvZmlsbC9JekF3TURBd01BL2Rpc3NvbHZlLzYwL2dyYXZpdHkvc291dGgvZHgvMC9keS82MHx3YXRlcm1hcmsvMS9pbWFnZS9hSFIwY0RvdkwyVjBaWEp1WVhWNExURXpNREUwTlRNMU5UQXVZMjl6TG1Gd0xXZDFZVzVuZW1odmRTNXRlWEZqYkc5MVpDNWpiMjB2Ykc5bmJ5NXdibWMvZ3Jhdml0eS9jZW50ZXIvZHgvMC9keS8wL2Rpc3NvbHZlLzcx/gravity/southeast/dx/0/dy/0/dissolve/90
또한 scatype 매개변수를 사용하여 이미지 크기에 비례하여 이미지 워터마크의 크기를 조정하고 batch 매개변수를 사용하여 이미지 워터마크를 바둑판식으로 배열할 수 있습니다.
https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/preview.png?watermark/1/image/aHR0cDovL2V0ZXJuYXV4LTEzMDE0NTM1NTAuY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vdHJhbnNwYXJlbnQucG5nP3dhdGVybWFyay8yL3RleHQvVlVsT09pQXhNak0wTlRZL2ZvbnQvU0dWc2RtVjBhV05oTG1SbWIyNTAvZm9udHNpemUvNDgvZmlsbC9JekF3TURBd01BL2Rpc3NvbHZlLzYwL2dyYXZpdHkvc291dGgvZHgvMC9keS82MHx3YXRlcm1hcmsvMS9pbWFnZS9hSFIwY0RvdkwyVjBaWEp1WVhWNExURXpNREUwTlRNMU5UQXVZMjl6TG1Gd0xXZDFZVzVuZW1odmRTNXRlWEZqYkc5MVpDNWpiMjB2Ykc5bmJ5NXdibWMvZ3Jhdml0eS9jZW50ZXIvZHgvMC9keS8wL2Rpc3NvbHZlLzcx/scatype/3/spcent/30/gravity/southeast/dx/0/dy/0/dissolve/90/batch/1/degree/45
","recentReleaseTime":"2024-06-24 16:44:04","slate":"[{\"children\":[{\"text\":\"작업 시나리오\"}],\"nodeId\":\".EC.9E.91.EC.97.85-.EC.8B.9C.EB.82.98.EB.A6.AC.EC.98.A4\",\"type\":\"h2\"},{\"children\":[{\"text\":\"CI의 기본 이미지 처리 기능으로 이미지에 \"},{\"children\":[{\"text\":\"이미지 워터마크\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/33720\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/33720\"},\"type\":\"ref\"},{\"text\":\" 또는 \"},{\"children\":[{\"text\":\"텍스트 워터마크\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/33721\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/33721\"},\"type\":\"ref\"},{\"text\":\"를 추가할 수 있습니다. 그러나 실제 비즈니스 시나리오에서는 이미지에 고정 Logo 워터마크와 동적으로 변경되는 텍스트 워터마크(사용자 이름)가 모두 포함될 수 있습니다. 이러한 시나리오를 위해 다음과 같은 통합 방법이 제공됩니다. 실제 비즈니스 시나리오에 따라 적절한 것을 선택할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"메소드 비교\"}],\"nodeId\":\".EB.A9.94.EC.86.8C.EB.93.9C-.EB.B9.84.EA.B5.90\",\"type\":\"h2\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"메소드\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"장점\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"단점\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"1\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"통합 및 구현이 쉽습니다.\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"워터마크 크기는 이미지 크기에 따라 동적으로 변경될 수 없으며, 채우기할 수 없습니다.\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"2\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"이미지 크기가 자주 변경될 때 이미지에 더 잘 맞을 수 있습니다.\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"통합이 어렵고 처리 요금이 두 번 청구됩니다.\"}],\"type\":\"p\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"}],\"columnHeader\":false,\"rowHeader\":true,\"type\":\"table\"},{\"children\":[{\"text\":\"사용 방법\"}],\"nodeId\":\".EC.82.AC.EC.9A.A9-.EB.B0.A9.EB.B2.95\",\"type\":\"h2\"},{\"children\":[{\"text\":\"방법1: 파이프라인 연산자를 사용하여 URL 하나만으로 두 가지 유형의 워터마크 추가\"}],\"nodeId\":\".EB.B0.A9.EB.B2.951.3A-.ED.8C.8C.EC.9D.B4.ED.94.84.EB.9D.BC.EC.9D.B8-.EC.97.B0.EC.82.B0.EC.9E.90.EB.A5.BC-.EC.82.AC.EC.9A.A9.ED.95.98.EC.97.AC-url-.ED.95.98.EB.82.98.EB.A7.8C.EC.9C.BC.EB.A1.9C-.EB.91.90-.EA.B0.80.EC.A7.80-.EC.9C.A0.ED.98.95.EC.9D.98-.EC.9B.8C.ED.84.B0.EB.A7.88.ED.81.AC-.EC.B6.94.EA.B0.80\",\"type\":\"h3\"},{\"children\":[{\"text\":\"CI(Cloud Infinite)의 기본 이미지 처리 기능을 통해 \"},{\"children\":[{\"text\":\"파이프라인 연산자\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/33727\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/33727\"},\"type\":\"ref\"},{\"text\":\" \\\"|\\\"를 사용할 수 있습니다. 처리 및 트래픽 요금의 일회성 요금으로, 단 한 번의 요청으로 이미지를 여러 번 처리합니다. 이 방법은 반복 요청으로 인한 대기 시간과 추가 요금을 크게 줄입니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"작업 순서\"}],\"nodeId\":\".EC.9E.91.EC.97.85-.EC.88.9C.EC.84.9C\",\"type\":\"h4\"},{\"children\":[{\"children\":[{\"text\":\"이미지 워터마크\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/33720\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/33720\"},\"type\":\"ref\"},{\"text\":\"에 설명된 대로 이미지 워터마크 매개변수를 정의합니다.\\nAPI 매개변수에 익숙하지 않은 경우 콘솔에서 스타일을 추가하여 \"},{\"children\":[{\"text\":\"기본 처리\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/33443\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/33443\"},\"type\":\"ref\"},{\"text\":\"에 설명된 대로 매개변수를 생성할 수 있습니다.\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"다음은 처리 매개변수입니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"watermark/1/image/aHR0cDovL2V4YW1wbGVzLTEyNTgxMjU2MzguY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vbG9nby5wbmc/dissolve/60/dx/10/dy/50/gravity/southeast\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 여기서 \"},{\"code\":1,\"text\":\"aHR0cDovL2V4YW1wbGVzLTEyNTgxMjU2MzguY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vbG9nby5wbmc\"},{\"text\":\"는 이미지 워터마크(COS bucket에 저장된 이미지)의 URL 보안 base64 인코딩 URL입니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"children\":[{\"text\":\"텍스트 워터마크\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/33721\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/33721\"},\"type\":\"ref\"},{\"text\":\"에 설명된 대로 텍스트 워터마크 매개변수를 정의합니다.\\nAPI 매개변수에 익숙하지 않은 경우 콘솔에서 스타일을 추가하여 \"},{\"children\":[{\"text\":\"기본 처리\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/33443\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/33443\"},\"type\":\"ref\"},{\"text\":\"에 설명된 대로 매개변수를 생성할 수 있습니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"watermark/2/text/VUlOOiAxMjM0NTY3OA/font/SGVsdmV0aWNhLmRmb250/fontsize/36/fill/IzAwMDAwMA/dissolve/50/gravity/southeast/dx/10/dy/10\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"color\":\"inherit\",\"text\":\"설명:\",\"type\":\"text\"}],\"type\":\"p\"},{\"children\":[{\"text\":\" 여기서 \"},{\"code\":1,\"text\":\"VUlOOiAxMjM0NTY3OA\"},{\"text\":\"는 \"},{\"code\":1,\"text\":\"UIN: 12345678\"},{\"text\":\"의 URL 보안 base64 인코딩 텍스트입니다.\"}],\"type\":\"p\"}],\"hintType\":\"info\",\"type\":\"hint\"},{\"children\":[{\"text\":\"파이프라인 연산자를 사용하여 이미지 및 텍스트 워터마크 매개변수를 연결합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"watermark/2/text/VUlOOiAxMjM0NTY3OA/font/SGVsdmV0aWNhLmRmb250/fontsize/36/fill/IzAwMDAwMA/dissolve/50/gravity/southeast/dx/10/dy/10|watermark/1/image/aHR0cDovL2V4YW1wbGVzLTEyNTgxMjU2MzguY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vbG9nby5wbmc/gravity/southeast/dx/10/dy/50/dissolve/60 \"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"이미지 다운로드 URL 끝에 연결된 매개변수를 추가합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/preview.png?watermark/2/text/VUlOOiAxMjM0NTY3OA/font/SGVsdmV0aWNhLmRmb250/fontsize/36/fill/IzAwMDAwMA/dissolve/50/gravity/southeast/dx/10/dy/10|watermark/1/image/aHR0cDovL2V4YW1wbGVzLTEyNTgxMjU2MzguY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vbG9nby5wbmc/gravity/southeast/dx/10/dy/50/dissolve/60 \"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"혼합 워터마크 이미지를 가져올 수 있습니다.\"}],\"indent\":1,\"type\":\"p\"},{\"children\":[{\"text\":\"URL을 단축하려면 \"},{\"children\":[{\"text\":\"기본 처리\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/33443\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/33443\"},\"type\":\"ref\"},{\"text\":\"의 지침에 따라 콘솔에서 \"},{\"code\":1,\"text\":\"watermark1\"},{\"text\":\" 스타일로 이미지 워터마크(변경되지 않음)의 일부를 추가할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"text\":\"이런 식으로 URL은 다음과 같이 단축될 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/preview.png/watermark1?watermark/2/text/VUlOOiAxMjM0NTY3OA/font/SGVsdmV0aWNhLmRmb250/fontsize/36/fill/IzAwMDAwMA/dissolve/50/gravity/southeast/dx/10/dy/10\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"추후에 텍스트 콘텐츠를 변경해야 하는 경우 URL의 \"},{\"code\":1,\"text\":\"VUlOOiAxMjM0NTY3OA\"},{\"text\":\"만 업데이트된 base64 코드로 바꾸면 됩니다. 예를 들어 \"},{\"code\":1,\"text\":\"UIN: 88888888\"},{\"text\":\"은 \"},{\"code\":1,\"text\":\"VUlOOiA4ODg4ODg4OA\"},{\"text\":\"로 인코딩되므로 텍스트를 바꾸려면 URL을 다음 콘텐츠로 변경하기만 하면 됩니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/preview.png/watermark1?watermark/2/text/VUlOOiA4ODg4ODg4OA/font/SGVsdmV0aWNhLmRmb250/fontsize/36/fill/IzAwMDAwMA/dissolve/50/gravity/southeast/dx/10/dy/10\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"방법2: 텍스트 및 이미지 워터마크를 투명 이미지에 출력하고 이를 최종 이미지 워터마크로 사용\"}],\"nodeId\":\".EB.B0.A9.EB.B2.952.3A-.ED.85.8D.EC.8A.A4.ED.8A.B8-.EB.B0.8F-.EC.9D.B4.EB.AF.B8.EC.A7.80-.EC.9B.8C.ED.84.B0.EB.A7.88.ED.81.AC.EB.A5.BC-.ED.88.AC.EB.AA.85-.EC.9D.B4.EB.AF.B8.EC.A7.80.EC.97.90-.EC.B6.9C.EB.A0.A5.ED.95.98.EA.B3.A0-.EC.9D.B4.EB.A5.BC-.EC.B5.9C.EC.A2.85-.EC.9D.B4.EB.AF.B8.EC.A7.80-.EC.9B.8C.ED.84.B0.EB.A7.88.ED.81.AC.EB.A1.9C-.EC.82.AC.EC.9A.A9\",\"type\":\"h3\"},{\"children\":[{\"text\":\"400px * 400px의 투명 PNG 이미지를 \"},{\"children\":[{\"text\":\"파일 관리\"}],\"linkTarget\":\"blank\",\"linkTitle\":\"https://intl.cloud.tencent.com/document/product/1045/37766\",\"props\":{\"type\":\"link\",\"url\":\"https://intl.cloud.tencent.com/document/product/1045/37766\"},\"type\":\"ref\"},{\"text\":\"의 지시에 따라 버킷에 업로드합니다.\\n예시: \"},{\"code\":1,\"text\":\"https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/transparent.png\"}],\"start\":true,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"방법1의 1 - 3단계\"},{\"text\":\"에 설명된 대로 이미지 및 텍스트 워터마크 매개변수를 생성하고 연결합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"투명한 PNG 이미지의 다운로드 URL 끝에 연결된 매개변수를 추가합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/transparent.png?watermark/2/text/VUlOOiAxMjM0NTY/font/SGVsdmV0aWNhLmRmb250/fontsize/48/fill/IzAwMDAwMA/dissolve/60/gravity/south/dx/0/dy/60|watermark/1/image/aHR0cDovL2V4YW1wbGVzLTEyNTgxMjU2MzguY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vbG9nby5wbmc/gravity/center/dx/0/dy/0/dissolve/71\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"투명 이미지를 이미지 워터마크로 사용하고 원본 이미지에 워터마크를 추가합니다.\"}],\"start\":false,\"type\":\"oli\"},{\"children\":[{\"children\":[{\"text\":\"https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/preview.png?watermark/1/image/aHR0cDovL2V0ZXJuYXV4LTEzMDE0NTM1NTAuY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vdHJhbnNwYXJlbnQucG5nP3dhdGVybWFyay8yL3RleHQvVlVsT09pQXhNak0wTlRZL2ZvbnQvU0dWc2RtVjBhV05oTG1SbWIyNTAvZm9udHNpemUvNDgvZmlsbC9JekF3TURBd01BL2Rpc3NvbHZlLzYwL2dyYXZpdHkvc291dGgvZHgvMC9keS82MHx3YXRlcm1hcmsvMS9pbWFnZS9hSFIwY0RvdkwyVjBaWEp1WVhWNExURXpNREUwTlRNMU5UQXVZMjl6TG1Gd0xXZDFZVzVuZW1odmRTNXRlWEZqYkc5MVpDNWpiMjB2Ykc5bmJ5NXdibWMvZ3Jhdml0eS9jZW50ZXIvZHgvMC9keS8wL2Rpc3NvbHZlLzcx/gravity/southeast/dx/0/dy/0/dissolve/90\"}],\"type\":\"code-line\"}],\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"또한 \"},{\"code\":1,\"text\":\"scatype\"},{\"text\":\" 매개변수를 사용하여 이미지 크기에 비례하여 이미지 워터마크의 크기를 조정하고 \"},{\"code\":1,\"text\":\"batch\"},{\"text\":\" 매개변수를 사용하여 이미지 워터마크를 바둑판식으로 배열할 수 있습니다.\"}],\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"https://examples-1258125638.cos.ap-guangzhou.myqcloud.com/preview.png?watermark/1/image/aHR0cDovL2V0ZXJuYXV4LTEzMDE0NTM1NTAuY29zLmFwLWd1YW5nemhvdS5teXFjbG91ZC5jb20vdHJhbnNwYXJlbnQucG5nP3dhdGVybWFyay8yL3RleHQvVlVsT09pQXhNak0wTlRZL2ZvbnQvU0dWc2RtVjBhV05oTG1SbWIyNTAvZm9udHNpemUvNDgvZmlsbC9JekF3TURBd01BL2Rpc3NvbHZlLzYwL2dyYXZpdHkvc291dGgvZHgvMC9keS82MHx3YXRlcm1hcmsvMS9pbWFnZS9hSFIwY0RvdkwyVjBaWEp1WVhWNExURXpNREUwTlRNMU5UQXVZMjl6TG1Gd0xXZDFZVzVuZW1odmRTNXRlWEZqYkc5MVpDNWpiMjB2Ykc5bmJ5NXdibWMvZ3Jhdml0eS9jZW50ZXIvZHgvMC9keS8wL2Rpc3NvbHZlLzcx/scatype/3/spcent/30/gravity/southeast/dx/0/dy/0/dissolve/90/batch/1/degree/45\"}],\"type\":\"code-line\"}],\"language\":\"bash\",\"type\":\"code-block\"}]"}},"61631":{"categoryId":436,"weight":91,"type":"page","extension":"","pid":32966,"id":61631,"lang":"ko","title":"버킷 사용자 정의 도메인 이름 전환","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2024-07-06 02:35:22","recentReleaseTime":"2024-07-06 02:35:22","content":{"title":"버킷 사용자 정의 도메인 이름 전환","body":"

배경

전체 서비스의 보안과 안정성을 위해 2024년 1월 1일 이후에 생성된 버킷은 COS 기본 도메인 이름을 사용하여 객체에 액세스할 경우 모든 유형 파일의 미리보기를 지원하지 않고 apk/ipa 유형 파일의 다운로드를 지원하지 않습니다. 자세한 내용은 COS 버킷 도메인 이름 사용 안전 관리 통지를 참고하시기 바랍니다.

2024년 1월 1일 이후에 생성된 버킷의 경우, 브라우저를 통한 파일 미리보기 또는 버킷 내의 apk/ipa 유형 객체 다운로르를 원하시면 사용자 정의 도메인 이름으로 객체에 액세스하시기 바랍니다. 2024년 1월 1일 이전에 생성된 버킷의 경우, 버킷 기본 도메인 이름의 미리보기, 다운로드 동작은 영향을 받지 않지만 더 나은 서비스 안정성을 위해 사용자 정의 도메인 이름을 우선적으로 사용하시기 바랍니다.

이 문서에서는 버킷에 대해 사용자 정의 도메인 이름을 구성하고, 버킷 기본 도메인 이름 액세스에서 사용자 정의 도메인 이름 액세스로 전환하는 방법에 대해 소개합니다.


첫 번째 단계: 도메인 이름 등록과 파일링

먼저, 사용자는 하나의 파일링된 사용자 정의 도메인 이름을 준비해야 합니다.
도메인 이름 등록: 사용자 정의 도메인 이름이 없으면 도메인 이름 등록으로 이동하여 도메인 이름을 구매할 수 있습니다.
도메인 이름 파일링: 당신의 사용자 정의 도메인 이름이 중국 본토 리전의 버킷에 구성하기 위한 것이면 반드시 파일링해야 합니다.

두 번째 단계: 버킷에 대해 사용자 정의 도메인 이름 구성

1. 사용자 정의 도메인 이름을 준비한 다음 COS 콘솔로그인하고, 버킷 리스트에서 구성할 버킷을 선택합니다.
2. 버킷 상세정보 페이지로 이동하여 도메인 이름과 전송 관리 > 사용자 정의 원본 서버 도메인 이름을 선택합니다.
3. 도메인 이름 추가를 클릭하여 도메인 이름 정보를 구성합니다.
도메인 이름: 준비된 사용자 정의 도메인 이름을 입력합니다.
원본 서버 유형: 다음과 같은 몇 가지로 구분됩니다.
기본 원본 서버: 사용자 정의 도메인 이름을 기본 원본 서버로 사용하려면 기본 원본 서버를 선택하십시오.
정적 웹사이트 원본 서버: 사용자 정의 도메인 이름을 정적 웹사이트로 사용하려면 먼저 버킷에 대해 정적 웹사이트 기능을 활성화한 다음 정적 웹사이트 원본 서버를 선택하십시오.
글로벌 가속 원본 서버: 사용자 정의 도메인 이름을 글로벌 가속으로 사용하려면 먼저 버킷에 대해 글로벌 가속 기능을 활성화한 다음 글로벌 가속 원본 서버를 선택하십시오.
주의:
도메인 추가, 온라인 또는 오프라인 조작은 즉시 적용되지 않습니다. 실제 구성에는 일정 시간이 걸리며 일반적으로 30분 후에 적용되며 도메인의 실제 액세스 상태를 기준으로 합니다.
4. HTTPS 인증서를 구성합니다. HTTPS 프로토콜을 사용하여 액세스해야 하는 경우 사용자 정의 도메인 이름에 대해 인증서를 구성해야 합니다.
자체 인증서를 사용해야 하는 경우 인증서 내용 및 비밀키 내용을 지정 입력 상자에 붙혀넣어야 합니다.
Tencent Cloud에서 신청한 인증서를 사용하는 경우 직접 팝업창에서 현재 계정에 있는 Tencent Cloud 인증서를 선택할 수 있습니다.
5. 사용자 정의 도메인 이름 구성 완료 후, 후속 도메인 이름 해석을 구성하기 위해 CNAME난의 정보(예: bucket-1250000000.cos.ap-beijing.myqcloud.com)를 기록합니다.

세 번째 단계: 도메인 이름 해석 구성

해당 DNS 서비스에서 CNAME 레코드를 구성합니다. 주요 작업 단계는 다음과 같습니다.
1. 도메인 추가: 해석할 사용자 정의 오리진 서버 도메인을 입력합니다. 예: www.example.com.
2. 레코드 추가: 사용자 정의 오리진 서버 도메인에 CNAME 레코드 유형의 해석 레코드를 추가합니다. 레코드 값은 CNAME이 가리키는 버킷 기본 오리진 서버 도메인입니다. 예: bucket-1250000000.cos.ap-beijing.myqcloud.com.
3. 해석이 성공했는지 확인합니다. 해석 레코드는 일정 시간이 걸릴 수 있습니다. dig 명령어 또는 COS 콘솔을 통해 해석이 성공했는지 확인할 수 있습니다. 확인 방법은 다음과 같습니다.
명령 프롬프트 창에 명령을 입력합니다. dig mydomain.com. CNAME 레코드가 제대로 작동하는지 확인합니다. (사용 시 mydomain.com을 사용자 정의 도메인으로 바꿉니다.)
COS 콘솔에 로그인하여 버킷 사용자 정의 도메인을 확인합니다. 도메인 이름의 CNAME이 성공적으로 적용되지 않으면 해당 메시지가 표시됩니다.

네 번째 단계: 사용자 정의 도메인 이름 액세스

상기 단계를 거쳐 사용자 정의 도메인 이름의 구성을 완료하였습니다. 아래에서는 사용자 정의 도메인 이름을 사용하여 COS에 액세스하는 방법에 대해 설명합니다.

객체 액세스 링크 확인

1. COS 콘솔에 로그인하여 사용자 정의 도메인 이름이 구성된 버킷을 찾고 클릭하여 파일 목록으로 들어갑니다. 하나의 객체를 선택하고 객체 상세정보로 들어갑니다. 조작 안내는 객체 정보 조회를 참고하시기 바랍니다.
2. 지정된 도메인 이름을 사용자 정의 원본 서버 도메인 이름으로 전환합니다. 아래의 객체 주소, 임시 링크는 사용자 정의 도메인 이름의 링크로 전환됩니다. 공개 읽기 객체에 액세스할 때 객체 주소(서명 없음)를 사용하고 비공개 읽기 객체에 액세스할 때 임시 링크(서명 있음)를 사용할 수 있습니다.

API 액세스를 위한 사용자 정의 도메인 이름 전환

직접 API를 사용하여 COS에 액세스하는 경우 액세스할 때 요청 Host를 사용자 정의 도메인 이름으로 전환하면 됩니다.
GET /\\<0bjectKey> HTTP/1.1
Host: <BucketName-APPID>.cos.<Region>.myqcloud.com # 사용자 정의 도메인 이름으로 교체
Date: GMT Date
Authorization: Auth String

SDK 액세스를 위한 사용자 정의 도메인 이름 전환

SDK를 사용하는 경우 Client를 초기화할 때 domain 매개변수를 사용자 정의 도메인 이름으로 설정하면 됩니다. Python SDK로 예를 들면, 코드 예는 다음과 같습니다.
domain = 'user-define.example.com' # 사용자 정의 도메인 이름
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Domain=domain, Scheme=scheme)
client = CosS3Client(config)
각 언어의 COS SDK에서 사용자 정의 도메인 이름으로 전환하는 코드 예는 다음 문서를 참고하시기 바랍니다.

","recentReleaseTime":"2025-06-04 18:23:37","slate":"[{\"children\":[{\"text\":\"배경\"}],\"id\":\"qK9lc8oid5d4M5IzCqrE0\",\"nodeId\":\"d6f49968-24d3-415b-a621-ce47bc1c89d8\",\"type\":\"h2\"},{\"children\":[{\"text\":\"전체 서비스의 보안과 안정성을 위해 2024년 1월 1일 이후에 생성된 버킷은 COS 기본 도메인 이름을 사용하여 객체에 액세스할 경우 모든 유형 파일의 미리보기를 지원하지 않고 apk/ipa 유형 파일의 다운로드를 지원하지 않습니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"COS 버킷 도메인 이름 사용 안전 관리 통지\"}],\"id\":\"WJsTOvo_MDoM_LwxdbvYM\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/57456\"},\"type\":\"ref\"},{\"text\":\"를 참고하시기 바랍니다.\"}],\"id\":\"cU4VCB1Qpvh_vFIn09fgz\",\"type\":\"p\"},{\"children\":[{\"text\":\"\"}],\"id\":\"fuQv_p12qIwPemQAhdTO8\",\"type\":\"p\"},{\"children\":[{\"text\":\"2024년 1월 1일 이후에 생성된 버킷의 경우, 브라우저를 통한 파일 미리보기 또는 버킷 내의 apk/ipa 유형 객체 다운로르를 원하시면 사용자 정의 도메인 이름으로 객체에 액세스하시기 바랍니다. 2024년 1월 1일 이전에 생성된 버킷의 경우, 버킷 기본 도메인 이름의 미리보기, 다운로드 동작은 영향을 받지 않지만 더 나은 서비스 안정성을 위해 사용자 정의 도메인 이름을 우선적으로 사용하시기 바랍니다.\"}],\"id\":\"DpbIXtqDrq2lGMkTfmHJE\",\"type\":\"p\"},{\"children\":[{\"text\":\"\"}],\"id\":\"ni4hVm-0bEejQUspvkHjf\",\"type\":\"p\"},{\"children\":[{\"text\":\"이 문서에서는 버킷에 대해 사용자 정의 도메인 이름을 구성하고, 버킷 기본 도메인 이름 액세스에서 사용자 정의 도메인 이름 액세스로 전환하는 방법에 대해 소개합니다.\"}],\"id\":\"gCEGPScpN8qa0WK6eyqE5\",\"type\":\"p\"},{\"children\":[{\"text\":\"\"}],\"id\":\"pO_Xx35XxPF2EIcBtRHcE\",\"type\":\"p\"},{\"children\":[{\"text\":\"첫 번째 단계: 도메인 이름 등록과 파일링\"}],\"id\":\"vjetkI6VhbTpy-E95ICH4\",\"nodeId\":\"d71139c9-3e56-419f-a588-2c65926e50e4\",\"type\":\"h2\"},{\"children\":[{\"text\":\"먼저, 사용자는 하나의 파일링된 사용자 정의 도메인 이름을 준비해야 합니다.\"}],\"id\":\"t28qtnGrujWWWZ53yz6lq\",\"type\":\"p\"},{\"children\":[{\"text\":\"도메인 이름 등록: 사용자 정의 도메인 이름이 없으면 \"},{\"children\":[{\"text\":\"도메인 이름 등록\"}],\"id\":\"npvTkaRJvH9oXCyud0TYH\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/242\"},\"type\":\"ref\"},{\"text\":\"으로 이동하여 도메인 이름을 구매할 수 있습니다.\"}],\"id\":\"jOA_3DjgstZoIa9tgZoN1\",\"type\":\"uli\"},{\"children\":[{\"text\":\"도메인 이름 파일링: 당신의 사용자 정의 도메인 이름이 중국 본토 리전의 버킷에 구성하기 위한 것이면 반드시 파일링해야 합니다.\"}],\"id\":\"8reQhLL7Ngy9l5nr4HlLs\",\"type\":\"uli\"},{\"children\":[{\"text\":\"두 번째 단계: 버킷에 대해 사용자 정의 도메인 이름 구성\"}],\"id\":\"idyPCicI9URJbS279K9Em\",\"nodeId\":\"abf79a5d-9dfd-475f-8db5-0ada636c4a6f\",\"type\":\"h2\"},{\"children\":[{\"text\":\"사용자 정의 도메인 이름을 준비한 다음 \"},{\"children\":[{\"text\":\"COS 콘솔\"}],\"id\":\"UWlauKXBQx8fxRq5rOXFI\",\"title\":\"https://console.tencentcloud.com/cos/bucket\",\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos/bucket\"},{\"text\":\"로그인하고, 버킷 리스트에서 구성할 버킷을 선택합니다.\"}],\"id\":\"m3CsK-vQjYNZbVbU9Pz7E\",\"type\":\"oli\"},{\"children\":[{\"text\":\"버킷 상세정보 페이지로 이동하여 \"},{\"b\":1,\"text\":\"도메인 이름과 전송 관리 > 사용자 정의 원본 서버 도메인 이름\"},{\"text\":\"을 선택합니다.\"}],\"id\":\"HeMZHTr81tgHW5ynbKjP3\",\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"도메인 이름 추가\"},{\"text\":\"를 클릭하여 도메인 이름 정보를 구성합니다.\"}],\"id\":\"qeBHbLmb0fITo9jVITHl_\",\"type\":\"oli\"},{\"children\":[{\"text\":\"도메인 이름: 준비된 사용자 정의 도메인 이름을 입력합니다.\"}],\"id\":\"aganLHDt7K3sXiBRyh-Bs\",\"type\":\"uli\"},{\"children\":[{\"text\":\"원본 서버 유형: 다음과 같은 몇 가지로 구분됩니다.\"}],\"id\":\"VSNtV-TDmQ3hxL7W7ywSm\",\"type\":\"uli\"},{\"children\":[{\"text\":\"기본 원본 서버: 사용자 정의 도메인 이름을 기본 원본 서버로 사용하려면 기본 원본 서버를 선택하십시오.\"}],\"id\":\"2iUMuR8WzZPIw7lIMJUTE\",\"type\":\"uli\",\"indent\":1},{\"children\":[{\"text\":\"정적 웹사이트 원본 서버: 사용자 정의 도메인 이름을 정적 웹사이트로 사용하려면 먼저 버킷에 대해 정적 웹사이트 기능을 활성화한 다음 정적 웹사이트 원본 서버를 선택하십시오.\"}],\"id\":\"0chKbu2D4h2Efh_Qs6AJc\",\"type\":\"uli\",\"indent\":1},{\"children\":[{\"text\":\"글로벌 가속 원본 서버: 사용자 정의 도메인 이름을 글로벌 가속으로 사용하려면 먼저 버킷에 대해 글로벌 가속 기능을 활성화한 다음 글로벌 가속 원본 서버를 선택하십시오.\"}],\"id\":\"wINNCIR_BB0O53YM8q4NV\",\"type\":\"uli\",\"indent\":1},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"주의:\"}],\"id\":\"fvt5LNEJk_csutP5pseDm\",\"type\":\"p\"},{\"children\":[{\"text\":\"도메인 추가, 온라인 또는 오프라인 조작은 즉시 적용되지 않습니다. 실제 구성에는 일정 시간이 걸리며 일반적으로 30분 후에 적용되며 도메인의 실제 액세스 상태를 기준으로 합니다.\"}],\"id\":\"Mv6WMkENDGKOZCr_8dDV8\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"v1DR2DB4BSmc6IXq0E-cs\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"HTTPS 인증서를 구성합니다. HTTPS 프로토콜을 사용하여 액세스해야 하는 경우 사용자 정의 도메인 이름에 대해 인증서를 구성해야 합니다.\"}],\"id\":\"zjl-twahvX2hDnnepKZOU\",\"type\":\"oli\"},{\"children\":[{\"text\":\"자체 인증서를 사용해야 하는 경우 인증서 내용 및 비밀키 내용을 지정 입력 상자에 붙혀넣어야 합니다.\"}],\"id\":\"Rqhy50Jiv7alB0O-sLTyS\",\"type\":\"uli\"},{\"children\":[{\"text\":\"Tencent Cloud에서 신청한 인증서를 사용하는 경우 직접 팝업창에서 현재 계정에 있는 Tencent Cloud 인증서를 선택할 수 있습니다.\"}],\"id\":\"Z3nSBmGoMD3-NwMo07kIS\",\"type\":\"uli\"},{\"children\":[{\"text\":\"사용자 정의 도메인 이름 구성 완료 후, 후속 도메인 이름 해석을 구성하기 위해 CNAME난의 정보(예: bucket-1250000000.cos.ap-beijing.myqcloud.com)를 기록합니다.\"}],\"id\":\"fWxaFZHsKpQcD5NCQqeDS\",\"type\":\"oli\"},{\"children\":[{\"text\":\"세 번째 단계: 도메인 이름 해석 구성\"}],\"id\":\"Ioe-fchVN-HUOlgU8gRYT\",\"nodeId\":\"c189e8a0-ab70-49a6-8316-9762b13550da\",\"type\":\"h2\"},{\"children\":[{\"text\":\"해당 DNS 서비스에서 CNAME 레코드를 구성합니다. 주요 작업 단계는 다음과 같습니다.\"}],\"id\":\"FzgODjEbxEK7YTETwFhe7\",\"type\":\"p\"},{\"children\":[{\"text\":\"도메인 추가: 해석할 사용자 정의 오리진 서버 도메인을 입력합니다. 예: www.example.com.\"}],\"id\":\"khuPAuerFva9hKTvy_Djc\",\"type\":\"oli\"},{\"at\":[33],\"children\":[{\"text\":\"레코드 추가: 사용자 정의 오리진 서버 도메인에 \"},{\"b\":1,\"text\":\"CNAME 레코드 유형\"},{\"text\":\"의 해석 레코드를 추가합니다. 레코드 값은 CNAME이 가리키는 버킷 기본 오리진 서버 도메인입니다. 예: bucket-1250000000.cos.ap-beijing.myqcloud.com.\"}],\"id\":\"VLiXtu75ykDkjFl3FvnxQ\",\"type\":\"oli\"},{\"children\":[{\"text\":\"해석이 성공했는지 확인합니다. 해석 레코드는 일정 시간이 걸릴 수 있습니다. dig 명령어 또는 \"},{\"children\":[{\"text\":\"COS 콘솔\"}],\"id\":\"rlizGLoWaX-DvHSyNWajT\",\"title\":\"https://console.tencentcloud.com/cos/bucket\",\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos/bucket\"},{\"text\":\"을 통해 해석이 성공했는지 확인할 수 있습니다. 확인 방법은 다음과 같습니다.\"}],\"id\":\"yCia-aLeen5kdPn2pW280\",\"type\":\"oli\"},{\"children\":[{\"text\":\"명령 프롬프트 창에 명령을 입력합니다. \"},{\"code\":1,\"text\":\"dig mydomain.com\"},{\"text\":\". CNAME 레코드가 제대로 작동하는지 확인합니다. (사용 시 \"},{\"code\":1,\"text\":\"mydomain.com\"},{\"text\":\"을 사용자 정의 도메인으로 바꿉니다.)\"}],\"id\":\"jXXBO_-cx6Vl7RDaeOwTq\",\"indent\":1,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"COS 콘솔\"}],\"id\":\"a73keOowClK23tc1SEiLU\",\"title\":\"https://console.tencentcloud.com/cos/bucket\",\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos/bucket\"},{\"text\":\"에 로그인하여 버킷 사용자 정의 도메인을 확인합니다. 도메인 이름의 CNAME이 성공적으로 적용되지 않으면 해당 메시지가 표시됩니다.\"}],\"id\":\"RPSqZzrUFefsJGV4blBMH\",\"indent\":1,\"type\":\"uli\"},{\"children\":[{\"text\":\"네 번째 단계: 사용자 정의 도메인 이름 액세스\"}],\"id\":\"vMKc2i0ZXNRwF6BOaGblk\",\"nodeId\":\"c31570f4-c3c8-4e2a-a9bb-1716a1335722\",\"type\":\"h2\"},{\"children\":[{\"text\":\"상기 단계를 거쳐 사용자 정의 도메인 이름의 구성을 완료하였습니다. 아래에서는 사용자 정의 도메인 이름을 사용하여 COS에 액세스하는 방법에 대해 설명합니다.\"}],\"id\":\"GjMsSggw8Ny-ZYU0sMURF\",\"type\":\"p\"},{\"children\":[{\"text\":\"객체 액세스 링크 확인\"}],\"id\":\"la5mvzIAdrvMlXPYkd3zt\",\"nodeId\":\"333d8748-9a1d-41da-b99f-9c2a2a7b04ae\",\"type\":\"h3\"},{\"children\":[{\"children\":[{\"text\":\"COS 콘솔\"}],\"id\":\"o6E52yY5AZ59xBFoqi1rT\",\"title\":\"https://console.tencentcloud.com/cos/bucket\",\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos/bucket\"},{\"text\":\"에 로그인하여 사용자 정의 도메인 이름이 구성된 버킷을 찾고 클릭하여 \"},{\"b\":1,\"text\":\"파일 목록\"},{\"text\":\"으로 들어갑니다. 하나의 객체를 선택하고 객체 상세정보로 들어갑니다. 조작 안내는 \"},{\"children\":[{\"text\":\"객체 정보 조회\"}],\"id\":\"eIzZEVxb-TwvJI_M1WwEU\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/13326\"},\"type\":\"ref\"},{\"text\":\"를 참고하시기 바랍니다.\"}],\"id\":\"_m_slrisVhlbh3vpHBBRL\",\"type\":\"oli\"},{\"children\":[{\"text\":\"지정된 도메인 이름을 \"},{\"b\":1,\"text\":\"사용자 정의 원본 서버 도메인 이름\"},{\"text\":\"으로 전환합니다. 아래의 객체 주소, 임시 링크는 사용자 정의 도메인 이름의 링크로 전환됩니다. 공개 읽기 객체에 액세스할 때 객체 주소(서명 없음)를 사용하고 비공개 읽기 객체에 액세스할 때 임시 링크(서명 있음)를 사용할 수 있습니다.\"}],\"id\":\"p57wAsGH5_ThbbvbUmy4S\",\"type\":\"oli\"},{\"children\":[{\"text\":\"API 액세스를 위한 사용자 정의 도메인 이름 전환\"}],\"id\":\"FkuEC-L9AANKKxW0titIc\",\"nodeId\":\"eaee18a6-a9af-4775-951f-d5133a35914e\",\"type\":\"h3\"},{\"children\":[{\"text\":\"직접 API를 사용하여 COS에 액세스하는 경우 액세스할 때 요청 Host를 사용자 정의 도메인 이름으로 전환하면 됩니다.\"}],\"id\":\"h3TJ4klONA_KPVoSoRya1\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"GET /\\\\<0bjectKey> HTTP/1.1\"}],\"id\":\"psxG8cq5VanRtiof48HQp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"Host: .cos..myqcloud.com # 사용자 정의 도메인 이름으로 교체\"}],\"id\":\"xpmRyrCE_opIszh3rKF1w\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"Date: GMT Date\"}],\"id\":\"8w0KZwHKqertpWULJWOc4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"Authorization: Auth String\"}],\"id\":\"Kof--NH34unlOmOfY1HUX\",\"type\":\"code-line\"}],\"id\":\"dohLfGtc8PRJLuCM4ZYht\",\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"SDK 액세스를 위한 사용자 정의 도메인 이름 전환\"}],\"id\":\"nyIBXxK5KJLW9PPCrYWcU\",\"nodeId\":\"ee96a61c-83ec-4229-8f2d-70b590c5467c\",\"type\":\"h3\"},{\"children\":[{\"text\":\"SDK를 사용하는 경우 Client를 초기화할 때 domain 매개변수를 사용자 정의 도메인 이름으로 설정하면 됩니다. Python SDK로 예를 들면, 코드 예는 다음과 같습니다.\"}],\"id\":\"j0xwb_iQdA9xLyNife2EJ\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"domain = 'user-define.example.com' # 사용자 정의 도메인 이름\"}],\"id\":\"MboprheG1yIF0tr1orNAW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Domain=domain, Scheme=scheme)\"}],\"id\":\"SJYtTC4g7v9vIoYroQyiF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"client = CosS3Client(config)\"}],\"id\":\"hWH2QQK4WrS48Y7DjQDKC\",\"type\":\"code-line\"}],\"id\":\"afKK1CgR6M7UkY8W-rZ1C\",\"language\":\"python\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"각 언어의 COS SDK에서 사용자 정의 도메인 이름으로 전환하는 코드 예는 다음 문서를 참고하시기 바랍니다.\"}],\"id\":\"7S-ymwWRohqdhQw8HHbGq\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"text\":\"Go SDK\"}],\"id\":\"GOVieUxIjwFzWgCs9VNFb\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/42381\"},\"type\":\"ref\"}],\"id\":\"BRQSEWC6G-YpuaRN3OydB\",\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"JAVA SDK\"}],\"id\":\"BSO4fmYczla82f7LNOgRp\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/40244\"},\"type\":\"ref\"}],\"id\":\"Y_0sUZ-k-U2xECoLzjZJR\",\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"Python SDK\"}],\"id\":\"ZFa1K8NRzA_jqBsE0zDWh\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/46484\"},\"type\":\"ref\"}],\"id\":\"2hPPAM6pA7QZwDVEWdbAY\",\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"PHP SDK\"}],\"id\":\"KMp7YtslkSBadSkB_vBkM\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/42839\"},\"type\":\"ref\"}],\"id\":\"ODr0wfmvlm_LiuBi7-ykj\",\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"Android SDK\"}],\"id\":\"TY9poJdLfJAAhXYECxKZZ\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/37880\"},\"type\":\"ref\"}],\"id\":\"8wHO9I6wlRmk2ZRKdCQe6\",\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"iOS SDK\"}],\"id\":\"RUFDKS8V-yR1-F4yjRail\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/38113\"},\"type\":\"ref\"}],\"id\":\"wam2l6K-mYLN6Askd_T5e\",\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"JS SDK\"}],\"id\":\"5R7aVSZndS6iHt6RB7vqe\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/40542\"},\"type\":\"ref\"}],\"id\":\"W0USX28urBAxHwNBDh1Zk\",\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"Node.js SDK\"}],\"id\":\"II6eyy0SNvDp7MWHn-aBX\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/40228\"},\"type\":\"ref\"}],\"id\":\"eNcHZme26gVrDQS3ReRQs\",\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\".NET SDK\"}],\"id\":\"cLFvzn1AY7cWBcsLiOFWL\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/38073\"},\"type\":\"ref\"}],\"id\":\"GLrLmzisb9hilDt0rBOXk\",\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"C++ SDK\"}],\"id\":\"r4ncq5ilsCmVUQ0QaZqZN\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/45507\"},\"type\":\"ref\"}],\"id\":\"ombPeyle4mJNkzlo2a9bp\",\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"C 언어 SDK\"}],\"id\":\"ZjJqUcBSB_nj6zol1CTvN\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/45508\"},\"type\":\"ref\"}],\"id\":\"0hUg5coxiCNp7_thEHxC7\",\"type\":\"uli\"},{\"children\":[{\"children\":[{\"text\":\"미니 프로그램 SDK\"}],\"id\":\"L4DWwqsAo3DIQ8BaOAo9n\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/40229\"},\"type\":\"ref\"}],\"id\":\"2LcT9P-hQeHLDSDQitbHH\",\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"id\":\"MCmnzS1KsuezwYVa8gglb\",\"type\":\"p\"}]"}},"66933":{"categoryId":436,"weight":1,"type":"page","extension":"","pid":32966,"id":66933,"lang":"ko","title":"Gzip 압축을 지원하는 사용자 정의 CDN 도메인 이름 구성","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2024-12-16 23:41:41","recentReleaseTime":"2024-12-16 23:41:41","content":{"title":"Gzip 압축을 지원하는 사용자 정의 CDN 도메인 이름 구성","body":"

소개

본 문서는 COS(Cloud Object Storage) 콘솔에서 Gzip 압축을 구성하는 방법만 소개합니다. CDN 콘솔에서 추가하려면 CDN 스마트 압축 설정 문서를 참고하기시 바랍니다.

조작 절차

1. COS 콘솔 에 로그인합니다.
2. 왼쪽 네비게이션바에서 버킷 리스트 를 클릭하여 버킷 리스트 페이지로 이동합니다.
3. Gzip 압축 구성이 필요한 버킷을 클릭하여 버킷 구성 페이지로 이동합니다.
4. 좌측의 도메인 이름과 전송 관리 > 사용자 정의 CDN 가속 도메인 이름 구성 항목을 클릭합니다. 사용 가능한 도메인 이름이 없으면 먼저 도메인 이름을 추가하십시오. 구체적인 구성은 사용자 정의 CDN 가속 도메인 이름 활성화 를 참고하시기 바랍니다.

\"\"


5. 도메인 이름 추가에 성공하면, 기본적으로 이 도메인 이름에 대해 CDN 스마트 압축 기능을 활성화하고 하나의 Gzip 압축 규칙을 생성합니다.
이 Gzip 압축 규칙은 아래와 같습니다.
유형: 파일 접미사
내용: js;html;css;xml;json;shtml;htm
파일 범위: 256Byte ~ 2MB
압축 방식: Gzip
6. 개인화 구성 열의 CDN 스마트 압축에서 Gzip 압축의 구성 상태 및 구성된 압축 방식을 확인할 수 있습니다.
‘구성되지 않음’은 CDN 스마트 압축 구성이 활성화되지 않은 상태를 나타냅니다.
전송 파일 크기를 줄이고 오버헤드를 절약하기 위해, CDN 스마트 압축 기능을 활성화하는 것을 추천합니다.
\"\"

아이콘을 클릭하고, 안내에 따라 CDN 콘솔을 클릭하여 CDN 콘솔로 빠르게 이동하여 구성할 수 있습니다. 작업 가이드는 스마트 압축 구성 을 참고하시기 바랍니다.
‘gzip’ 또는 기타 필드는 현재 구성된 압축 방식을 나타냅니다.
CDN 스마트 압축 규칙(예를 들어 압축 방식, 유형, 내용, 파일 범위 등)을 새로 추가, 수정 또는 조회하려면
\"\"

아이콘을 클릭하고, 안내에 따라 CDN 콘솔을 클릭하여 CDN 콘솔로 빠르게 이동하여 설정할 수 있습니다. 작업 가이드는 스마트 압축 구성 을 참고하시기 바랍니다.
설명
구성 제약, 규칙 적용 우선순위 등과 같은 스마트 압축 구성 규칙에 관한 더 많은 정보는 CDN(Content Delivery Network) 구성 가이드의 스마트 압축 구성 을 참고하시기 바랍니다.
","recentReleaseTime":"2024-12-16 16:34:05","slate":"[{\"children\":[{\"text\":\"소개\"}],\"id\":\"v6oeNjQMzNry3dtVG7RsP\",\"nodeId\":\"1a75cb03-5bdd-43c5-b200-f93eabe1c685\",\"type\":\"h2\"},{\"children\":[{\"text\":\"본 문서는 COS(Cloud Object Storage) 콘솔에서 Gzip 압축을 구성하는 방법만 소개합니다. CDN 콘솔에서 추가하려면 CDN \"},{\"children\":[{\"text\":\"스마트 압축 설정\"}],\"id\":\"xZF4d4JuakOxX1hSFKGRL\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/228/35220\"},\"type\":\"ref\"},{\"text\":\" 문서를 참고하기시 바랍니다.\"}],\"id\":\"vb3AP1IbpVWY6okNPTiQO\",\"type\":\"p\"},{\"children\":[{\"text\":\"조작 절차\"}],\"id\":\"bMTBoGx0WP8pE_I2hgreq\",\"nodeId\":\"ebb354b7-50d7-4410-a354-8fb819539ea3\",\"type\":\"h2\"},{\"children\":[{\"text\":\"\"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"children\":[{\"text\":\"COS 콘솔\"}],\"id\":\"EjPpwbfITj7_zpGPWScYj\"},{\"text\":\" 에 로그인합니다.\"}],\"id\":\"czL4b8ltQ-qJs0WACkto-\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"왼쪽 네비게이션바에서 \"},{\"b\":1,\"text\":\"버킷 리스트 \"},{\"text\":\"를 클릭하여 버킷 리스트 페이지로 이동합니다.\"}],\"id\":\"S9WfCj5AplXq3L7FeufxA\",\"type\":\"oli\"},{\"children\":[{\"text\":\"Gzip 압축 구성이 필요한 버킷을 클릭하여 버킷 구성 페이지로 이동합니다.\"}],\"id\":\"A5mMSxu3RuB3BpHlqAodi\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"좌측의 \"},{\"b\":1,\"text\":\"도메인 이름과 전송 관리 > 사용자 정의 CDN 가속 도메인 이름\"},{\"text\":\" 구성 항목을 클릭합니다. 사용 가능한 도메인 이름이 없으면 먼저 도메인 이름을 추가하십시오. 구체적인 구성은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/zh/document/product/436/31505\"},\"children\":[{\"text\":\"사용자 정의 CDN 가속 도메인 이름 활성화\"}],\"id\":\"j8DAntXcQ1kRPUSFSdfmu\"},{\"text\":\" 를 참고하시기 바랍니다.\"}],\"id\":\"I-GALumteAOaqj8BsetTN\",\"type\":\"oli\"},{\"children\":[{\"text\":\"\"},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/40bd0a75b93311ef86025254002693fd.png\",\"alt\":\"\",\"inline\":true,\"children\":[{\"text\":\"\"}],\"id\":\"HOf9Zx_BQWhNao-s1DXvo\",\"naturalSize\":[2724,240],\"size\":[953,83]},{\"text\":\"\"}],\"id\":\"YS6Qi1JVgvtlxvpQytP5q\",\"type\":\"p\",\"indent\":1},{\"id\":\"kSkyuiAGXhm7jIaUYRZx-\",\"type\":\"oli\",\"children\":[{\"text\":\"도메인 이름 추가에 성공하면, 기본적으로 이 도메인 이름에 대해 CDN 스마트 압축 기능을 활성화하고 하나의 Gzip 압축 규칙을 생성합니다.\"}]},{\"children\":[{\"text\":\"이 Gzip 압축 규칙은 아래와 같습니다.\"}],\"id\":\"C82IhVgw3g5T0bhl2KyoK\",\"indent\":1,\"type\":\"p\"},{\"children\":[{\"b\":1,\"text\":\"유형: \"},{\"text\":\"파일 접미사\"}],\"id\":\"8VWLz0yMpFaqDLfkmx1Di\",\"indent\":1,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"내용: \"},{\"text\":\"js;html;css;xml;json;shtml;htm\"}],\"id\":\"Nwld6EGbAYun7ALw-Mdy7\",\"indent\":1,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"파일 범위: \"},{\"text\":\"256Byte ~\"},{\"text\":\" 2MB\"}],\"id\":\"k_j-GdIwaTGRmzUBxKtFX\",\"indent\":1,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"압축 방식: \"},{\"text\":\"Gzip\"}],\"id\":\"lcMT8HBLppD5wp-8Mw1l-\",\"indent\":1,\"type\":\"uli\"},{\"children\":[{\"b\":1,\"text\":\"개인화 구성\"},{\"text\":\" 열의 \"},{\"b\":1,\"text\":\"CDN 스마트 압축\"},{\"text\":\"에서 Gzip 압축의 구성 상태 및 구성된 압축 방식을 확인할 수 있습니다.\"}],\"id\":\"m_0feK12P7eK7fEJGMc5s\",\"type\":\"oli\"},{\"children\":[{\"text\":\"‘구성되지 않음’은 CDN 스마트 압축 구성이 활성화되지 않은 상태를 나타냅니다.\"}],\"id\":\"axTUyg4P7SfFU2NKYCtFP\",\"indent\":1,\"type\":\"uli\"},{\"children\":[{\"text\":\"전송 파일 크기를 줄이고 오버헤드를 절약하기 위해, CDN 스마트 압축 기능을 활성화하는 것을 추천합니다. \"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"9sq-GeoUcGpeQZ02dL4U2\",\"inline\":true,\"naturalSize\":[65,56],\"size\":[28,24],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/4847bfeab7a911ef9cb452540075b605.png\"},{\"text\":\" 아이콘을 클릭하고, 안내에 따라 \"},{\"b\":1,\"text\":\"CDN 콘솔\"},{\"text\":\"을 클릭하여 CDN 콘솔로 빠르게 이동하여 구성할 수 있습니다. 작업 가이드는 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/228/35220\"},\"children\":[{\"text\":\"스마트 압축 구성\"}],\"id\":\"yuYHF6v6T5V3maWhZsgh-\"},{\"text\":\" 을 참고하시기 바랍니다.\"}],\"id\":\"NY0nipWjFQoDIS4GueKgY\",\"indent\":2,\"type\":\"p\"},{\"children\":[{\"text\":\"‘gzip’ 또는 기타 필드는 현재 구성된 압축 방식을 나타냅니다.\"}],\"id\":\"BpmFxKcyoYM7rY8ix_Chv\",\"indent\":1,\"type\":\"uli\"},{\"children\":[{\"text\":\"CDN 스마트 압축 규칙(예를 들어 압축 방식, 유형, 내용, 파일 범위 등)을 새로 추가, 수정 또는 조회하려면 \"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"J95jMNTK7SIzDeMy9AjOv\",\"inline\":true,\"naturalSize\":[63,53],\"size\":[28,23],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/64177a0cb7a911efa1ff525400bdab9d.png\"},{\"text\":\" 아이콘을 클릭하고, 안내에 따라 \"},{\"b\":1,\"text\":\"CDN 콘솔\"},{\"text\":\"을 클릭하여 CDN 콘솔로 빠르게 이동하여 설정할 수 있습니다. 작업 가이드는 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/228/35220\"},\"children\":[{\"text\":\"스마트 압축 구성\"}],\"id\":\"NOF4M1NEQfgnpOyG7aQNQ\"},{\"text\":\" 을 참고하시기 바랍니다.\"}],\"id\":\"8iGzLMVdACgC6ogxwTGwR\",\"indent\":2,\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"설명\"}],\"id\":\"Fpjj9t3n09Wsh3AmV3sdZ\",\"type\":\"p\"},{\"children\":[{\"text\":\"구성 제약, 규칙 적용 우선순위 등과 같은 스마트 압축 구성 규칙에 관한 더 많은 정보는 CDN(Content Delivery Network) 구성 가이드의 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/228/35220\"},\"children\":[{\"text\":\"스마트 압축 구성\"}],\"id\":\"HnKupjq9TyHa0PSiAdmps\"},{\"text\":\" 을 참고하시기 바랍니다.\"}],\"id\":\"CWsp-KIawg5g3dvONPakv\",\"type\":\"p\"}],\"hintType\":\"info\",\"id\":\"42ZdPI7yKy5I6kPR01cME\",\"indent\":1,\"type\":\"hint\"}]"}},"69252":{"categoryId":436,"weight":1,"type":"page","extension":"","pid":34079,"id":69252,"lang":"ko","title":"COS+snapshot을 통한 자체 구축 ES에서 Tencent Cloud ES로의 데이터 마이그레이션 및 복구","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2025-04-17 18:33:09","recentReleaseTime":"2025-04-17 18:33:09","content":{"title":"COS+snapshot을 통한 자체 구축 ES에서 Tencent Cloud ES로의 데이터 마이그레이션 및 복구","body":"

소개

Tencent Cloud Elasticsearch Service(ES)는 오픈소스 검색 엔진 Elasticsearch를 기반으로 한 고가용성, 확장 가능한 완전 관리형 클라우드 Elasticsearch 서비스입니다. Kibana 및 주요 플러그인을 포함하며, 보안, SQL, 머신 러닝, 알림, 모니터링 등의 고급 기능(X-Pack)을 통합 제공합니다. Tencent Cloud ES를 통해 클러스터 신속 배포, 손쉬운 관리, 유동적 확장이 가능하며, 복잡한 운영 작업을 간소화하여 로그 분석, 이상 감시, 웹 검색, 기업 검색, BI 분석 등 다양한 비즈니스 구축을 가속화할 수 있습니다.
Tencent Cloud ES는 컴퓨팅, 스토리지, 보안 등 분야의 선도적인 기술 우위를 결합하며 Elasticsearch의 호환성과 개방성을 유지합니다. 풍부한 클러스터 관리 기능 및 보안성, 유연성, 고가용성 등 특성을 갖추고 있으며, 공식 고급 X-Pack 상용 기능을 통합하여 오픈 소스 엔진 기반에 권한 관리, SQL, 머신 러닝, 경고 등 추가 기능을 제공합니다. 이를 통해 클러스터 배포, 운영 관리 등 기반 운영 업무를 단순화하고 업무 본질에 집중할 수 있습니다.
Tencent Cloud ES를 통해 웹사이트 검색 네비게이션, 엔터프라이즈 검색, 서비스 로그 이상 모니터링, 클릭스트림 분석 등과 같은 대용량 데이터 저장 및 검색, 실시간 로그 분석 등의 애플리케이션을 신속하게 구축할 수 있습니다.
ES와 COS 간 사용 시나리오는 주로 데이터 마이그레이션, 데이터 복구 및 백업에 집중되어 있습니다. 원리는 원본 ES 데이터가 COS에 중간 저장된 후, 저장된 데이터를 대상 ES 클러스터로 비동기 복구하는 방식입니다.

준비 작업

공개 읽기, 비공개 쓰기 권한의 버킷을 하나 생성해야 합니다. 버킷 생성 문서를 참조하십시오.
주의:
COS bucket 리전은 ES와 동일해야 합니다.

COS 플러그인 설치

Tencent Cloud ES는 기본적으로 내부에 해당 플러그인이 통합되어 있습니다. 그러나 사용자가 자체 구축한 ES 클러스터에서 COS를 사용하려면, 해당 ES 버전에 맞는 COS 플러그인을 설치해야 합니다.

COS 플러그인 기능

사용자가 자체 구축한 클러스터에서 스냅샷 파일을 직접 COS bucket에 백업할 수 있으며, 이후 대상 클러스터에서 복구 작업을 진행할 수 있습니다.

플러그인 다운로드

Github에서 Tencent Cloud ES COS 플러그인을 다운로드할 수 있습니다. 본 실습에서는 플러그인 7.2.0 버전을 예시로 설명합니다. 다른 버전의 차이점에 대해서는 releases를 참조하십시오.

플러그인 설치 절차

1. 사용 중인 ES 버전에 맞는 플러그인을 다운로드합니다. (예: 7.2.0 버전)
2. ES 시작 계정(elastic)에게 해당 플러그인 파일의 모든 권한을 부여합니다.
\"\"

3. 일반 사용자 계정으로 전환 후 플러그인을 설치하고 ES 서비스를 재시작합니다. 주의: 클러스터 내 모든 노드에서 작업을 수행해야 합니다. 실행 명령어는 아래와 같습니다.
bin/elasticsearch-plugin install file:///path/repository-cos.zip
아래 그림과 같습니다.
\"\"

4. 설치 완료 후, kibana에서 get _cat/plugins 명령어를 통해 플러그인 설치 여부를 확인할 수 있습니다. 설치 성공 시 결과가 표시됩니다.
\"\"


COS를 통한 자체 구축 ES와 Tencent Cloud ES 간 데이터 마이그레이션

1. 로컬 클러스터에서 COS 저장소를 등록합니다.
PUT _snapshot/my_cos_backup
{
"type": "cos",
"settings": {
"access_key_id": "xxxxxx",
"access_key_secret": "xxxxxxx",
"bucket": "appId 접미사가 없는 bucket 이름",
"region": "ap-guangzhou",
"compress": true,
"chunk_size": "500mb",
"base_path": "/yourbasepath",
"app_id": "xxxxxxx"
}
}
이 명령어를 실행하면 해당 COS bucket의 지정된 base_path 경로 아래에 my_cos_backup 저장소가 생성됩니다.
매개변수 설명은 다음과 같습니다.
매개변수 이름
매개변수 설명
access_key_id, access_key_secret
키 정보는 API 키에서 생성 및 조회 가능합니다.
bucket
버킷 이름(appid 포함 금지).
app_id
APPID는 Tencent Cloud 계정을 신청한 후 시스템이 할당하는 계정 식별자 중 하나로, Tencent Cloud 콘솔 [계정 정보]에서 확인할 수 있습니다.
region
버킷이 위치한 리전. COS 리전의 약자는 리전 및 액세스 도메인을 참조하십시오.
base_path
백업 디렉토리 경로, /dir1/dir2/dir3 형식이며 맨 앞에 /를 붙이고, 마지막 /는 생략합니다.
주의:
플러그인 버전이 8.15.1 인 경우, 매개변수 이름 앞에 cos.client 접두사가 추가됩니다. (예: cos.client.access_key_id)
2. 로컬 저장소에 스냅샷 파일을 생성하면 생성된 스냅샷 파일은 자동으로 지정된 COS 저장소에 업로드됩니다. put _snapshot/저장소명/스냅샷명 명령으로 스냅샷을 실행할 수 있습니다.
3. Tencent Cloud ES에서도 동일하게 저장소를 등록합니다. 저장소명은 달라도 됩니다.
PUT _snapshot/my_cos_backup
{
"type": "cos",
"settings": {
"access_key_id": "xxxxxx",
"access_key_secret": "xxxxxxx",
"bucket": "appId 접미사가 없는 bucket 이름",
"region": "ap-guangzhou",
"compress": true,
"chunk_size": "500mb",
"base_path": "/yourbasepath",
"app_id": "xxxxxxx"
}
}
4. Tencent Cloud ES에서 복구를 실행하려면 다음 명령으로 스냅샷 복구를 실행합니다.
POST _snapshot/저장소명/스냅샷명/_restore
주의:
복구하려는 스냅샷명은 원본 클러스터에서 생성한 스냅샷명과 동일해야 합니다.
","recentReleaseTime":"2025-04-17 18:26:55","slate":"[{\"children\":[{\"text\":\"소개\"}],\"id\":\"TXfcpME1h4Fz1qt-UTxlN\",\"nodeId\":\".E7.AE.80.E4.BB.8B\",\"type\":\"h2\"},{\"children\":[{\"text\":\" Tencent Cloud Elasticsearch Service(ES)는 오픈소스 검색 엔진 Elasticsearch를 기반으로 한 고가용성, 확장 가능한 완전 관리형 클라우드 Elasticsearch 서비스입니다. Kibana 및 주요 플러그인을 포함하며, 보안, SQL, 머신 러닝, 알림, 모니터링 등의 고급 기능(X-Pack)을 통합 제공합니다. Tencent Cloud ES를 통해 클러스터 신속 배포, 손쉬운 관리, 유동적 확장이 가능하며, 복잡한 운영 작업을 간소화하여 로그 분석, 이상 감시, 웹 검색, 기업 검색, BI 분석 등 다양한 비즈니스 구축을 가속화할 수 있습니다.\"}],\"id\":\"DdujhsLAiYWK1c4KLbVl8\",\"type\":\"p\"},{\"children\":[{\"text\":\"Tencent Cloud ES는 컴퓨팅, 스토리지, 보안 등 분야의 선도적인 기술 우위를 결합하며 Elasticsearch의 호환성과 개방성을 유지합니다. 풍부한 클러스터 관리 기능 및 보안성, 유연성, 고가용성 등 특성을 갖추고 있으며, 공식 고급 X-Pack 상용 기능을 통합하여 오픈 소스 엔진 기반에 권한 관리, SQL, 머신 러닝, 경고 등 추가 기능을 제공합니다. 이를 통해 클러스터 배포, 운영 관리 등 기반 운영 업무를 단순화하고 업무 본질에 집중할 수 있습니다.\"}],\"id\":\"YAPWFGdBTaGPkKquQkA4P\",\"type\":\"p\"},{\"children\":[{\"text\":\"Tencent Cloud ES를 통해 웹사이트 검색 네비게이션, 엔터프라이즈 검색, 서비스 로그 이상 모니터링, 클릭스트림 분석 등과 같은 대용량 데이터 저장 및 검색, 실시간 로그 분석 등의 애플리케이션을 신속하게 구축할 수 있습니다.\"}],\"id\":\"Ax8ILlv0NfXsU_iCgdmzn\",\"type\":\"p\"},{\"children\":[{\"text\":\"ES와 COS 간 사용 시나리오는 주로 데이터 마이그레이션, 데이터 복구 및 백업에 집중되어 있습니다. 원리는 원본 ES 데이터가 COS에 중간 저장된 후, 저장된 데이터를 대상 ES 클러스터로 비동기 복구하는 방식입니다.\"}],\"id\":\"iQPFGTEGbQImSxfA5LDPe\",\"type\":\"p\"},{\"children\":[{\"text\":\"준비 작업\"}],\"id\":\"Liq369KgoH_2MT9dof8qQ\",\"nodeId\":\".E5.87.86.E5.A4.87.E5.B7.A5.E4.BD.9C\",\"type\":\"h2\"},{\"children\":[{\"b\":1,\"text\":\"공개 읽기, 비공개 쓰기\"},{\"text\":\" 권한의 버킷을 하나 생성해야 합니다. \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"id\":\"MGRs_raa4lLaab9oAa_lV\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/13309\"},\"type\":\"ref\"},{\"text\":\" 문서를 참조하십시오.\"}],\"id\":\"70EZG5FOyeSt2zNjXGEoT\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"주의:\"}],\"id\":\"DrPHKqVFaI9rnRtp_2-6H\",\"type\":\"p\"},{\"children\":[{\"text\":\"COS bucket 리전은 ES와 동일해야 합니다.\"}],\"id\":\"efDJFc5x-PySDl0UdYdOm\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"m-H-VauRxNuF7szuha4qP\",\"type\":\"hint\"},{\"children\":[{\"text\":\"COS 플러그인 설치\"}],\"id\":\"L4SNIt4OWsm9vP4PnFJt4\",\"nodeId\":\".E5.AE.89.E8.A3.85-cos-.E6.8F.92.E4.BB.B6\",\"type\":\"h2\"},{\"children\":[{\"text\":\"Tencent Cloud ES는 기본적으로 내부에 해당 플러그인이 통합되어 있습니다. 그러나 사용자가 자체 구축한 ES 클러스터에서 COS를 사용하려면, 해당 ES 버전에 맞는 COS 플러그인을 설치해야 합니다.\"}],\"id\":\"7HDrWPY_K_Dr1WAIy4Tpl\",\"type\":\"p\"},{\"children\":[{\"text\":\"COS 플러그인 기능\"}],\"id\":\"izfVN9U7uCG9PhZirfdep\",\"nodeId\":\"cos-.E6.8F.92.E4.BB.B6.E7.9A.84.E5.8A.9F.E8.83.BD\",\"type\":\"h3\"},{\"children\":[{\"text\":\"사용자가 자체 구축한 클러스터에서 스냅샷 파일을 직접 COS bucket에 백업할 수 있으며, 이후 대상 클러스터에서 복구 작업을 진행할 수 있습니다.\"}],\"id\":\"DGfTrUTXGJLPG9WNoFcs5\",\"type\":\"p\"},{\"children\":[{\"text\":\"플러그인 다운로드\"}],\"id\":\"5_024gPN986J4BDTkGbej\",\"nodeId\":\".E4.B8.8B.E8.BD.BD.E6.8F.92.E4.BB.B6\",\"type\":\"h3\"},{\"children\":[{\"children\":[{\"text\":\"Github\"}],\"id\":\"_0sJdDElL5y5QiRSxon0m\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/elasticsearch-repository-cos\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/elasticsearch-repository-cos\"},\"type\":\"ref\"},{\"text\":\"에서 Tencent Cloud ES COS 플러그인을 다운로드할 수 있습니다. 본 실습에서는 플러그인 7.2.0 버전을 예시로 설명합니다. 다른 버전의 차이점에 대해서는 \"},{\"children\":[{\"text\":\"releases\"}],\"id\":\"6HZWkbgr7lUp6vScOHRzk\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/elasticsearch-repository-cos/releases\"},\"type\":\"ref\"},{\"text\":\"를 참조하십시오.\"}],\"id\":\"K84EQRIwr8CJZOcNkFEnZ\",\"type\":\"p\"},{\"children\":[{\"text\":\"플러그인 설치 절차\"}],\"id\":\"epRFFGy8XrjNa1rARSoOX\",\"nodeId\":\".E6.8F.92.E4.BB.B6.E5.AE.89.E8.A3.85.E6.B5.81.E7.A8.8B\",\"type\":\"h3\"},{\"children\":[{\"text\":\"사용 중인 ES 버전에 맞는 플러그인을 다운로드합니다. (예: 7.2.0 버전)\"}],\"id\":\"fxQ9afJ2iGhFpzYFX-ZuW\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"ES 시작 계정(elastic)에게 해당 플러그인 파일의 모든 권한을 부여합니다.\"}],\"id\":\"TwNXh2LEzlF4fCUPiT00u\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"V_8T3g4nGDsuGAIMae3r4\",\"inline\":true,\"naturalSize\":[1458,132],\"size\":[948,85],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7d073057162c11ee9225525400088f3a.png\"}],\"id\":\"6KgOBYMPv7vZC6o6UyGN5\",\"indent\":1,\"start\":false,\"type\":\"p\"},{\"children\":[{\"text\":\"일반 사용자 계정으로 전환 후 플러그인을 설치하고 ES 서비스를 재시작합니다. 주의: 클러스터 내 모든 노드에서 작업을 수행해야 합니다. 실행 명령어는 아래와 같습니다.\"}],\"id\":\"Hy0cPmWdvg7VYfuJ49Td7\",\"start\":false,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"bin/elasticsearch-plugin install file:///path/repository-cos.zip\"}],\"id\":\"ItG9R-zoOUB0afpCniNxb\",\"type\":\"code-line\"}],\"id\":\"QF60LeU2wYZywVnF27MZp\",\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"아래 그림과 같습니다.\"}],\"id\":\"w2FrU3GWYjqVkJtCErH3Z\",\"indent\":1,\"type\":\"p\"},{\"children\":[{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"_ynlezYej56X9xmYr_UtP\",\"inline\":true,\"naturalSize\":[3288,636],\"size\":[948,183],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7d1e7721162c11ee9225525400088f3a.png\"}],\"id\":\"XiQvfrBxOaLS6hD9fQTRk\",\"indent\":1,\"type\":\"p\"},{\"children\":[{\"text\":\"설치 완료 후, kibana에서 \"},{\"code\":1,\"text\":\"get _cat/plugins\"},{\"text\":\" 명령어를 통해 플러그인 설치 여부를 확인할 수 있습니다. 설치 성공 시 결과가 표시됩니다.\"}],\"id\":\"mbNhSDwGH3__MdgTO0gx8\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"cdyYntoYJlrGZm9agZqKx\",\"inline\":true,\"naturalSize\":[558,160],\"size\":[357,102],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7d495dda162c11ee9225525400088f3a.png\"}],\"id\":\"FZfmcl2QFebsT9QrbCJNz\",\"indent\":1,\"start\":false,\"type\":\"p\"},{\"children\":[{\"text\":\"COS를 통한 자체 구축 ES와 Tencent Cloud ES 간 데이터 마이그레이션\"}],\"id\":\"MNXTEUYixqt6xAIElY7td\",\"nodeId\":\".E4.BD.BF.E7.94.A8-cos-.E5.AE.9E.E7.8E.B0.E8.87.AA.E5.BB.BA-es-.E4.B8.8E.E8.85.BE.E8.AE.AF.E4.BA.91-es-.E7.9A.84.E6.95.B0.E6.8D.AE.E8.BF.81.E7.A7.BB\",\"type\":\"h2\"},{\"children\":[{\"text\":\"로컬 클러스터에서 COS 저장소를 등록합니다.\"}],\"id\":\"eKoqEZ7vGDncNql7cK7b5\",\"start\":true,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"PUT _snapshot/my_cos_backup\"}],\"id\":\"KwS-0kA9DOJWJ3NKpukC9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"{\"}],\"id\":\"ehr9tjbp4GHq_kKA0z2w5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"type\\\": \\\"cos\\\",\"}],\"id\":\"_lYM2Omv7rJihH3Z6ClEt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"settings\\\": {\"}],\"id\":\"TPTqEcdAuuIbWiiK0d3eA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"access_key_id\\\": \\\"xxxxxx\\\",\"}],\"id\":\"-q7TSHokhixY26YX5bTmQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"access_key_secret\\\": \\\"xxxxxxx\\\",\"}],\"id\":\"iIxt1tOdbubt98RGU7VR9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"bucket\\\": \\\"appId 접미사가 없는 bucket 이름\\\",\"}],\"id\":\"T1e-DmgzGkwKa-ueLHrQN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"region\\\": \\\"ap-guangzhou\\\",\"}],\"id\":\"lQhZo-kH6FTNakTnB1KIy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"compress\\\": true,\"}],\"id\":\"yQ8WxHHhBYhgbROhRGBCe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"chunk_size\\\": \\\"500mb\\\",\"}],\"id\":\"4wJlfoaVzDuUTKeZl2hwr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"base_path\\\": \\\"/yourbasepath\\\",\"}],\"id\":\"hmjSxsZPX7yjBJih1cL7v\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"app_id\\\": \\\"xxxxxxx\\\" \"}],\"id\":\"lNtlQe3cZm_4rAjyvsPWB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"xSJZqunqCIFgZzI0DXgtN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"jcIpkaYVsuy0SxKCHUEJS\",\"type\":\"code-line\"}],\"id\":\"nHnN5BWUeVNDZW4ql8sTv\",\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"이 명령어를 실행하면 해당 COS bucket의 지정된 base_path 경로 아래에 my_cos_backup 저장소가 생성됩니다.\"}],\"id\":\"r7PFb81PH6RPP5Dw5p62H\",\"indent\":1,\"type\":\"p\"},{\"children\":[{\"text\":\"매개변수 설명은 다음과 같습니다.\"}],\"id\":\"sYuit_GWxs1T26GCIMWom\",\"indent\":1,\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"매개변수 이름\"}],\"id\":\"RE4ATYPp9PJHy9QcTEsQW\",\"type\":\"p\"}],\"id\":\"nfVoSghGtanowgfiyZqQp\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"매개변수 설명\"}],\"id\":\"6beVb8PnG5Iw4j_Wh2gvM\",\"type\":\"p\"}],\"id\":\"gNQs9nDxzryJtPz3gQL7B\",\"type\":\"cell\"}],\"id\":\"QUa16a78Hm7XsH5ccU9pk\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"access_key_id, access_key_secret\"}],\"id\":\"Ulpapgn4MOHT7nKdvEf1c\",\"type\":\"p\"}],\"id\":\"Ph84RF_2d7ZILcNGUZfP0\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"키 정보는 \"},{\"children\":[{\"text\":\"API 키\"}],\"id\":\"Z6R_AO4vVK6on4IqWW5Xj\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/capi\"},\"type\":\"ref\"},{\"text\":\"에서 생성 및 조회 가능합니다.\"}],\"id\":\"c80Sg8Nq1VEJGo9nCEMI5\",\"type\":\"p\"}],\"id\":\"c32MaC0yVZ00ksAlwjnbJ\",\"type\":\"cell\"}],\"id\":\"E6jxxop2pOL-DeHgVtAEW\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"bucket\"}],\"id\":\"oRKXHMGN2pc1qVFjnHNvX\",\"type\":\"p\"}],\"id\":\"nDLOqLnechMq-L81KJ6tZ\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"버킷 이름(appid 포함 금지).\"}],\"id\":\"01oD-Xxfj0I_QKTCSv_-E\",\"type\":\"p\"}],\"id\":\"pgcXg0M4ikjNXp2kJJ9aa\",\"type\":\"cell\"}],\"id\":\"A94Hk8mj96bLzplulPcY_\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"app_id\"}],\"id\":\"FO6Df_FappdW9Hw4xEZmh\",\"type\":\"p\"}],\"id\":\"OoRUmmBFyY0-zfkIXlRo_\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"APPID는 Tencent Cloud 계정을 신청한 후 시스템이 할당하는 계정 식별자 중 하나로, \"},{\"children\":[{\"text\":\"Tencent Cloud 콘솔\"}],\"id\":\"tRMkTohxfuqEF02kVrQYT\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/developer\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/developer\"},\"type\":\"ref\"},{\"text\":\" [\"},{\"text\":\"계정 정보\"},{\"text\":\"]에서 확인할 수 있습니다.\"}],\"id\":\"pGd-DqE7HlyOtOWpbr5Q1\",\"type\":\"p\"}],\"id\":\"QL40BHPjSAnsg0YffYO19\",\"type\":\"cell\"}],\"id\":\"28hXUYiU0KUI7p3A-eD0e\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"region\"}],\"id\":\"4UbUEYkB9fIdUwEvXiMXX\",\"type\":\"p\"}],\"id\":\"zog6Z46blLx6OCLzwk8cl\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"버킷이 위치한 리전. COS 리전의 약자는 \"},{\"children\":[{\"text\":\"리전 및 액세스 도메인\"}],\"id\":\"i47hinneL8a2hwEQ4kcvk\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/6224\"},\"type\":\"ref\"},{\"text\":\"을 참조하십시오.\"}],\"id\":\"dDaZz0_JZw-6CXd5_M7ZR\",\"type\":\"p\"}],\"id\":\"SaRouviGLKyUwU6jOhOu0\",\"type\":\"cell\"}],\"id\":\"H3P9yOF0b2Isrx3VHwX6X\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"base_path\"}],\"id\":\"tBNEzdDEQwVWQ64u1D7Se\",\"type\":\"p\"}],\"id\":\"3qE4cmJRyskrC-_-GSSH2\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"백업 디렉토리 경로, /dir1/dir2/dir3 형식이며 맨 앞에 \"},{\"code\":1,\"text\":\"/\"},{\"text\":\"를 붙이고, 마지막 \"},{\"code\":1,\"text\":\"/\"},{\"text\":\"는 생략합니다.\"}],\"id\":\"7TGLv5Znbi4oZnmDrSZ62\",\"type\":\"p\"}],\"id\":\"m_vsrBFE5x7qPSoqUtYaD\",\"type\":\"cell\"}],\"id\":\"WfkRs7-KJXqaCILPQCODf\",\"type\":\"row\"}],\"columnHeader\":false,\"id\":\"zwkD0v7uw3NpS3wocQ691\",\"indent\":1,\"rowHeader\":true,\"type\":\"table\",\"widthMode\":\"percentage\",\"widths\":[23,77]},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"주의:\"}],\"id\":\"EI6Nk52LdArfcJLS1OK36\",\"type\":\"p\"},{\"children\":[{\"text\":\"플러그인 버전이 8.15.1 인 경우, 매개변수 이름 앞에 cos.client 접두사가 추가됩니다. (예: cos.client.access_key_id)\"}],\"id\":\"9aO_3WqjMtYW6K0nb3bmS\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"jBkZk0m60lOzHMM3aUBgX\",\"indent\":1,\"type\":\"hint\"},{\"children\":[{\"text\":\"로컬 저장소에 스냅샷 파일을 생성하면 생성된 스냅샷 파일은 자동으로 지정된 COS 저장소에 업로드됩니다. \"},{\"code\":1,\"text\":\"put _snapshot/저장소명/스냅샷명\"},{\"text\":\" 명령으로 스냅샷을 실행할 수 있습니다.\"}],\"id\":\"aHJvCvxmJzCSSo0wGzpR8\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"Tencent Cloud ES에서도 동일하게 저장소를 등록합니다. 저장소명은 달라도 됩니다.\"}],\"id\":\"6yz6dw7Veq6KDLNRu94U7\",\"start\":false,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"PUT _snapshot/my_cos_backup\"}],\"id\":\"srcbcwzJkWmuB6aBNhoe3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"{\"}],\"id\":\"T7aF3uRdpZSTf2De_cnaH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"type\\\": \\\"cos\\\",\"}],\"id\":\"JA9x_K96lvYwwhfAAUfBS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"settings\\\": {\"}],\"id\":\"4aDeqWaVHYDKhKC0KqDro\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"access_key_id\\\": \\\"xxxxxx\\\",\"}],\"id\":\"AhxbGDXXFch9X2-t134bG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"access_key_secret\\\": \\\"xxxxxxx\\\",\"}],\"id\":\"2g0DOIBYFr185NVAEsqMF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"bucket\\\": \\\"appId 접미사가 없는 bucket 이름\\\",\"}],\"id\":\"MpcYeyQVq_ZZ1ViwnRnnX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"region\\\": \\\"ap-guangzhou\\\",\"}],\"id\":\"THXVkESNs6v-pQm-JGGN9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"compress\\\": true,\"}],\"id\":\"Ql8jZvW5G2KsNpGVtUwgv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"chunk_size\\\": \\\"500mb\\\",\"}],\"id\":\"-5LpNeu4F4ljH2QBTKESx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"base_path\\\": \\\"/yourbasepath\\\",\"}],\"id\":\"yjBdqIb-TxoXmDZACfgt3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"app_id\\\": \\\"xxxxxxx\\\" \"}],\"id\":\"EL9zIuMbRJl_Wkyf-Dr6g\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"tilxkpm8l9buP-9VM5XoZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"mV-qxqxkul7OEYIegVvQZ\",\"type\":\"code-line\"}],\"id\":\"uIC7TgSJVI4fepx7DR_pB\",\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"Tencent Cloud ES에서 복구를 실행하려면 다음 명령으로 스냅샷 복구를 실행합니다.\"}],\"id\":\"5CtY_bLzh5pSZqhco0SD0\",\"start\":false,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"POST _snapshot/저장소명/스냅샷명/_restore\"}],\"id\":\"GeaCACSKKrAOL4p6qkV0w\",\"type\":\"code-line\"}],\"id\":\"sY9q9WNiU4xAp-qGGqSxk\",\"indent\":1,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"주의:\"}],\"id\":\"OGQ_Yle2AdYC5T4RHipdQ\",\"type\":\"p\"},{\"children\":[{\"text\":\"복구하려는 스냅샷명은 원본 클러스터에서 생성한 스냅샷명과 동일해야 합니다.\"}],\"id\":\"V2xPgzJqkhZb1iIMTnKfy\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"pZpjm67Gc16QE9x3pvKs8\",\"indent\":1,\"type\":\"hint\"}]"}},"72694":{"categoryId":436,"weight":49,"type":"page","extension":"","pid":9511,"id":72694,"lang":"ko","title":"COS 비용 최적화 솔루션","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2025-08-29 22:19:13","recentReleaseTime":"2025-08-29 22:19:13","content":{"title":"COS 비용 최적화 솔루션","body":"
클라우드로 전환하는 기업이 늘어나면서 기업들은 클라우드 사용 비용 문제에 더욱 주목하고 있습니다. 비즈니스 발전은 방대한 저장 수요를 발생시키는데, 클라우드에 데이터를 저장할 때 어떻게 비용을 최적화하여 비즈니스 부담을 줄일 수 있을까요?
비용 최적화를 진행하기 전에 먼저 Tencent Cloud COS(Cloud Object Storage)의 비용 구조를 이해해야 합니다. COS의 과금 항목은 주로 스토리지 사용량 요금, 트래픽 요금, 요청 요금, 데이터 검색 요금 및 관리 요금 등 5가지 주요 항목으로 구성됩니다.
대부분의 기업에게 스토리지 사용량 요금과 트래픽 요금은 클라우드 저장 비용의 핵심 요소입니다. 스토리지 사용량 요금 측면에서 Tencent Cloud COS 서비스는 STANDARD, STANDARD_IA, ARCHIVE, DEEP ARCHIVE 등 다양한 스토리지 유형을 제공하며, 각 유형별 사양과 가격이 다릅니다. 기업은 비즈니스 모델에 따라 가성비가 가장 적합한 스토리지 유형을 선택할 수 있습니다. 트래픽 요금 측면에서는 공중망 다운스트림 트래픽, CDN Origin-pull 트래픽, 리전 간 복사 트래픽, 글로벌 가속 트래픽 등이 있으며, 비즈니스 모델 차이에 따라 트래픽 요금 구조도 달라집니다. 예를 들어, 한 기업의 비즈니스가 주로 전자상거래 웹사이트 중심으로 대규모 이미지 배포가 필요한 경우, CDN Origin-pull 트래픽이 많아 트래픽 요금의 대부분이 CDN Origin-pull 트래픽 요금으로 발생합니다.

최적화 1: 스토리지 유형 및 비즈니스 리전 선택

비즈니스 모델에 맞는 스토리지 유형과 비즈니스 리전을 선택하면 기업의 스토리지 비용을 크게 최적화할 수 있습니다.
COS는 기업에 다양한 스토리지 유형을 제공하며, 기업은 성능, 데이터 내구성, 비즈니스 가용성 요구에 따라 다른 스토리지 유형을 선택할 수 있고, 이에 따라 비용도 달라집니다. STANDARD는 요금이 상대적으로 높지만 가장 낮은 읽기 지연을 제공합니다. 반면 STANDARD_IA, ARCHIVE, DEEP ARCHIVE는 요금이 낮지만 데이터를 다운로드할 때 추가적인 데이터 검색 요금이 발생하고 더 긴 검색 시간이 소요되므로, 적은 양의 데이터를 읽는 시나리오에 더 적합합니다.
아래 표는 광저우 리전에 100TB 데이터를 저장하는 예시로, 데이터를 다른 스토리지 유형으로 한 달 동안 저장했을 때 발생하는 스토리지 비용을 보여줍니다.
비교 항목
STANDARD
STANDARD_IA
ARCHIVE
DEEP ARCHIVE
MAZ_STANDARD
MAZ_STANDARD_IA
스토리지 단가(USD/GB/월)
0.016
0.01
0.004
0.0016
0.0195
0.0132
트래픽 단가(USD/GB)
0.1
0.1
0.1
0.1
0.1
0.1
요청 단가(USD/만 회, 100만 회 기준)
0.002
0.01
0.002
읽기/쓰기 요청: 0.07
표준 검색 요청: 1
0.002
0.01
검색 단가(USD/GB)
0
0.002
표준 검색: 0.01
표준 검색: 0.02
0
0.002
총 비용(스토리지 100TB + 다운로드 없음)
1638.40
1024.00
409.60
163.84
1996.80
1351.68
총 비용(스토리지 100TB + 다운로드 100T + 요청 100만 회 + 검색 100TB)
11638.60
11229.80
11433.80
12318.84
11997.00
11557.48
총 비용(스토리지 100TB+다운로드 500T + 요청 100만 회 + 검색 500TB)
51638.60
52049.00
55529.80
60510.84
51997.00
52376.68
설명:
다른 리전 및 스토리지 유형의 단가는 COS 가격 페이지를 참고하십시오.
표에서 볼 수 있듯이, 비즈니스 데이터 다운로드량이 적은 경우 ARCHIVE나 DEEP ARCHIVE를 선택하면 스토리지 비용을 효과적으로 절감할 수 있으며, DEEP ARCHIVE는 STANDARD 대비 최대 90%의 비용을 절약할 수 있습니다. 그러나 데이터를 자주 다운로드해야 하는 경우 STANDARD_IA, ARCHIVE, DEEP ARCHIVE의 데이터 검색 요금이 추가 비용을 유발할 수 있으므로 전체 비용이 오히려 더 높아질 수 있습니다.
구체적인 비즈니스 시나리오별로 다음과 같이 추천됩니다.
1. 빈번한 읽기/쓰기 시나리오: UGC 시나리오, 전자상거래 이미지 등 읽기 요청이 많고 쓰기 요청이 적은 경우 STANDARD를 사용하는 것이 적합합니다. 가용성과 데이터 내구성에 대한 요구가 높은 경우 MAZ_STANDARD를 고려할 수 있습니다.
2. 적은 읽기 시나리오(월 1회): 로그 데이터 분석, 클라우드 스토리지 데이터 등 읽기 빈도는 낮지만 읽을 때 성능 요구가 높은 경우 STANDARD_IA를 선택할 수 있습니다. 가용성과 데이터 내구성이 중요한 경우 MAZ_STANDARD_IA를 권장됩니다.
3. 극소량 읽기 시나리오(3개월에 1회): 비디오 모니터링, 로그 데이터 아카이브 등 읽기 빈도가 매우 낮고 성능 요구가 크지 않은 경우 ARCHIVE를 사용할 수 있습니다.
4. 거의 읽지 않는 시나리오(6개월에 1회): 의료 영상, 기록 자료 등 장기 백업만 필요하고 읽기 성능 요구가 거의 없는 경우 DEEP ARCHIVE를 사용할 수 있습니다.
또한 스토리지 유형에 따라 최소 저장 기간 및 최소 저장 단위 제한이 있을 수 있으며, 성능 특성도 다릅니다. 아래 표는 간단한 비교를 제공합니다.
비교 항목
STANDARD
STANDARD_IA
STANDARD
DEEP ARCHIVE
MAZ_STANDARD
MAZ_STANDARD_IA
첫 바이트 지연
밀리초 단위
밀리초 단위
최소 1분
최소 12시간
밀리초 단위
밀리초 단위
최소 저장 단위
제한 없음
64KB
64KB
64KB
제한 없음
제한 없음
최소 저장 기간
제한 없음
30일
90일
180일
제한 없음
30일
데이터 내구성
99.999999999%
99.999999999%
99.999999999%
99.999999999%
99.9999999999%
99.9999999999%
비즈니스 디자인 가용성
99.99%
99.90%
99.00%
99.00%
99.995%
99.95%
설명:
최소 저장 기간: 파일이 해당 스토리지 유형에 저장될 때 필요한 최소 저장 기간으로, 최소 기간을 충족하지 않으면 최소 기간 기준으로 요금이 계산됩니다. 예를 들어 STANDARD_IA는 최소 30일간 저장해야 하며 파일이 하루만 저장된 후 삭제되더라도 30일 기준으로 요금이 부과됩니다.
최소 저장 단위: 파일이 해당 스토리지 유형에 저장될 때 필요한 최소 파일 용량으로, 최소 용량을 충족하지 않으면 최소 용량 기준으로 요금이 계산됩니다. 예를 들어 STANDARD_IA는 최소 64KB를 저장해야 하며, 파일이 1KB만 저장된 후 삭제되더라도 64KB 기준으로 요금이 부과됩니다.

최적화 2: 액세스 패턴 분석 및 데이터 계층화

1. 정기적으로 인벤토리 및 액세스 로그 기능을 통해 데이터 액세스 패턴을 분석

데이터 액세스 패턴을 분석하면 적절한 스토리지 유형을 선택하기 위한 데이터 근거를 제공할 수 있습니다. COS는 인벤토리 기능과 액세스 로그 기능을 제공하여 각각 저장된 파일의 메타데이터 정보와 파일 액세스 기록을 기록하고, 이 정보를 사용자의 버킷에 저장합니다.
설명:
인벤토리 기능에 대한 자세한 내용은 인벤토리 개요를 참고하십시오.
액세스 로그 관리 기능에 대한 자세한 내용은 로그 관리 개요를 참고하십시오.
COS는 COS Select 기능을 제공하여 파일 내의 데이터를 검색할 수 있습니다. 생성한 인벤토리 파일이나 로그 기록이 너무 많으면 EMR(Elastic MapReduce) 클러스터를 구매하여 Presto 클러스터를 구축해 데이터 분석을 수행할 수도 있습니다.
설명:
COS Select 기능에 대한 자세한 내용은 Select 개요를 참고하십시오.
EMR 분석에 대한 자세한 내용은 Presto로 COS의 데이터 분석을 참고하십시오.
인벤토리 파일 내 데이터를 검색·분석하는 예시로, 인벤토리 보고서가 지정된 버킷으로 전달된 후 콘솔에서 해당 보고서를 분석할 수 있으며, 작업 절차는 다음과 같습니다.
주의:
인벤토리 보고서 생성 방법은 인벤토리 개요를 참고하십시오.
콘솔은 128MB 미만의 파일만 검색을 지원합니다. 인벤토리 보고서 파일이 너무 크거나 보고서 수가 너무 많은 경우, 도구·SDK·API 방식을 통해 호출할 수 있습니다.
1. COS 콘솔에 로그인합니다.
2. 구성이 필요한 버킷 이름을 클릭하여 버킷 목록 페이지로 이동합니다.
3. 해당 인벤토리 보고서를 찾아 오른쪽 작업 열에서 더보기 > 검색을 선택합니다.
4. 객체 검색 페이지에서 입력 매개변수를 설정하고 검색 구문을 입력한 후 SQL 실행을 클릭하면 결과 페이지에서 검색 결과를 확인할 수 있습니다. 자세한 작업 지침은 데이터 검색을 참고하십시오. 아래는 인벤토리 보고서 검색에 자주 사용되는 쿼리 예시입니다.
특정 날짜의 특정 스토리지 유형에 저장된 파일 개수 조회:
select count(*) from cosobject s where s._7 = <storage_class>
select count(*) from cosobject s where s._7 = 'Standard'
특정 날짜의 특정 스토리지 유형에서 몇 MB 용량이 있는지 조회:
select SUM(CAST(s._4 AS FLOAT))/1024/1024 from cosobject s where s._7 = <storage_class>
select SUM(CAST(s._4 AS FLOAT))/1024/1024 from cosobject s where s._7 = 'Standard'
특정 스토리지 유형에서 64KB 미만 파일 개수 조회:
select count(*) from cosobject s where s._7 = <storage_class> and CAST(s._4 AS FLOAT) < <SIZE>
select count(*) from cosobject s where s._7 = 'Standard_IA' and s._4 < 64*1024
버킷 내 리전 간 복사 실패 파일 개수 조회:
select count(*) from cosobject s where s._9 = 'Failed'
주의:
인벤토리 보고서에는 테이블 헤더 정보가 포함되지 않으므로 해당 필드의 순번만 입력하여 검색할 수 있습니다. 인벤토리 보고서의 테이블 헤더와 순번 대응 정보는 다음과 같습니다.
Appid
Bucket
Key
Size
LastModifiedDate
ETag
StorageClass
IsMultipartUploaded
ReplicationStatus
s._1
s._2
s._3
s._4
s._5
s._6
s._7
s._8
s._9

2. 라이프사이클 및 일괄 처리를 통한 데이터 계층화

비즈니스 발전 과정에서 데이터 액세스 패턴은 항상 동적으로 변화합니다. 정기적으로 인벤토리 및 액세스 로그 기능을 통해 데이터 액세스 패턴을 분석한 후, 분석 보고서를 기반으로 비즈니스 데이터를 계층화할 수 있습니다.
대부분의 데이터는 저장 기간이 길어짐에 따라 액세스 빈도가 일반적으로 감소하기 때문에, 기업은 비즈니스 데이터 액세스 패턴의 변화에 따라 스토리지 유형을 조정하여 비즈니스 비용을 최적 상태로 관리할 필요가 있습니다.
COS는 기업이 정기적으로 스토리지 유형을 전환할 수 있도록 라이프사이클 기능을 제공합니다. 기업은 인벤토리와 액세스 로그를 통해 비즈니스 데이터 액세스 패턴을 분석하고, 이에 따라 합리적인 라이프사이클 전환 규칙을 수립할 수 있습니다.
커뮤니티 플랫폼을 운영하는 한 고객을 예로 들어보면, COS를 사용하여 사용자가 업로드한 이미지 데이터를 저장합니다. 일반적으로 이미지 데이터는 업로드 직후 일정 기간 동안은 자주 접근되지만, 일정 시간이 지나면 대부분의 데이터가 점차 '쿨링'되어 접근 빈도가 줄어듭니다. 만약 이 고객의 대부분 이미지 데이터가 90일 이후 월 1회 미만으로 접근되고, 365일 이후에는 거의 접근되지 않는다면, 라이프사이클 설정라이프사이클 미설정에 따른 비용을 비교할 수 있습니다.
비교 항목
STANDARD만 사용
STANDARD로 핫 데이터를 저장 후, 90일 이후 STANDARD_IA로 전환
STANDARD로 핫 데이터를 저장 후, 90일 이후 STANDARD_IA로 전환, 365일 이후 ARCHIVE로 전환
스토리지 단가(USD/GB/월, 광저우 리전을 예로 듦)
STANDARD: 0.016
STANDARD: 0.016
STANDARD_IA: 0.01
STANDARD: 0.016
STANDARD_IA: 0.01
ARCHIVE: 0.004
저장 기간
24개월
24개월
(3개월 STANDARD + 21개월 STANDARD_IA)
24개월
(3개월 STANDARD + 9개월 STANDARD_IA + 12개월 ARCHIVE)
총 스토리지 비용(USD)
39321.60
26419.20
19046.40
라이프사이클 규칙을 사용하여 버킷의 객체를 관리하면 데이터 저장 비용을 크게 절감할 수 있습니다. 장기 저장 데이터의 경우라이프사이클 규칙을 적절히 구성하면 비즈니스 저장 비용을 50% 이상 절감할 수 있습니다.
비즈니스 데이터 스토리지 유형 관리 외에도 라이프사이클 기능은 스토리지 버킷의 파일 조각이전 버전 파일 관리에도 사용할 수 있습니다. 파일 조각은 대용량 파일 업로드 중 네트워크 중단 등으로 전송이 실패하여 생성된 불완전한 파일 파트 정보를 의미합니다. 비즈니스 데이터에 다수의 파일 조각이 존재한다면 라이프사이클 규칙을 통해 만료 삭제할 수 있습니다. 이전 버전 파일은 버전 관리 기능을 활성화하면 생성되는 구 버전 파일로, 데이터 오삭제 후 복구 및 롤백에 활용할 수 있으나 스토리지 공간을 차지합니다. 따라서 비즈니스에서도 더 이상 사용하지 않는 이전 버전 파일에 만료 삭제 시간을 설정하여 정리함으로써 데이터 보안과 비용 균형을 달성할 수 있습니다.
규칙을 추가하여 이전 버전 파일 관리를 활성화하면 이전 버전 파일을 쿨링하거나 삭제할 수 있으며, 조각 삭제를 선택하고 만료 시간을 설정하면 존재할 수 있는 파일 조각을 정리할 수 있습니다. 자세한 내용은 라이프사이클 설정을 참고하십시오.
대량의 파일을 한 번에 더 쿨한 스토리지 유형으로 변환해야 하지만 접두사나 태그와 같은 고정 규칙이 없는 일부 비즈니스의 경우, 사용자는 COS 일괄 작업(Batch) 기능을 활용하여 일괄 복사 기능으로 데이터를 다른 스토리지 유형으로 전환할 수 있습니다. 또한 비즈니스 데이터에 객체 태그 추가를 하여 라이프사이클 규칙을 설정하면 일괄 삭제도 가능합니다. 작업 단계는 다음과 같습니다.
1. 처리할 파일 목록을 내보내 CSV 형식 파일로 정리합니다.
2. COSBatch 일괄 처리 작업을 생성하고 파일 목록을 가져옵니다.
3. 일괄 처리 작업을 실행하고 완료될 때까지 기다리면 됩니다.
자세한 작업 단계는 일괄 작업을 참고하십시오.

비용 회고 진행

비용 최적화는 비즈니스 전체 프로세스에 걸쳐 수행되어야 하며, 단순히 클라우드 전환 시 비용 계획을 수립하는 것에 그쳐서는 안 됩니다. 비즈니스는 수시로 비용 회고를 진행해야 합니다. 한편으로 비즈니스 발전에 따라 스토리지 수요와 데이터 액세스 패턴이 실시간으로 변화하고, 다른 한편으로 Tencent Cloud COS는 사용자에게 더 저렴한 스토리지 서비스를 제공하여 비용 절감과 효율 향상을 지원하고 있습니다. 따라서 수시로 비용 회고를 진행하고 비즈니스 요구에 따라 클라우드 스토리지 아키텍처를 합리적으로 계획하는 것은 저장 비용 절감에 도움이 됩니다.
이 외에도 다음을 수행할 수 있습니다.
1. 비용 센터의 사용량 세부 정보 내보내기 페이지에서 Tencent Cloud 청구서를 다운로드하여 COS \t사용량 세부 정보를 확인하고, 사용 현황을 분석해 맞춤형 최적화를 진행할 수 있습니다.
2. COS 콘솔 개요 페이지에 접속하여 COS 신제품 출시 현황을 확인하고, 비용 최적화 관련 소식을 확인할 수 있습니다.
","recentReleaseTime":"2025-08-29 14:19:13","slate":"[{\"children\":[{\"text\":\"클라우드로 전환하는 기업이 늘어나면서 기업들은 클라우드 사용 비용 문제에 더욱 주목하고 있습니다. 비즈니스 발전은 방대한 저장 수요를 발생시키는데, 클라우드에 데이터를 저장할 때 어떻게 비용을 최적화하여 비즈니스 부담을 줄일 수 있을까요?\"}],\"id\":\"0pcQrIkQ8LveKuEuG-Tfn\",\"type\":\"p\"},{\"children\":[{\"text\":\"비용 최적화를 진행하기 전에 먼저 Tencent Cloud COS(Cloud Object Storage)의 비용 구조를 이해해야 합니다. COS의 과금 항목은 주로 스토리지 사용량 요금, 트래픽 요금, 요청 요금, 데이터 검색 요금 및 관리 요금 등 5가지 주요 항목으로 구성됩니다.\"}],\"id\":\"l_DGwDhFNbxdT9ctl5-CY\",\"type\":\"p\"},{\"children\":[{\"text\":\"대부분의 기업에게 스토리지 사용량 요금과 트래픽 요금은 클라우드 저장 비용의 핵심 요소입니다. \"},{\"b\":1,\"text\":\"스토리지 사용량 요금\"},{\"text\":\" 측면에서 Tencent Cloud COS 서비스는 STANDARD, STANDARD_IA, ARCHIVE, DEEP ARCHIVE 등 다양한 스토리지 유형을 제공하며, 각 유형별 사양과 가격이 다릅니다. 기업은 비즈니스 모델에 따라 가성비가 가장 적합한 스토리지 유형을 선택할 수 있습니다. \"},{\"b\":1,\"text\":\"트래픽 요금\"},{\"text\":\" 측면에서는 공중망 다운스트림 트래픽, CDN Origin-pull 트래픽, 리전 간 복사 트래픽, 글로벌 가속 트래픽 등이 있으며, 비즈니스 모델 차이에 따라 트래픽 요금 구조도 달라집니다. 예를 들어, 한 기업의 비즈니스가 주로 전자상거래 웹사이트 중심으로 대규모 이미지 배포가 필요한 경우, CDN Origin-pull 트래픽이 많아 트래픽 요금의 대부분이 CDN Origin-pull 트래픽 요금으로 발생합니다.\"}],\"id\":\"kqooHYVdZ6_Gxy_M7Nrq6\",\"type\":\"p\"},{\"children\":[{\"text\":\"최적화 1: 스토리지 유형 및 비즈니스 리전 선택\"}],\"id\":\"1gFI451PIrXx8H4MPN1fG\",\"nodeId\":\".E4.BC.98.E5.8C.96.E4.B8.80.EF.BC.9A.E9.80.89.E6.8B.A9.E5.AD.98.E5.82.A8.E7.B1.BB.E5.9E.8B.E5.92.8C.E4.B8.9A.E5.8A.A1.E5.9C.B0.E5.9F.9F\",\"type\":\"h2\"},{\"children\":[{\"text\":\"비즈니스 모델에 맞는 스토리지 유형과 비즈니스 리전을 선택하면 기업의 스토리지 비용을 크게 최적화할 수 있습니다.\"}],\"id\":\"4MPdI3Zx1pzTREJ_qGWXR\",\"type\":\"p\"},{\"children\":[{\"text\":\"COS는 기업에 다양한 스토리지 유형을 제공하며, 기업은 성능, 데이터 내구성, 비즈니스 가용성 요구에 따라 다른 스토리지 유형을 선택할 수 있고, 이에 따라 비용도 달라집니다. STANDARD는 요금이 상대적으로 높지만 가장 낮은 읽기 지연을 제공합니다. 반면 STANDARD_IA, ARCHIVE, DEEP ARCHIVE는 요금이 낮지만 데이터를 다운로드할 때 추가적인 데이터 검색 요금이 발생하고 더 긴 검색 시간이 소요되므로, 적은 양의 데이터를 읽는 시나리오에 더 적합합니다.\"}],\"id\":\"7EqtR4MhluVasuj-HzriK\",\"type\":\"p\"},{\"children\":[{\"text\":\"아래 표는 광저우 리전에 100TB 데이터를 저장하는 예시로, 데이터를 다른 스토리지 유형으로 한 달 동안 저장했을 때 발생하는 스토리지 비용을 보여줍니다.\"}],\"id\":\"tEpVzf1mGmzKNFO_VSCBs\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"비교 항목\"}],\"id\":\"Zapk9W932COhPPFXEWoqK\",\"type\":\"p\"}],\"id\":\"uIlMJiyBGRugE5v_Tfvt0\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"STANDARD\"}],\"id\":\"ULuJwDU2iE-zQpv0_sf_w\",\"type\":\"p\"}],\"id\":\"XUJdivftb8fNb93joY1sV\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"STANDARD_IA\"}],\"id\":\"_rQevYxxerhE_pntGKyeN\",\"type\":\"p\"}],\"id\":\"NQlrJ8brVdP94JCM0HTCr\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"ARCHIVE\"}],\"id\":\"lrebtjhVe77x4xtck82F5\",\"type\":\"p\"}],\"id\":\"SBbvGWLcyu0TR9BvW1LwV\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"DEEP ARCHIVE\"}],\"id\":\"jTA_vwz_K_W4zfApXzhXE\",\"type\":\"p\"}],\"id\":\"Mv_5PBEMBGaduic5rx5N2\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"MAZ_STANDARD\"}],\"id\":\"2EayEUFINAG7_7BeHNUQX\",\"type\":\"p\"}],\"id\":\"DepePbp0-qv5Sa-ny6aS9\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"MAZ_STANDARD_IA\"}],\"id\":\"bIMEeH22uQPgms3VKji6I\",\"type\":\"p\"}],\"id\":\"q8scmBzbdv9gczT6fCqv6\",\"type\":\"cell\"}],\"id\":\"ARKNmRhCQafBOwxBDLZTK\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"스토리지 단가(USD/GB/월)\"}],\"id\":\"AsVfZzMQG81LfYN8i00gM\",\"type\":\"p\"}],\"id\":\"EXnEvEpX6Ipkb68rVLlOK\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.016\"}],\"id\":\"JZzPF7kw8gLzqPVthVO-s\",\"type\":\"p\"}],\"id\":\"GS-Y95jrQQtd-gGtv_sow\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.01\"}],\"id\":\"dkRJNUJqFip64dYgy6Cw0\",\"type\":\"p\"}],\"id\":\"FlN2SwTvwL8vC6XuI_So_\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.004\"}],\"id\":\"PiCsNhfZuMHc5mm_E3tyQ\",\"type\":\"p\"}],\"id\":\"s_q0Zqo31bQE2ZDKpS7wS\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.0016\"}],\"id\":\"_9eIn5sNa0zEvdde3IKOt\",\"type\":\"p\"}],\"id\":\"NCneZwnVJfZhwb_S4ueRC\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.0195\"}],\"id\":\"GDNeRNFlMR7H5USIQajOE\",\"type\":\"p\"}],\"id\":\"1R18JvhORgXot7-rjT4kq\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.0132\"}],\"id\":\"t-HQsmh0GmIL6CSOUN4Wi\",\"type\":\"p\"}],\"id\":\"44xbqp5xb_s5TUM4Hybzl\",\"type\":\"cell\"}],\"id\":\"7RVXbaBbijPTfWpblDChh\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"트래픽 단가(USD/GB)\"}],\"id\":\"fvdwYvN89jDsA3_zy40Nx\",\"type\":\"p\"}],\"id\":\"0uHZZV1wkXi9jn42_15Zj\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.1\"}],\"id\":\"IXJTHqJb_eguNNxqiBCZj\",\"type\":\"p\"}],\"id\":\"r__zIJhgeYXCDxrg3f0N4\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.1\"}],\"id\":\"kyy9AmUCLyK_6HHATICN3\",\"type\":\"p\"}],\"id\":\"DTiVVMl4OgUfRH9qJ8sPd\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.1\"}],\"id\":\"pvOipHodgCUPgU3nVumil\",\"type\":\"p\"}],\"id\":\"4nmxHCFcwzUHOtnVZvDDD\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.1\"}],\"id\":\"r7YWIl-fYWjB05squI-UN\",\"type\":\"p\"}],\"id\":\"WIJuOpNC_p3iRNDToP7cX\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.1\"}],\"id\":\"f_TvUuMRuhej-n4EDvCw4\",\"type\":\"p\"}],\"id\":\"670uAzTfs3EK_xc_VCkec\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.1\"}],\"id\":\"XkLcH_7GPNjUXDX1QSSJ5\",\"type\":\"p\"}],\"id\":\"tp8p65hqlZlBtCFajdvZ7\",\"type\":\"cell\"}],\"id\":\"ltiAlNFqwV-0Os9n5zpdA\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"요청 단가(USD/만 회, 100만 회 기준)\"}],\"id\":\"tAiPTVtpRy6RQVYN0oCru\",\"type\":\"p\"}],\"id\":\"4DDdc5YjBZ9CyrdAFYWe1\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.002\"}],\"id\":\"DBOoWalDe_oLBUeN77Gj9\",\"type\":\"p\"}],\"id\":\"YRn4cTpO4TUi_zDic_IjX\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.01\"}],\"id\":\"uwn8UJR-RvXWo49RiK7I-\",\"type\":\"p\"}],\"id\":\"Wgmb_tKFSg-GJWNQ9JpUp\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.002\"}],\"id\":\"n0LJDKwusyZqcNKUUdRib\",\"type\":\"p\"}],\"id\":\"lZpTKoenM5r6ADYNm40Q4\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"읽기/쓰기 요청: 0.07\"}],\"id\":\"lldeOR8wvl-kENqo1_ViP\",\"type\":\"p\"},{\"children\":[{\"text\":\"표준 검색 요청: 1\"}],\"id\":\"ICKt6qlrxvqeGDzoQiHjs\",\"type\":\"p\"}],\"id\":\"hsnZBLeFNOQh8s7bvteVK\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.002\"}],\"id\":\"OmsAouJCwExvCu69xV_w6\",\"type\":\"p\"}],\"id\":\"FwCCjYNaQe0wnPUTzyTBA\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.01\"}],\"id\":\"WAtCvCUvxTr1Fb8x5Bj6t\",\"type\":\"p\"}],\"id\":\"rq01UT8y53uZsqPrxJnTF\",\"type\":\"cell\"}],\"id\":\"_gXBbycEewlUOdsGvmygK\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"검색 단가(USD/GB)\"}],\"id\":\"iL52Ooa0x3rs7-UTuTpPL\",\"type\":\"p\"}],\"id\":\"qaSSFU7cLG7tJreV8Wn8k\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0\"}],\"id\":\"21MRYJgsEXHFiPEd6FuoD\",\"type\":\"p\"}],\"id\":\"4zXEd7y2AbffjvBsRg_SW\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.002\"}],\"id\":\"rzB6eND9JECDkGOS9YkwS\",\"type\":\"p\"}],\"id\":\"Kw0ciMbswdtCH2xxMWMf5\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"표준 검색: 0.01\"}],\"id\":\"OZqOwrvN9r9mmKW7-EP3e\",\"type\":\"p\"}],\"id\":\"XOc4IIMjutYJh8ZwR4ejg\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"표준 검색: 0.02\"}],\"id\":\"ldMudJvO1HZNqnUJ20H5S\",\"type\":\"p\"}],\"id\":\"1tYToZwAgVzt6XxEN8Pgm\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0\"}],\"id\":\"xQQz2Q8TZOYHETbxAS3H0\",\"type\":\"p\"}],\"id\":\"CIkkTdbTXrPs0vxmOcvSb\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"0.002\"}],\"id\":\"mPKwk55XvoE7RtME7CZ8S\",\"type\":\"p\"}],\"id\":\"e8oOXO7mY_xKL8XZ2MsRU\",\"type\":\"cell\"}],\"id\":\"jqL7okELWj8NDRK5nOum8\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"총 비용(스토리지 100TB + 다운로드 없음)\"}],\"id\":\"wo-KiN02ST1fbCHW5hkTv\",\"type\":\"p\"}],\"id\":\"U6qtrdODUfWxJ7fZEa-Ih\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"1638.40\"}],\"id\":\"s_ifu0ndgLdycz-OXbRcr\",\"type\":\"p\"}],\"id\":\"6CHa0WjfbMzajrxVIUeix\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"1024.00\"}],\"id\":\"5-yKEu0uyM8c_YAmyizeh\",\"type\":\"p\"}],\"id\":\"QF8m9vxTMLYump_7sDb0R\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"409.60\"}],\"id\":\"MN50wy6jnfEA9tZHdk9nv\",\"type\":\"p\"}],\"id\":\"l7lB_-jv4E_A67zhTduk5\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"163.84\"}],\"id\":\"BN3in3XKEZGSV8wHVl5E4\",\"type\":\"p\"}],\"id\":\"9K_hlFCbru3citIaf597T\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"1996.80\"}],\"id\":\"j_8QzbRhE6KHxv-9--BoT\",\"type\":\"p\"}],\"id\":\"cnhBlYfYpFvH0WYgDDHSm\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"1351.68\"}],\"id\":\"zAF32GN6FARq_WPXg0szl\",\"type\":\"p\"}],\"id\":\"dGfao1b3-ut7AFPoWq1P4\",\"type\":\"cell\"}],\"id\":\"WFRCJDXhktR8bVc8haE4A\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"총 비용(스토리지 100TB + 다운로드 100T + 요청 100만 회 + 검색 100TB)\"}],\"id\":\"5n9CMDQRCvo0R8Jsx8px2\",\"type\":\"p\"}],\"id\":\"3wW3gjpeumXMS3a7q6tk9\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"11638.60\"}],\"id\":\"UH2dCJlJ9UXJiN6VbZCrP\",\"type\":\"p\"}],\"id\":\"U2yTN8ne4cQxKRWi0Q2hW\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"11229.80\"}],\"id\":\"F7_ukO5q8nD9hNFDNzB_N\",\"type\":\"p\"}],\"id\":\"39l0cvM2bDR8b3A6R6asm\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"11433.80\"}],\"id\":\"H1C6kNnH_QsNWyRzAd80W\",\"type\":\"p\"}],\"id\":\"aQyvK9kd1uE2mVpN9ny78\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"12318.84\"}],\"id\":\"Jcd4zQCsXJU-aFkL-p59_\",\"type\":\"p\"}],\"id\":\"qIisY2nGnnNIZWx5CktPU\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"11997.00\"}],\"id\":\"ginZc1qBtJbkKGRcx7W4I\",\"type\":\"p\"}],\"id\":\"JAhx1DQK-o53t1qAzmfbR\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"11557.48\"}],\"id\":\"3umk4pfhvmfKm2gZ_zFZ1\",\"type\":\"p\"}],\"id\":\"87HzXid8_h3byBLy019eQ\",\"type\":\"cell\"}],\"id\":\"5OmJqSTE7V-d-DQCNoBxJ\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"총 비용(스토리지 100TB+다운로드 500T + 요청 100만 회 + 검색 500TB)\"}],\"id\":\"DlAQVkJ-aT9HRgiY10fn1\",\"type\":\"p\"}],\"id\":\"5S-SW9JaeJcW35mgB54JF\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"51638.60\"}],\"id\":\"0N4egGWGaTkvkrvXR83At\",\"type\":\"p\"}],\"id\":\"sKZEHA94v1d__OuZQJMlE\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"52049.00\"}],\"id\":\"WxYnx1qVD4tTRFbeKnSUx\",\"type\":\"p\"}],\"id\":\"HciJ_3K1gPgDWqQe80CPr\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"55529.80\"}],\"id\":\"rNHnDZu4w1HfScXHiB0TM\",\"type\":\"p\"}],\"id\":\"fv27BIlyiK7t4zgweHXLG\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"60510.84\"}],\"id\":\"ciNHPd0eK67hqVbsR3tze\",\"type\":\"p\"}],\"id\":\"GFtLsFoJR8IEnJZp5xLzF\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"51997.00\"}],\"id\":\"xhGODaPOncAKoNF-gD_E4\",\"type\":\"p\"}],\"id\":\"tntL4N8R-EtbVdWxWNHZe\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"52376.68\"}],\"id\":\"TWdrdY4qPWqBVmbiAE0iO\",\"type\":\"p\"}],\"id\":\"SdBsFbk3rEOvMgflMKC0g\",\"type\":\"cell\"}],\"id\":\"0pmgjfwttbyJ54Y-nxJIb\",\"type\":\"row\"}],\"columnHeader\":false,\"id\":\"fNNpERJRz312N5vNN9jjp\",\"rowHeader\":true,\"type\":\"table\",\"widths\":[241,119,115,139,141,106,108]},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"설명:\"}],\"id\":\"Meskpk-KwEQUi-Gsp0wd8\",\"type\":\"p\"},{\"children\":[{\"text\":\"다른 리전 및 스토리지 유형의 단가는 \"},{\"children\":[{\"text\":\"COS 가격 페이지\"}],\"id\":\"MdRcARYspnduqPdH24vgA\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/pricing/cos/overview\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"U-lIVlHY0fdZABFKPn8Po\",\"type\":\"p\"}],\"hintType\":\"info\",\"id\":\"wKLiFarOEUus4Xe4RE6rA\",\"type\":\"hint\"},{\"children\":[{\"text\":\"표에서 볼 수 있듯이, \"},{\"b\":1,\"text\":\"비즈니스 데이터 다운로드량이 적은 경우 ARCHIVE나 DEEP ARCHIVE를 선택하면 스토리지 비용을 효과적으로 절감할 수 있으며, DEEP ARCHIVE는 STANDARD 대비 최대 90%의 비용을 절약할 수 있습니다. 그러나 데이터를 자주 다운로드해야 하는 경우 STANDARD_IA, ARCHIVE, DEEP ARCHIVE의 데이터 검색 요금이 추가 비용을 유발할 수 있으므로 전체 비용이 오히려 더 높아질 수 있습니다\"},{\"text\":\".\"}],\"id\":\"FSur6dbvs-8YAUvR7HocR\",\"type\":\"p\"},{\"children\":[{\"text\":\"구체적인 비즈니스 시나리오별로 다음과 같이 추천됩니다.\"}],\"id\":\"qPpbvQu96umya4_YzsPW0\",\"type\":\"p\"},{\"children\":[{\"b\":1,\"text\":\"빈번한 읽기/쓰기 시나리오\"},{\"text\":\": UGC 시나리오, 전자상거래 이미지 등 읽기 요청이 많고 쓰기 요청이 적은 경우 STANDARD를 사용하는 것이 적합합니다. 가용성과 데이터 내구성에 대한 요구가 높은 경우 MAZ_STANDARD를 고려할 수 있습니다.\"}],\"id\":\"RR5F2HgtsDPnzD0mAgdYt\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"적은 읽기 시나리오(월 1회)\",\"b\":1},{\"text\":\": 로그 데이터 분석, 클라우드 스토리지 데이터 등 읽기 빈도는 낮지만 읽을 때 성능 요구가 높은 경우 STANDARD_IA를 선택할 수 있습니다. 가용성과 데이터 내구성이 중요한 경우 MAZ_STANDARD_IA를 권장됩니다.\"}],\"id\":\"US7a1KxeIO_7_AqSDlT_C\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"극소량 읽기 시나리오(3개월에 1회)\",\"b\":1},{\"text\":\": 비디오 모니터링, 로그 데이터 아카이브 등 읽기 빈도가 매우 낮고 성능 요구가 크지 않은 경우 ARCHIVE를 사용할 수 있습니다.\"}],\"id\":\"JZOtT4zd4Fhr7IBLM7C0t\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"거의 읽지 않는 시나리오(6개월에 1회)\",\"b\":1},{\"text\":\": 의료 영상, 기록 자료 등 장기 백업만 필요하고 읽기 성능 요구가 거의 없는 경우 DEEP ARCHIVE를 사용할 수 있습니다.\"}],\"id\":\"au38BkOay5WGfuc0IWel0\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"또한 스토리지 유형에 따라 최소 저장 기간 및 최소 저장 단위 제한이 있을 수 있으며, 성능 특성도 다릅니다. 아래 표는 간단한 비교를 제공합니다.\"}],\"id\":\"WnzyV0Vzncj0Rilc7zLc9\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"비교 항목\"}],\"id\":\"6ptPXUi3P72XO3kNNmSgw\",\"type\":\"p\"}],\"id\":\"XOMRKcNX_XDotLu40xM4J\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"STANDARD\"}],\"id\":\"NKbCP21n-xnsIymknmjD_\",\"type\":\"p\"}],\"id\":\"psMN4Pw3Etjw9io7TLUvq\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"STANDARD_IA\"}],\"id\":\"ljtwHxM6u0c0Hf163WkDy\",\"type\":\"p\"}],\"id\":\"g32GkEHAK-RqTLqDYq1ie\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"STANDARD\"}],\"id\":\"6vl0wiMaMUrwwK6Jkxm1p\",\"type\":\"p\"}],\"id\":\"Kp773lVsOPLluhzDgSmDG\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"DEEP ARCHIVE\"}],\"id\":\"rmiTZPz2Siw3HXU859aAr\",\"type\":\"p\"}],\"id\":\"UXaLnLK7HS9SAAm9x6qXk\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"MAZ_STANDARD\"}],\"id\":\"LyReey2F0ej34a_IW4qL6\",\"type\":\"p\"}],\"id\":\"jSSB_Jd022RX7aNbY5vrU\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"MAZ_STANDARD_IA\"}],\"id\":\"mP2Qyo1aEUb0yZwJaqiGj\",\"type\":\"p\"}],\"id\":\"ANdGQAV1ehpzGReAGjwgG\",\"type\":\"cell\"}],\"id\":\"z4rMcn-5awDUh7IEycGrq\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"첫 바이트 지연\"}],\"id\":\"HKFh337b0zcX2Ob9HC0Pj\",\"type\":\"p\"}],\"id\":\"w9BgiJkBHp7l00c--5_HY\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"밀리초 단위\"}],\"id\":\"GZ2K5cTrN5fhzOTI_GHtF\",\"type\":\"p\"}],\"id\":\"paKTNObu-WU3iLuaR9pN0\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"밀리초 단위\"}],\"id\":\"dXPetYS477tQuYo59a3Fa\",\"type\":\"p\"}],\"id\":\"81uBokkVrYHmQp0ewxORc\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"최소 1분\"}],\"id\":\"reNDJZBI6o8qxDPpGOjVE\",\"type\":\"p\"}],\"id\":\"TYqBlwWNDfyolCIc8iGYY\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"최소 12시간\"}],\"id\":\"xYksCOGSR65LbTVoDPQgF\",\"type\":\"p\"}],\"id\":\"TUXXrh2pSGZgaIrYnkDj4\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"밀리초 단위\"}],\"id\":\"y9dWkn2IDxW2VhWIXXVdw\",\"type\":\"p\"}],\"id\":\"q3un6WWZKAv-jenSTEB0L\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"밀리초 단위\"}],\"id\":\"7wmWWU-YWVRRvdyG3am3C\",\"type\":\"p\"}],\"id\":\"yUr7sKcfu9DzfMV2Tnr6P\",\"type\":\"cell\"}],\"id\":\"Y2LfU7tTHskMQcvNo6MdB\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"최소 저장 단위\"}],\"id\":\"3YLp3bCZdEFTBAVmJEZP5\",\"type\":\"p\"}],\"id\":\"eh4OzrSUXWi1P3TvWCUYh\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"제한 없음\"}],\"id\":\"OMkort9yIdyax-ms0w7Ia\",\"type\":\"p\"}],\"id\":\"2XW3LeGNNUHmHLOMixp_c\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"64KB\"}],\"id\":\"IWKq4m5CNlL3o2-Ufqoth\",\"type\":\"p\"}],\"id\":\"Hp-DNx4hMLxkcsnBqzKUb\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"64KB\"}],\"id\":\"EklT7Ll5XT--qdtkmUjCF\",\"type\":\"p\"}],\"id\":\"_O_g6oz7_QROHvsHz0P5Z\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"64KB\"}],\"id\":\"Q5MnG5MmKIyKMdFcJBwf9\",\"type\":\"p\"}],\"id\":\"9_qya9OrdJaxANRhzXgYS\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"제한 없음\"}],\"id\":\"oE_Mg6XLvGJkkpUBFFIre\",\"type\":\"p\"}],\"id\":\"62BztAV0bn8L32qDmSTao\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"제한 없음\"}],\"id\":\"1g9E7ovnCdYFs1E4AmMcD\",\"type\":\"p\"}],\"id\":\"00Ud5vfUz-7-wAyXbVA31\",\"type\":\"cell\"}],\"id\":\"s2DpRmGq2efBkumMDTFEa\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"최소 저장 기간\"}],\"id\":\"-W8DmL5jRuEYQk7xuQ4ge\",\"type\":\"p\"}],\"id\":\"bURXZ3oRy4g2UZsqyruZ2\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"제한 없음\"}],\"id\":\"rAw9UjFz9nGZ7obNIdL6j\",\"type\":\"p\"}],\"id\":\"fw_wh0q67MHiueMjXQrom\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"30일\"}],\"id\":\"0WG3QegYuOLoODrPOpabs\",\"type\":\"p\"}],\"id\":\"kDUMsMpKRNaIL8Igz7bsq\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"90일\"}],\"id\":\"ksg7YRsjMPrjYJZisAaPp\",\"type\":\"p\"}],\"id\":\"V39PURnbgmUBtw_-2FI6s\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"180일\"}],\"id\":\"9TTIkYfBzZrzKvbAEiCAh\",\"type\":\"p\"}],\"id\":\"WvAPJfAoOGWc9_VAl3xJu\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"제한 없음\"}],\"id\":\"58zrbpRxH5m7wOzrabYY7\",\"type\":\"p\"}],\"id\":\"brClbZs8s5wLe5sxabcKA\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"30일\"}],\"id\":\"d1MWnt-zhcdcBzCaU1CL6\",\"type\":\"p\"}],\"id\":\"qBtSvUpHCtMxPvesGYQTY\",\"type\":\"cell\"}],\"id\":\"fBHJiivMNgggVA6p_po0u\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"데이터 내구성\"}],\"id\":\"J5f40IVOB4ywWOUG8rArN\",\"type\":\"p\"}],\"id\":\"kR5NJEtJpMgcXsowxSfat\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"99.999999999%\"}],\"id\":\"fQyRldB4mLLWy0wWlZtdG\",\"type\":\"p\"}],\"id\":\"IJEvlDxX8-zimaej7R0od\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"99.999999999%\"}],\"id\":\"aC2KXmV8IBT9jGdyPcu9k\",\"type\":\"p\"}],\"id\":\"isGl8QZieWBUKbzsG0icM\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"99.999999999%\"}],\"id\":\"pRM-rsmmP1oCDiBPImUOj\",\"type\":\"p\"}],\"id\":\"_YJpAyDFLqSltrR2WYqWO\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"99.999999999%\"}],\"id\":\"T-o8peHHO0XjI10plq365\",\"type\":\"p\"}],\"id\":\"ONKwJHzMYT5VvomIlhknY\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"99.9999999999%\"}],\"id\":\"clawCkxFxhx8eF0abg_k3\",\"type\":\"p\"}],\"id\":\"Z1p6ULQfK7q3kzsZ7DAN6\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"99.9999999999%\"}],\"id\":\"g0iRYs13Y9lprDzmKnZUn\",\"type\":\"p\"}],\"id\":\"nFff9Uex0y75hp43Mh8YC\",\"type\":\"cell\"}],\"id\":\"xXlw264V0xwMNLZv6eT8U\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"비즈니스 디자인 가용성\"}],\"id\":\"Qr0cenbsmpJIYe1GRu6R8\",\"type\":\"p\"}],\"id\":\"w4mcc2W2wdMMR_uT2jeq5\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"99.99%\"}],\"id\":\"-sZdU8xFCBd2iMKbFg8J2\",\"type\":\"p\"}],\"id\":\"SAalzdboc2iBB-XFV2Jid\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"99.90%\"}],\"id\":\"pfUQfP_rEdyPKeu23_Ls9\",\"type\":\"p\"}],\"id\":\"LkIssYBgvfuFMKRGwMj-d\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"99.00%\"}],\"id\":\"f0_2fr8uDpQXBcN4laOAz\",\"type\":\"p\"}],\"id\":\"0nLBuqnnixLLoUF5mSsbk\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"99.00%\"}],\"id\":\"ijNdqC-fE_wzkzLDIYZVO\",\"type\":\"p\"}],\"id\":\"9WzketlihSlatOct0eV8O\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"99.995%\"}],\"id\":\"uVfNqqiwKG3misTJKU1WA\",\"type\":\"p\"}],\"id\":\"8AT0OMUzv2CrQ9muY8g3k\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"99.95%\"}],\"id\":\"D2zPZFxgynHqs1PApjCdl\",\"type\":\"p\"}],\"id\":\"xK1LnsnrzbYqq5fZatBas\",\"type\":\"cell\"}],\"id\":\"aiDEIUE3LLLem7VuHbbi7\",\"type\":\"row\"}],\"columnHeader\":false,\"id\":\"CXFm5IPmTe_aLOag58sLB\",\"rowHeader\":true,\"type\":\"table\",\"widthMode\":\"percentage\",\"widths\":[15,10,10,14,15,17,19]},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"설명:\"}],\"id\":\"oKEyHixd6mO0yq82BgTBM\",\"type\":\"p\"},{\"children\":[{\"text\":\"최소 저장 기간: 파일이 해당 스토리지 유형에 저장될 때 필요한 최소 저장 기간으로, 최소 기간을 충족하지 않으면 최소 기간 기준으로 요금이 계산됩니다. 예를 들어 STANDARD_IA는 최소 30일간 저장해야 하며 파일이 하루만 저장된 후 삭제되더라도 30일 기준으로 요금이 부과됩니다.\"}],\"id\":\"lyozPkITRB82Qlepf4j16\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"최소 저장 단위: 파일이 해당 스토리지 유형에 저장될 때 필요한 최소 파일 용량으로, 최소 용량을 충족하지 않으면 최소 용량 기준으로 요금이 계산됩니다. 예를 들어 STANDARD_IA는 최소 64KB를 저장해야 하며, 파일이 1KB만 저장된 후 삭제되더라도 64KB 기준으로 요금이 부과됩니다.\"}],\"id\":\"sukyxsHXJXFNTzCrfeVyJ\",\"start\":false,\"type\":\"uli\"}],\"hintType\":\"info\",\"id\":\"5Ckkw8hChl-UkP8Mu9hdk\",\"type\":\"hint\"},{\"children\":[{\"text\":\"최적화 2: 액세스 패턴 분석 및 데이터 계층화\"}],\"id\":\"clVq5NfT1kZ84iwGxAVx_\",\"nodeId\":\".E4.BC.98.E5.8C.96.E4.BA.8C.EF.BC.9A.E5.88.86.E6.9E.90.E8.AE.BF.E9.97.AE.E6.A8.A1.E5.BC.8F.E5.B9.B6.E8.BF.9B.E8.A1.8C.E6.95.B0.E6.8D.AE.E6.B2.89.E9.99.8D\",\"type\":\"h2\"},{\"children\":[{\"text\":\"1. 정기적으로 인벤토리 및 액세스 로그 기능을 통해 데이터 액세스 패턴을 분석\"}],\"id\":\"MBoC0JPbXVZUtgtJ2TrNF\",\"nodeId\":\"1.-.E5.AE.9A.E6.9C.9F.E9.80.9A.E8.BF.87.E6.B8.85.E5.8D.95.E5.92.8C.E8.AE.BF.E9.97.AE.E6.97.A5.E5.BF.97.E5.8A.9F.E8.83.BD.E5.88.86.E6.9E.90.E6.95.B0.E6.8D.AE.E8.AE.BF.E9.97.AE.E6.A8.A1.E5.BC.8F\",\"type\":\"h3\"},{\"children\":[{\"text\":\"데이터 액세스 패턴을 분석하면 적절한 스토리지 유형을 선택하기 위한 데이터 근거를 제공할 수 있습니다. COS는 인벤토리 기능과 액세스 로그 기능을 제공하여 각각 저장된 파일의 메타데이터 정보와 파일 액세스 기록을 기록하고, 이 정보를 사용자의 버킷에 저장합니다.\"}],\"id\":\"wE0bv7ghkLlFhQNiTL-lT\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"설명:\"}],\"id\":\"7mjGJB9XtNaT2EiL_59ZX\",\"type\":\"p\"},{\"children\":[{\"text\":\"인벤토리 기능에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"인벤토리 개요\"}],\"id\":\"SoklV3tyFou_PHqbhQa-I\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/30622\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/30622\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"16gK-VGXxZGsBUKht0ds0\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"액세스 로그 관리 기능에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"로그 관리 개요\"}],\"id\":\"vXKhRTkGsBqzIbsnK6qMb\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/16920\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/16920\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"lbefhKYsUI5Y9SMJ_o0qh\",\"start\":false,\"type\":\"uli\"}],\"hintType\":\"info\",\"id\":\"6feyHseBJ7QlNQPRPlbW3\",\"type\":\"hint\"},{\"children\":[{\"text\":\"COS는 COS Select 기능을 제공하여 파일 내의 데이터를 검색할 수 있습니다. 생성한 인벤토리 파일이나 로그 기록이 너무 많으면 EMR(Elastic MapReduce) 클러스터를 구매하여 Presto 클러스터를 구축해 데이터 분석을 수행할 수도 있습니다.\"}],\"id\":\"vju0qch7s7fVK0mDZYUEh\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"설명:\"}],\"id\":\"tDPTPQaCKbciBCRKKwsJ0\",\"type\":\"p\"},{\"children\":[{\"text\":\"COS Select 기능에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"Select 개요\"}],\"id\":\"Zzq3Nr-NbbQtUEi3Pi26J\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/32472\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/32472\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"drcHo_7YSf-mVq1l_dhtH\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"EMR 분석에 대한 자세한 내용은 \"},{\"children\":[{\"text\":\"Presto로 COS의 데이터 분석\"}],\"id\":\"hvyp2r2evK7PUg1j7cAU8\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/1026/31155\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"qu6QmwlB_TWCB60sF7nY5\",\"start\":false,\"type\":\"uli\"}],\"hintType\":\"info\",\"id\":\"lgzI19EfIqS2LNIqyirkX\",\"type\":\"hint\"},{\"children\":[{\"text\":\"인벤토리 파일 내 데이터를 검색·분석하는 예시로, 인벤토리 보고서가 지정된 버킷으로 전달된 후 콘솔에서 해당 보고서를 분석할 수 있으며, 작업 절차는 다음과 같습니다.\"}],\"id\":\"6fQnazmPFLCPJokqXVLUP\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"주의:\"}],\"id\":\"mjGhjtLIgbVdyk0oxo7Xh\",\"type\":\"p\"},{\"children\":[{\"text\":\"인벤토리 보고서 생성 방법은 \"},{\"children\":[{\"text\":\"인벤토리 개요\"}],\"id\":\"lsBU0SacEYz-6VIBf-H1w\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/30622\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/30622\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"a-6UD96f-RhYviJYqziI7\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"콘솔은 128MB 미만의 파일만 검색을 지원합니다. 인벤토리 보고서 파일이 너무 크거나 보고서 수가 너무 많은 경우, 도구·SDK·API 방식을 통해 호출할 수 있습니다.\"}],\"id\":\"P5Hcrw-XRvNttWcUGmWLi\",\"start\":false,\"type\":\"uli\"}],\"hintType\":\"alert\",\"id\":\"fYKvWxwkSEnREUQihzt3n\",\"type\":\"hint\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"COS 콘솔\"}],\"id\":\"lLwuZTHEOsv9HmYzH4z9D\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\"},{\"text\":\"에 로그인합니다.\"}],\"id\":\"0MplI9nLBMJg-oudevKZp\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"구성이 필요한 버킷 이름을 클릭하여 버킷 목록 페이지로 이동합니다.\"}],\"id\":\"e4Dzi5zj5aF92vNRnvRS1\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"해당 인벤토리 보고서를 찾아 오른쪽 작업 열에서 \"},{\"b\":1,\"text\":\"더보기\"},{\"text\":\" > \"},{\"b\":1,\"text\":\"검색\"},{\"text\":\"을 선택합니다.\"}],\"id\":\"3GciHnA1JjoMSpPGEH0LP\",\"start\":false,\"type\":\"oli\"},{\"id\":\"fceFF1c9lgNWkGjPRjYzq\",\"type\":\"oli\",\"children\":[{\"text\":\"객체 검색 페이지에서 입력 매개변수를 설정하고 검색 구문을 입력한 후\"},{\"text\":\" SQL 실행\",\"b\":1},{\"text\":\"을 클릭하면 결과 페이지에서 검색 결과를 확인할 수 있습니다. 자세한 작업 지침은 데이터 검색을 참고하십시오. 아래는 인벤토리 보고서 검색에 자주 사용되는 쿼리 예시입니다.\"}]},{\"children\":[{\"text\":\"특정 날짜의 특정 스토리지 유형에 저장된 파일 개수 조회:\"}],\"id\":\"VnPq6ucYgHPFhaVqgyejt\",\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"select count(*) from cosobject s where s._7 = \"}],\"id\":\"lNZaiDsQmo3kvLIQQ-bom\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"select count(*) from cosobject s where s._7 = 'Standard'\"}],\"id\":\"kYRdDPiDNTcQdVWPtMR7B\",\"type\":\"code-line\"}],\"id\":\"eJpV1J-4XTvAOz7JTyCmh\",\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"특정 날짜의 특정 스토리지 유형에서 몇 MB 용량이 있는지 조회:\"}],\"id\":\"5urBGEKEMA6J8CT6jqsq5\",\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"select SUM(CAST(s._4 AS FLOAT))/1024/1024 from cosobject s where s._7 = \"}],\"id\":\"4d4HBSbNBymr8WjkTDt5M\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"select SUM(CAST(s._4 AS FLOAT))/1024/1024 from cosobject s where s._7 = 'Standard'\"}],\"id\":\"xkJdgW2n7KPp9XDRAYv84\",\"type\":\"code-line\"}],\"id\":\"2rVnB25mINH5GL_TJQFl0\",\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"특정 스토리지 유형에서 64KB 미만 파일 개수 조회:\"}],\"id\":\"vxqNfQzJoXBUB33mRoDqU\",\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"select count(*) from cosobject s where s._7 = and CAST(s._4 AS FLOAT) < \"}],\"id\":\"0XvE4X47nQcMtcd05pMbO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"select count(*) from cosobject s where s._7 = 'Standard_IA' and s._4 < 64*1024\"}],\"id\":\"wZI2X2n0YwrtZjetCqKh_\",\"type\":\"code-line\"}],\"id\":\"XCNF7BMAgxAok3ChN-06Y\",\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"버킷 내 리전 간 복사 실패 파일 개수 조회:\"}],\"id\":\"O7NrvVHBjATu5X4LfuR2H\",\"indent\":1,\"start\":false,\"type\":\"uli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"select count(*) from cosobject s where s._9 = 'Failed'\"}],\"id\":\"rlHWdeIimlLCmQ3CsF_Ht\",\"type\":\"code-line\"}],\"id\":\"9nSxmb-oR-od2uSlfvKyl\",\"indent\":2,\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"주의:\"}],\"id\":\"5x0accqkpmWbdnwjPWhdn\",\"type\":\"p\"},{\"children\":[{\"text\":\"인벤토리 보고서에는 테이블 헤더 정보가 포함되지 않으므로 해당 필드의 순번만 입력하여 검색할 수 있습니다. 인벤토리 보고서의 테이블 헤더와 순번 대응 정보는 다음과 같습니다.\"}],\"id\":\"TOUnj-cXQigd40tD3vhJT\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"Appid\"}],\"id\":\"sPQua9B1PAW15C6QEla_p\",\"type\":\"p\"}],\"id\":\"9vWuGQXWbNJ1KhghYw3fK\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"Bucket\"}],\"id\":\"Q6XZ730t5H0_wIjWuWqWP\",\"type\":\"p\"}],\"id\":\"nTCOPnDg6KQZL4cxg_IiQ\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"Key\"}],\"id\":\"6FFEsg87mKk1S_ddskyvr\",\"type\":\"p\"}],\"id\":\"5cMoTuaxtAtn9cGzKiL-l\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"Size\"}],\"id\":\"vJnIs6LAp0TS_8mzwpcnW\",\"type\":\"p\"}],\"id\":\"ej_cFA5AzJl0xsMjStUzT\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"LastModifiedDate\"}],\"id\":\"kW12kUsXF6YcZeM-U-gxe\",\"type\":\"p\"}],\"id\":\"EunX0X__7wvVqLa0WJU0L\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"ETag\"}],\"id\":\"8sY6TI2WoU6fxuMwmvgx9\",\"type\":\"p\"}],\"id\":\"cDkJ77h06_nO8jSQYv0g1\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"StorageClass\"}],\"id\":\"BJJOfqlQ-l_R-C3qlqdqZ\",\"type\":\"p\"}],\"id\":\"HVO7Nellhygd1Kw-DN8oT\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"IsMultipartUploaded\"}],\"id\":\"ZLRuhb0Cf1vM_Tm5vv8dz\",\"type\":\"p\"}],\"id\":\"utf8t59aphNc1IUKyeMp3\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"ReplicationStatus\"}],\"id\":\"LHJAfuKsXAkByrRziQ_g-\",\"type\":\"p\"}],\"id\":\"cGPeWSRV0qpQxaoKTpuVb\",\"type\":\"cell\"}],\"id\":\"-RDOShAOEsNEWDCUYSvW-\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"s._1\"}],\"id\":\"z37Fx0B_BJkr9OFQK40HU\",\"type\":\"p\"}],\"id\":\"Ntro_dnCxqOXVAUg9ZML1\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"s._2\"}],\"id\":\"eojnJJi8wL_E0agMaRsg6\",\"type\":\"p\"}],\"id\":\"CNTixVEcVJD4CeQyfztMV\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"s._3\"}],\"id\":\"1xelMohKvxbhLnMXJZpgY\",\"type\":\"p\"}],\"id\":\"S5MRohSUTv6GKCLppMIDR\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"s._4\"}],\"id\":\"_YgiR7VtcGjb8Z6MA3L7A\",\"type\":\"p\"}],\"id\":\"EzjhgcSS7OAu_GDjGC7mQ\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"s._5\"}],\"id\":\"w9Ac9BVwnXZ4zhvMV5CAR\",\"type\":\"p\"}],\"id\":\"jMF_vcWaU4Bv1ya7dCyzQ\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"s._6\"}],\"id\":\"MYxQsP4nbfBckiD12pwSV\",\"type\":\"p\"}],\"id\":\"paaI_MdAcPLDmTKNqzs4n\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"s._7\"}],\"id\":\"zUcwEfYn-DdmztllyhpMM\",\"type\":\"p\"}],\"id\":\"qubITo5edfPhMNW20MIWd\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"s._8\"}],\"id\":\"wxSq1SBpqrzwOtMt7JjmL\",\"type\":\"p\"}],\"id\":\"2pmnsTdLSX_Dds-_gaME5\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"s._9\"}],\"id\":\"-p3vYBcwfCU6Gx95iQhpp\",\"type\":\"p\"}],\"id\":\"Sm0owtiBJKz0li7nSwzje\",\"type\":\"cell\"}],\"id\":\"jJ8YL9C-h84ym19P9b5eU\",\"type\":\"row\"}],\"columnHeader\":false,\"id\":\"n9XNQLtTRemT4QQPPpo6Q\",\"rowHeader\":true,\"type\":\"table\",\"widths\":[93,103,89,81,116,75,119,117,111]}],\"hintType\":\"alert\",\"id\":\"Ud3eXJ55Dd1i31zGvDmA8\",\"type\":\"hint\"},{\"children\":[{\"text\":\"2. 라이프사이클 및 일괄 처리를 통한 데이터 계층화\"}],\"id\":\"X4QILttmPzXKgOAKXbKS7\",\"nodeId\":\"2.-.E9.80.9A.E8.BF.87.E7.94.9F.E5.91.BD.E5.91.A8.E6.9C.9F.E5.92.8C.E6.89.B9.E9.87.8F.E5.A4.84.E7.90.86.E6.B2.89.E9.99.8D.E6.95.B0.E6.8D.AE\",\"type\":\"h3\"},{\"children\":[{\"text\":\"비즈니스 발전 과정에서 데이터 액세스 패턴은 항상 동적으로 변화합니다. 정기적으로 인벤토리 및 액세스 로그 기능을 통해 데이터 액세스 패턴을 분석한 후, 분석 보고서를 기반으로 비즈니스 데이터를 계층화할 수 있습니다.\"}],\"id\":\"FTqkFj8WYYpszEqSwc_9f\",\"type\":\"p\"},{\"children\":[{\"text\":\"대부분의 데이터는 저장 기간이 길어짐에 따라 액세스 빈도가 일반적으로 감소하기 때문에, 기업은 비즈니스 데이터 액세스 패턴의 변화에 따라 스토리지 유형을 조정하여 비즈니스 비용을 최적 상태로 관리할 필요가 있습니다.\"}],\"id\":\"tfof_2hbE-43GZ4NAO9_J\",\"type\":\"p\"},{\"children\":[{\"text\":\"COS는 기업이 정기적으로 스토리지 유형을 전환할 수 있도록 라이프사이클 기능을 제공합니다. 기업은 인벤토리와 액세스 로그를 통해 비즈니스 데이터 액세스 패턴을 분석하고, 이에 따라 합리적인 라이프사이클 전환 규칙을 수립할 수 있습니다.\"}],\"id\":\"818-lzmDXJuzq6m6jql7B\",\"type\":\"p\"},{\"children\":[{\"text\":\"커뮤니티 플랫폼을 운영하는 한 고객을 예로 들어보면, COS를 사용하여 사용자가 업로드한 이미지 데이터를 저장합니다. 일반적으로 이미지 데이터는 업로드 직후 일정 기간 동안은 자주 접근되지만, 일정 시간이 지나면 대부분의 데이터가 점차 '쿨링'되어 접근 빈도가 줄어듭니다. 만약 이 고객의 대부분 이미지 데이터가 90일 이후 월 1회 미만으로 접근되고, 365일 이후에는 거의 접근되지 않는다면, \"},{\"b\":1,\"text\":\"라이프사이클 설정\"},{\"text\":\"과 \"},{\"b\":1,\"text\":\"라이프사이클 미설정\"},{\"text\":\"에 따른 비용을 비교할 수 있습니다.\"}],\"id\":\"dIv0aJcwPbxfXx02Oou2x\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"text\":\"비교 항목\"}],\"id\":\"b61UWROEVn7gN-wRJcmTc\",\"type\":\"p\"}],\"id\":\"Wpg9Kpjjsqnjbo5lpaUQR\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"STANDARD만 사용\"}],\"id\":\"BBT7iMSQXj2kFnUgK-7h3\",\"type\":\"p\"}],\"id\":\"wFNXOkwANnIlDucultjsh\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"STANDARD로 핫 데이터를 저장 후, 90일 이후 STANDARD_IA로 전환\"}],\"id\":\"b0NN6-tphHRWsnzxSWdZp\",\"type\":\"p\"}],\"id\":\"EEDpalTqPam2Ggnfyd0az\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"STANDARD로 핫 데이터를 저장 후, 90일 이후 STANDARD_IA로 전환, 365일 이후 ARCHIVE로 전환\"}],\"id\":\"T_5l2SL7y2qNv2LkSCMX4\",\"type\":\"p\"}],\"id\":\"mbG3VFsI5AV9Q9bx-zwCe\",\"type\":\"cell\"}],\"id\":\"93tofL1IqhivIiOVrAs7n\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"스토리지 단가(USD/GB/월, 광저우 리전을 예로 듦)\"}],\"id\":\"a4BN7YkUD2EtqS0qhgzz_\",\"type\":\"p\"}],\"id\":\"TLkbdztXbdtEgWcGSnCqG\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"STANDARD: 0.016\"}],\"id\":\"W6VWwAdOQHGME0g1C5fD1\",\"type\":\"p\"}],\"id\":\"7rVzkjR1-Ne2-A-CMhrTg\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"STANDARD: 0.016\"}],\"id\":\"hMhM0HRpLudPZzn_QcDUX\",\"type\":\"p\"},{\"children\":[{\"text\":\"STANDARD_IA: 0.01\"}],\"id\":\"l5eQXlKJMXbsnB0Up9D9e\",\"type\":\"p\"}],\"id\":\"-Nl_dfDqrQuWAE0qapNiP\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"STANDARD: 0.016\"}],\"id\":\"zocGmERUM8Bzi84MM_KQc\",\"type\":\"p\"},{\"children\":[{\"text\":\"STANDARD_IA: 0.01\"}],\"id\":\"i5_Kb9QwVO_u5s76uxeBd\",\"type\":\"p\"},{\"children\":[{\"text\":\"ARCHIVE: 0.004\"}],\"id\":\"9xyjb3g_LhBP_AWHoPB-x\",\"type\":\"p\"}],\"id\":\"KlF8U56C_HcOPJW4X5U4k\",\"type\":\"cell\"}],\"id\":\"XLBPjJjuR-JxTYFj8_SfB\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"저장 기간\"}],\"id\":\"EuITNOUIdUPrgaYc6Tis7\",\"type\":\"p\"}],\"id\":\"cZiJdeOh7dMUTuYspifN6\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"24개월\"}],\"id\":\"mzbmJ061l56OJSE1ouZZd\",\"type\":\"p\"}],\"id\":\"tZ0CCxfkyXHt87msjktOu\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"24개월\"}],\"id\":\"xmUMWxIhcVy_EHycrq-Xr\",\"type\":\"p\"},{\"children\":[{\"text\":\"(3개월 STANDARD + 21개월 STANDARD_IA)\"}],\"id\":\"VyxtFjIYjLd3rvOT8vCVI\",\"type\":\"p\"}],\"id\":\"phP7CZ44soAobd3c98oOI\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"24개월\"}],\"id\":\"m4o46hLhp5eNDwbcGUKn4\",\"type\":\"p\"},{\"children\":[{\"text\":\"(3개월 STANDARD + 9개월 STANDARD_IA + 12개월 ARCHIVE)\"}],\"id\":\"ZUGU7m2JH9qb6h0W5MPSj\",\"type\":\"p\"}],\"id\":\"1tzuXlJsD7xlxbK2ijARf\",\"type\":\"cell\"}],\"id\":\"2aMRz1Mi4rrVE2STWm5_a\",\"type\":\"row\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"총 스토리지 비용(USD)\"}],\"id\":\"X52GGvLTI5hbNe5XkpNKE\",\"type\":\"p\"}],\"id\":\"G5g3zlVMf0mTnJuMk717o\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"39321.60\"}],\"id\":\"PzKOVNR4wUDpO3Pgswezg\",\"type\":\"p\"}],\"id\":\"APmwDPGXYNvrE0tuKMGJX\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"26419.20\"}],\"id\":\"_8Bkw0WJNo-TzXiJV5CuV\",\"type\":\"p\"}],\"id\":\"ZMIX2GtUFLoQzjzLBalST\",\"type\":\"cell\"},{\"children\":[{\"children\":[{\"text\":\"19046.40\"}],\"id\":\"w5jEDWrDeKR1UIxJYuqD9\",\"type\":\"p\"}],\"id\":\"2T3U4Dijb-s7-C3AN-H2G\",\"type\":\"cell\"}],\"id\":\"c2ReT8qSszyE2rWYQJ9Cw\",\"type\":\"row\"}],\"columnHeader\":false,\"id\":\"LiZ0axOePhUXLheTnkshP\",\"rowHeader\":true,\"type\":\"table\",\"widths\":[184,172,238,377]},{\"children\":[{\"text\":\"라이프사이클 규칙을 사용하여 버킷의 객체를 관리하면 데이터 저장 비용을 크게 절감할 수 있습니다. 장기 저장 데이터의 경우\"},{\"b\":1,\"text\":\"라이프사이클 규칙을 적절히 구성하면 비즈니스 저장 비용을 50% 이상 절감할 수 있습니다\"},{\"text\":\".\"}],\"id\":\"BAbOrSAl0FBv88dCPPDty\",\"type\":\"p\"},{\"children\":[{\"text\":\"비즈니스 데이터 스토리지 유형 관리 외에도 라이프사이클 기능은 스토리지 버킷의 \"},{\"children\":[{\"text\":\"파일 조각\"}],\"id\":\"kk0plbOinNnFioS6Dm-3X\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/31632\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/31632\"},\"type\":\"ref\"},{\"text\":\" 및 \"},{\"children\":[{\"text\":\"이전 버전 파일\"}],\"id\":\"4RivELrEyPEHz-U4ZNiid\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/19883\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/19883\"},\"type\":\"ref\"},{\"text\":\" 관리에도 사용할 수 있습니다. 파일 조각은 대용량 파일 업로드 중 네트워크 중단 등으로 전송이 실패하여 생성된 불완전한 파일 파트 정보를 의미합니다. 비즈니스 데이터에 다수의 파일 조각이 존재한다면 라이프사이클 규칙을 통해 만료 삭제할 수 있습니다. 이전 버전 파일은 버전 관리 기능을 활성화하면 생성되는 구 버전 파일로, 데이터 오삭제 후 복구 및 롤백에 활용할 수 있으나 스토리지 공간을 차지합니다. 따라서 비즈니스에서도 더 이상 사용하지 않는 이전 버전 파일에 만료 삭제 시간을 설정하여 정리함으로써 데이터 보안과 비용 균형을 달성할 수 있습니다.\"}],\"id\":\"St1EQt5TPmnLcar0B_Z9n\",\"type\":\"p\"},{\"children\":[{\"text\":\"규칙을 추가하여 \"},{\"b\":1,\"text\":\"이전 버전 파일 관리\"},{\"text\":\"를 활성화하면 이전 버전 파일을 쿨링하거나 삭제할 수 있으며, \"},{\"b\":1,\"text\":\"조각 삭제\"},{\"text\":\"를 선택하고 만료 시간을 설정하면 존재할 수 있는 파일 조각을 정리할 수 있습니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"라이프사이클 설정\"}],\"id\":\"auRigBUvzrsF-9qZaTOtr\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/17031\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/17031\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"2q_H3PI8u7Prreo5mGjM3\",\"type\":\"uli\"},{\"children\":[{\"text\":\"대량의 파일을 한 번에 더 쿨한 스토리지 유형으로 변환해야 하지만 접두사나 태그와 같은 고정 규칙이 없는 일부 비즈니스의 경우, 사용자는 \"},{\"children\":[{\"text\":\"COS 일괄 작업(Batch)\"}],\"id\":\"dG7PEO4lyNO0anJXvGeWP\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/32958\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/32958\"},\"type\":\"ref\"},{\"text\":\" 기능을 활용하여 일괄 복사 기능으로 데이터를 다른 스토리지 유형으로 전환할 수 있습니다. 또한 비즈니스 데이터에 \"},{\"children\":[{\"text\":\"객체 태그 추가\"}],\"id\":\"8_Apr8Kn5B1W5DyKOiQrq\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/35665\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/35665\"},\"type\":\"ref\"},{\"text\":\"를 하여 라이프사이클 규칙을 설정하면 일괄 삭제도 가능합니다. 작업 단계는 다음과 같습니다.\"}],\"id\":\"RgOoodllLgYsxYwCqmhLm\",\"type\":\"uli\"},{\"children\":[{\"text\":\"처리할 파일 목록을 내보내 CSV 형식 파일로 정리합니다.\"}],\"id\":\"_wlptqfhT4RZEQ83NXCHr\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"COSBatch 일괄 처리 작업을 생성하고 파일 목록을 가져옵니다.\"}],\"id\":\"CV_nkj1SC5ubYtsy9I94W\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"일괄 처리 작업을 실행하고 완료될 때까지 기다리면 됩니다.\"}],\"id\":\"Tng9ZIWrzZpPqCdyy4uXg\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"자세한 작업 단계는 \"},{\"children\":[{\"text\":\"일괄 작업\"}],\"id\":\"WWsMt40nCCCkPiZEs42gn\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/32956\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/32956\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"UEbY3LMMikKLR5ze2a5Ig\",\"type\":\"p\"},{\"children\":[{\"text\":\"비용 회고 진행\"}],\"id\":\"4kNgVZZeW3KKjG7J_f-Jz\",\"nodeId\":\".E8.BF.9B.E8.A1.8C.E6.88.90.E6.9C.AC.E5.9B.9E.E9.A1.BE\",\"type\":\"h2\"},{\"children\":[{\"text\":\"비용 최적화는 비즈니스 전체 프로세스에 걸쳐 수행되어야 하며, 단순히 클라우드 전환 시 비용 계획을 수립하는 것에 그쳐서는 안 됩니다. 비즈니스는 수시로 비용 회고를 진행해야 합니다. 한편으로 비즈니스 발전에 따라 스토리지 수요와 데이터 액세스 패턴이 실시간으로 변화하고, 다른 한편으로 Tencent Cloud COS는 사용자에게 더 저렴한 스토리지 서비스를 제공하여 비용 절감과 효율 향상을 지원하고 있습니다. 따라서 수시로 비용 회고를 진행하고 비즈니스 요구에 따라 클라우드 스토리지 아키텍처를 합리적으로 계획하는 것은 저장 비용 절감에 도움이 됩니다.\"}],\"id\":\"JbFv6coLmK4r12KH4ZgJs\",\"type\":\"p\"},{\"children\":[{\"text\":\"이 외에도 다음을 수행할 수 있습니다.\"}],\"id\":\"gIIHXhmR7u5sM6eLuYS0u\",\"type\":\"p\"},{\"children\":[{\"text\":\"비용 센터의 \"},{\"children\":[{\"text\":\"사용량 세부 정보 내보내기\"}],\"id\":\"RilGLuPvlXCxXnNWko2w7\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/expense/bill/dosageDownload\"},\"type\":\"ref\"},{\"text\":\" 페이지에서 Tencent Cloud 청구서를 다운로드하여 COS \\t사용량 세부 정보를 확인하고, 사용 현황을 분석해 맞춤형 최적화를 진행할 수 있습니다.\"}],\"id\":\"LKTKfNVBESdqxChspL2F5\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"COS 콘솔 개요 페이지\"}],\"id\":\"hrdaXzTTL9rtjBho47HkV\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\"},{\"text\":\"에 접속하여 COS 신제품 출시 현황을 확인하고, 비용 최적화 관련 소식을 확인할 수 있습니다.\"}],\"id\":\"SZowwS9wZcg-0sKUcHiyg\",\"start\":false,\"type\":\"oli\"}]"}},"73579":{"categoryId":436,"weight":90,"type":"page","extension":"","pid":33419,"id":73579,"lang":"ko","title":"업로드 보안 제한","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2025-09-19 18:43:52","recentReleaseTime":"2025-09-19 18:43:52","content":{"title":"업로드 보안 제한","body":"
본 문서는 클라이언트 업로드 시 발생할 수 있는 일반적인 문제에 대한 해결 방안을 소개하며, 아래 예시는 직접 업로드 및 클라이언트 SDK 업로드 시나리오에 적용됩니다.
서버 측 코드 구현은 Node.js를 예로 들며, 더 많은 언어는 서버 서명 사례을 참고하십시오.

1. 업로드 크기 제한

시나리오 1: PutObject 업로드, sts 임시 키 정책의 condition에 numeric_less_than_equal 조건 설정을 통해 구현

condition: {
// 업로드 파일은 최대 5MB로 제한됨
'numeric_less_than_equal': {
'cos:content-length': 5 * 1024 * 1024
},
}

시나리오 2: PostObject 업로드, 서명 policy의 conditions를 통해 content-length-range 조건 설정하여 구현

var policy = JSON.stringify({
...
conditions: [
['content-length-range', 1, 5 * 1024 * 1024], // 업로드 파일 크기 범위 제한 가능(예: 1 - 5MB)
],
});
위의 예시는 5MB를 초과하는 파일 업로드에 대해 403 오류를 반환합니다.

2. 업로드 파일 유형 제한

시나리오 1: PutObject 업로드, sts 임시 키 정책의 condition에 string_like 조건 설정을 통해 구현

condition: {
// 업로드 파일의 content-type이 이미지 유형이어야 함
'string_like': {
'cos:content-type': 'image/*'
}
}

시나리오 2: PostObject 업로드, 서명 policy의 conditions에 $Content-Type 조건 설정을 통해 구현

var policy = JSON.stringify({
...
conditions: [
// 업로드 파일의 content-type이 이미지 유형이어야 함
['starts-with', '$Content-Type', 'image/*'],
],
});
위 예시는 이미지가 아닌 파일 업로드에 대해 403 오류를 반환합니다.

3. 파일 업로드 시 덮어쓰기 방지

Web 또는 클라이언트 업로드 시나리오에서 파일 이름이 클라이언트에 의해 지정된 경우 파일이 덮어쓰기될 위험이 있을 수 있습니다.
파일 덮어쓰기를 방지하기 위한 핵심 조치는 서버에서 업로드 경로를 결정하는 것입니다.
/** 서버에서 업로드 경로 생성 예시 nodejs **/

// 클라이언트에서 전달된 파일 확장자 ext 획득
const ext = req.query.ext;
const cosKey = generateCosKey(ext);

function generateCosKey(ext) {
const date = new Date();
const m = date.getMonth() + 1;
const ymd = `${date.getFullYear()}${m < 10 ? `0${m}` : m}${date.getDate()}`;
const r = ('000000' + Math.random() * 1000000).slice(-6);
const cosKey = `file/${ymd}/${ymd}_${r}${ext ? `.${ext}` : ''}`;
return cosKey;
};

실행 과정

1. 클라이언트에서 파일을 선택하면 클라이언트가 확장자를 서버로 전송합니다.
2. 서버는 확장자에 따라 시간이 포함된 임의의 COS 파일 경로를 생성하고 해당 서명을 계산한 후 URL과 서명 정보를 클라이언트에 반환합니다.
3. 클라이언트는 PUT 또는 POST 요청을 사용하여 파일을 COS에 직접 업로드합니다.
\"\"


관련 문서



","recentReleaseTime":"2025-09-19 10:43:52","slate":"[{\"children\":[{\"text\":\"본 문서는 클라이언트 업로드 시 발생할 수 있는 일반적인 문제에 대한 해결 방안을 소개하며, 아래 예시는 직접 업로드 및 클라이언트 SDK 업로드 시나리오에 적용됩니다.\"}],\"id\":\"EcXWB34YOUnbpmMEwOwO9\",\"type\":\"p\"},{\"children\":[{\"text\":\"서버 측 코드 구현은 Node.js를 예로 들며, 더 많은 언어는 \"},{\"children\":[{\"text\":\"서버 서명 사례\"}],\"id\":\"gZ2-dwRcHRrsHolVAAfBT\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/73580\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"Eco7g44L76eOG7UccLbvc\",\"type\":\"p\"},{\"children\":[{\"text\":\"1. 업로드 크기 제한\"}],\"id\":\"VNqWlSUhU8vDo6GioNJ2h\",\"nodeId\":\"5a8f238c-2997-4328-b4a4-26eafd9e25be\",\"type\":\"h2\"},{\"children\":[{\"text\":\"시나리오 1: PutObject 업로드, sts 임시 키 정책의 condition에 numeric_less_than_equal 조건 설정을 통해 구현\"}],\"id\":\"7Sz9jM_uD9zOBAPbcwsIf\",\"nodeId\":\"03da9686-9b07-4597-8067-06b1a0595188\",\"type\":\"h3\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"condition: {\"}],\"id\":\"uk1VEyo9rs1xNygR_T04m\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드 파일은 최대 5MB로 제한됨\"}],\"id\":\"fBTCNwmwCqqFW3-bNgJ2i\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'numeric_less_than_equal': {\"}],\"id\":\"HwGTvV14Uswb6_96rR334\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'cos:content-length': 5 * 1024 * 1024\"}],\"id\":\"UwqM2XEXNq_r13NoOX9T4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"om_Np6aIGlZtNmIWbTx7I\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"n8JBwIayyjyOLZP0cyxgd\",\"type\":\"code-line\"}],\"id\":\"UPQ7Oh5N0ZgEPFw1G-ulW\",\"language\":\"javascript\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"시나리오 2: PostObject 업로드, 서명 policy의 conditions를 통해 content-length-range 조건 설정하여 구현\"}],\"id\":\"xgAsFqWONN2e1_41vHD9T\",\"nodeId\":\"5b8ad6d9-0721-41f0-9cae-c60a409ea5af\",\"type\":\"h3\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\" var policy = JSON.stringify({\"}],\"id\":\"5ouivIUfZPc-SNbjyUBiK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ...\"}],\"id\":\"OyG2vJAL6VV-aKSaUMB58\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" conditions: [\"}],\"id\":\"tBI-QcjjGbiy3wMDW0EoE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ['content-length-range', 1, 5 * 1024 * 1024], // 업로드 파일 크기 범위 제한 가능(예: 1 - 5MB)\"}],\"id\":\"oqlxPU9CvndiTQV22xOfI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"DytNLvXGSPpKLuRpvLYgf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"fQ59UZETowiCeFTfuyuU7\",\"type\":\"code-line\"}],\"id\":\"f-AtR9o9rsg7YdVHUS7LN\",\"language\":\"javascript\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"위의 예시는 5MB를 초과하는 파일 업로드에 대해 403 오류를 반환합니다.\"}],\"id\":\"K5q0JXI5jsucIZMgoGNVQ\",\"type\":\"p\"},{\"children\":[{\"text\":\"2. 업로드 파일 유형 제한\"}],\"id\":\"e30MSA3qxjNXapa8pHL3A\",\"nodeId\":\"be1a80be-7a66-40e6-880a-fce19a3a906d\",\"type\":\"h2\"},{\"children\":[{\"text\":\"시나리오 1: PutObject 업로드, sts 임시 키 정책의 condition에 string_like 조건 설정을 통해 구현\"}],\"id\":\"tJ8V1rkN3-o2NoVaU6nIx\",\"nodeId\":\"5276d35c-0fde-4b53-a27c-d0d94cabe733\",\"type\":\"h3\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"condition: {\"}],\"id\":\"lI7RFwF4yEuaMqWEwcac3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드 파일의 content-type이 이미지 유형이어야 함\"}],\"id\":\"AQlRVYZCF2adXDseTY-tS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'string_like': {\"}],\"id\":\"fCUtvH7S_07mOgpclZSn7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'cos:content-type': 'image/*'\"}],\"id\":\"1BC9SL39Gt8oq0h9bU0hf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"oJgvGe2kXRitVX_1fQoQi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"wKYekTW310jbHx5j3z0Cv\",\"type\":\"code-line\"}],\"id\":\"02SY63j_fuzDwPeCqyTah\",\"language\":\"javascript\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"시나리오 2: PostObject 업로드, 서명 policy의 conditions에 $Content-Type 조건 설정을 통해 구현\"}],\"id\":\"vwoyf4G1jkLtI5XSaAviG\",\"nodeId\":\"45c377fc-df74-4924-9c50-46fabe4a1d73\",\"type\":\"h3\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\" var policy = JSON.stringify({\"}],\"id\":\"PCLt2zMPXE-4hsHhfKg7k\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ...\"}],\"id\":\"eszpZQAgOxL7gEXrCHqmg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" conditions: [\"}],\"id\":\"AIKFdiY_7IfQyGQ9Kx6QH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드 파일의 content-type이 이미지 유형이어야 함\"}],\"id\":\"COENZ4z5U6kfRC2WIplV_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ['starts-with', '$Content-Type', 'image/*'],\"}],\"id\":\"2LfviBHUXnm75vMa-LGg9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"y0WKEm0A8JbRNTxV4FtiY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"0lTf2ktrPs_NC77hjOIXm\",\"type\":\"code-line\"}],\"id\":\"YpB2v_hBUAhnVOG7EsMgK\",\"language\":\"javascript\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"위 예시는 이미지가 아닌 파일 업로드에 대해 403 오류를 반환합니다.\"}],\"id\":\"3E_v6xrF9ZWxm2Ez5Fwvp\",\"type\":\"p\"},{\"children\":[{\"text\":\"3. 파일 업로드 시 덮어쓰기 방지\"}],\"id\":\"0pYIiDxbdKe8htfMykmDZ\",\"nodeId\":\"0e9adb2a-8b94-4a81-abcd-e170b87cfeae\",\"type\":\"h2\"},{\"children\":[{\"text\":\" Web 또는 클라이언트 업로드 시나리오에서 파일 이름이 클라이언트에 의해 지정된 경우 파일이 덮어쓰기될 위험이 있을 수 있습니다.\"}],\"id\":\"BN_lQQw73hC3oQ5wL9MDb\",\"type\":\"p\"},{\"children\":[{\"text\":\"파일 덮어쓰기를 방지하기 위한 핵심 조치는 \"},{\"b\":1,\"text\":\"서버에서 업로드 경로를 결정하는 것\"},{\"text\":\"입니다.\"}],\"id\":\"APfZh53_hMI5HZo_d_2r3\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"/** 서버에서 업로드 경로 생성 예시 nodejs **/\"}],\"id\":\"sZnUKmHeh2Ug6oBBzARGu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"46t408cwz9iyRgLM9BFY4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"// 클라이언트에서 전달된 파일 확장자 ext 획득\"}],\"id\":\"vU0o8qeHAJlYZAP1-dNVF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"const ext = req.query.ext;\"}],\"id\":\"jD_zHVzwr57LGWbTUUX4y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"const cosKey = generateCosKey(ext);\"}],\"id\":\"U_Xom4V5dP3_R4eKWLJ3k\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"ou6ILHT_N3LZrxU7z-aL9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"function generateCosKey(ext) {\"}],\"id\":\"kq37Q30bJoolWkAb29A3g\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const date = new Date();\"}],\"id\":\"ZZcSaF4kjXX_yrn-rzvFY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const m = date.getMonth() + 1;\"}],\"id\":\"Ng0GuvfSb8cH06MXYqUNl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const ymd = `${date.getFullYear()}${m \\u003c 10 ? `0${m}` : m}${date.getDate()}`;\"}],\"id\":\"ZUz9JMSNW4DiJG9qrX8Zu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const r = ('000000' + Math.random() * 1000000).slice(-6);\"}],\"id\":\"PtLZTH6SW8E0DBfU2omkt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const cosKey = `file/${ymd}/${ymd}_${r}${ext ? `.${ext}` : ''}`;\"}],\"id\":\"2niRAawpmx2bjQcWVLmoL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return cosKey;\"}],\"id\":\"IKrZdC7XtQRjsgNokrPRE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"};\"}],\"id\":\"7rrQ49lKz6PZkOK5ELNbT\",\"type\":\"code-line\"}],\"id\":\"niB0i5reInMlDelGiLYX8\",\"language\":\"javascript\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"실행 과정\"}],\"id\":\"ZzjXhkPNF0FjtbchOI9yj\",\"nodeId\":\"96ab0e4c-fb21-43ae-9b99-3157475de7ac\",\"type\":\"h3\"},{\"children\":[{\"text\":\"클라이언트에서 파일을 선택하면 클라이언트가 확장자를 서버로 전송합니다.\"}],\"id\":\"8CxlYkFtJJ_Lsr4zAy1EZ\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"서버는 확장자에 따라 시간이 포함된 임의의 COS 파일 경로를 생성하고 해당 서명을 계산한 후 URL과 서명 정보를 클라이언트에 반환합니다.\"}],\"id\":\"2mhtdFTcYhw_ICFFNRhF1\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"클라이언트는 PUT 또는 POST 요청을 사용하여 파일을 COS에 직접 업로드합니다.\"}],\"id\":\"u-RDmLUJpwhzwWdxXWYPL\",\"start\":false,\"type\":\"oli\"},{\"alt\":\"\",\"children\":[{\"text\":\"\"}],\"id\":\"2XJn4z9j13q-MmkTJ1kLS\",\"indent\":1,\"inline\":false,\"naturalSize\":[644,530],\"size\":[498,409],\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/f2b98301937411f097255254005ef0f7.png\"},{\"children\":[{\"text\":\"관련 문서\"}],\"id\":\"uAntphDL00CdNJbf4gSAY\",\"nodeId\":\"75ad8702-ab55-4427-8096-4d191a6910f3\",\"start\":false,\"type\":\"h2\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"프론트엔드에서 COS로 직접 업로드 시 임시 키 보안 가이드\"}],\"id\":\"fmb2W2ED7MkqNBTmUfP4t\",\"props\":{\"anchor\":\"\",\"id\":\"115554055628791808\",\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/35265\"},\"type\":\"ref\"},{\"text\":\"\"}],\"id\":\"FLn1nxes-hyuvawgcu0jM\",\"type\":\"uli\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"Web 직접 업로드 사례\"}],\"id\":\"sc1d1FPIhHfZOo8VMEnZB\",\"props\":{\"anchor\":\"\",\"id\":\"115554057815072768\",\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/9067\"},\"type\":\"ref\"},{\"text\":\"\"}],\"id\":\"U-nKRAOvezVAlfvFS5zFO\",\"type\":\"uli\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"미니프로그램 직접 업로드 사례\"}],\"id\":\"5NhP0wAG54SOg5tZ2Yg8C\",\"props\":{\"anchor\":\"\",\"id\":\"115554057852821504\",\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/30934\"},\"type\":\"ref\"},{\"text\":\"\"}],\"id\":\"D2cGwEq8gc-HlrbnjyW6s\",\"type\":\"uli\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"모바일 애플리케이션 직접 업로드 사례\"}],\"id\":\"r691QMo7S0UXMGRQe_a-s\",\"props\":{\"anchor\":\"\",\"id\":\"115554057890570240\",\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/30618\"},\"type\":\"ref\"},{\"text\":\"\"}],\"id\":\"Pz8aDIbqo7rEsy9ngcK-G\",\"type\":\"uli\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"HarmonyOS 직접 업로드 사례\"}],\"id\":\"2aFmRTvyWvw-Xav-2POA5\",\"props\":{\"anchor\":\"\",\"id\":\"135511341732958208\",\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/73581\"},\"type\":\"ref\"},{\"text\":\"\"}],\"id\":\"O9vTDCAWfILpEF2V4z8Rz\",\"type\":\"uli\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"Flutter 직접 업로드 사례\"}],\"id\":\"b9UiYkMIL-UWRM6-HI1AL\",\"props\":{\"anchor\":\"\",\"id\":\"116662249034924032\",\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/73582\"},\"type\":\"ref\"},{\"text\":\"\"}],\"id\":\"0yExMqhxFR9w5nccLjRvr\",\"type\":\"uli\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"uni-app 직접 업로드 사례\"}],\"id\":\"skBpA9GZ1c0xv4iYmbi53\",\"props\":{\"anchor\":\"\",\"id\":\"115554057928318976\",\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/46466\"},\"type\":\"ref\"},{\"text\":\"\"}],\"id\":\"wBEP12JGsR_dkJ4qf4p1F\",\"type\":\"uli\"},{\"children\":[{\"text\":\"\"}],\"id\":\"WnDdIupRnHsSX1yySRKUp\",\"type\":\"p\"},{\"children\":[{\"text\":\"\"}],\"id\":\"hzHfVjHdRMLNzRLyhy3-M\",\"type\":\"p\"}]"}},"73580":{"categoryId":436,"weight":89,"type":"page","extension":"","pid":33419,"id":73580,"lang":"ko","title":"서버 서명 사례","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2025-09-19 18:43:53","recentReleaseTime":"2025-09-19 18:43:53","content":{"title":"서버 서명 사례","body":"
본 문서는 안전한 임시 서명 서비스를 구축하는 방법을 설명합니다.

솔루션 장점

권한 보안: 안전한 권한 범위를 효과적으로 제한할 수 있으며, 지정된 하나의 파일 경로에만 업로드할 수 있습니다.
경로 보안: 서버가 무작위 COS 파일 경로를 결정하므로 기존 파일이 덮어쓰여지는 문제와 보안 위험을 효과적으로 방지할 수 있습니다.
전송 보안: 서버에서 서명을 생성하여 임시 키 전송 과정에서 발생할 수 있는 유출 위험을 방지합니다.

업로드 절차

1. 클라이언트에서 파일을 선택하면 클라이언트가 원본 파일 이름을 서버로 전송합니다.
2. 서버는 파일 이름 확장자에 따라 시간이 포함된 임의의 COS 파일 경로를 생성하고, 해당 권한의 서명 정보와 cos key를 요청하여 클라이언트에 반환합니다.

임시 서명 서비스 구축

임시 키(임시 액세스 자격 증명)는 CAM TencentCloud API에서 제공하는 인터페이스를 통해 권한이 제한된 키를 획득합니다. COS API 요청을 수행할 때는 임시 키 획득 인터페이스에서 반환된 TmpSecretId, TmpSecretKey 및 Token 세 가지 필드를 사용하여 서명을 계산해야 합니다.
서버 서명을 요청할 때는 먼저 임시 키를 획득한 후, 해당 임시 키로 서명을 생성하여 클라이언트에 반환합니다.
다음은 각 언어별 예제 코드입니다.
Node.js
전체 코드는 예제 코드를 참고하십시오.
// 임시 키 서비스 예시
var express = require('express');
var crypto = require('crypto');
var moment = require('moment');
var STS = require('qcloud-cos-sts');
const url = require('url');
const { log } = require('console');

// 매개변수 설정
var config = {
// Tencent Cloud 키를 획득합니다. 제한된 권한을 가진 서브 사용자의 키 사용을 권장합니다. https://console.tencentcloud.com/cam/capi
secretId: process.env.COS_SECRET_ID,
secretKey: process.env.COS_SECRET_KEY,
// 키 유효 기간
durationSeconds: 1800,
// 여기에 버킷 및 리전을 입력합니다. 예: test-1250000000, ap-guangzhou
bucket: process.env.PERSIST_BUCKET,
region: process.env.PERSIST_BUCKET_REGION
};

// 임시 키 획득
var getTempCredential = async function(cosKey){
var shortBucketName = config.bucket.substr(0 , config.bucket.lastIndexOf('-'));
var appId = config.bucket.substr(1 + config.bucket.lastIndexOf('-'));
// 임시 키 획득 시작
var policy = {
"version": "2.0",
"statement": [
{
"action": [
// 업로드에 필요한 작업
"name/cos:PutObject"
],
"effect": "allow",
"resource": [
// cosKey 리소스만 해당
'qcs::cos:' + config.region + ':uid/' + appId + ':prefix//' + appId + '/' + shortBucketName + '/' + cosKey,
]
}
]
};
let tempKeys = null;
try{
tempKeys = await STS.getCredential({
secretId: config.secretId,
secretKey: config.secretKey,
durationSeconds: config.durationSeconds,
policy: policy,
});
console.log(tempKeys);
return tempKeys;
} catch(err){
console.log(err);
res.send(JSON.stringify(err));
return null;
}
};

// 서명 계산
var getSignature = function(tempCredential, httpMethod, cosHost, pathname) {
const signAlgorithm = 'sha1';
const credentials = tempCredential.credentials;
const keyTime = `${tempCredential.startTime};${tempCredential.expiredTime}`;

// 1단계: SignKey 생성
var signKey = crypto.createHmac(signAlgorithm, credentials.tmpSecretKey).update(keyTime).digest('hex');
console.log("signKey:"+signKey);

// 2단계: StringToSign 생성
const httpString = `${httpMethod.toLowerCase()}\\n/${pathname}\\n\\nhost=${cosHost}\\n`;
console.log("httpString:"+httpString);
const httpStringHash = crypto.createHash(signAlgorithm).update(httpString).digest('hex');
const stringToSign = `${signAlgorithm}\\n${keyTime}\\n${httpStringHash}\\n`;
console.log("stringToSign:"+stringToSign);

// 3단계: Signature 생성
var signature = crypto.createHmac(signAlgorithm, signKey).update(stringToSign).digest('hex');
console.log("signature:"+signature);

// 4단계: authorization 생성
let authorization = `q-sign-algorithm=${signAlgorithm}&
q-ak=${credentials.tmpSecretId}&
q-sign-time=${keyTime}&
q-key-time=${keyTime}&
q-header-list=host&q-url-param-list=&q-signature=${signature}`;

// 위의 줄바꿈으로 인해 나타난 \\n 제거
authorization = authorization.replace(/\\n/g, '');
console.log("authorization:"+authorization);
return authorization;
}

// 임시 키 서비스 및 디버깅을 위한 정적 서비스 생성
var app = express();
// 직접 업로드 서명 인터페이스
app.all('/sts-server-sign', async function (req, res, next) {
// 서명이 필요한 필드 획득
var httpMethod = req.query.httpMethod;
var cosHost = req.query.host;
var cosKey = req.query.cosKey;

console.log(httpMethod + " " + cosHost + " " + cosKey);

cosHost = decodeURIComponent(cosHost);
cosKey = decodeURIComponent(cosKey);

console.log(httpMethod + " " + cosHost + " " + cosKey);

// 예외 상황 판단
if (!config.secretId || !config.secretKey) return res.send({ code: '-1', message: 'secretId or secretKey not ready' });
if (!config.bucket || !config.region) return res.send({ code: '-1', message: 'bucket or regions not ready' });
if (!httpMethod || !cosHost || !cosKey) return res.send({ code: '-1', message: 'httpMethod or host or coskey is not empty' });

//임시 키 획득 시작
var tempCredential = await getTempCredential(cosKey);
if(!tempCredential){
res.send({ code: -1, message: 'get temp credentials fail' });
return;
}

// 임시 키로 서명 계산
let authorization = getSignature(tempCredential, httpMethod, cosHost, cosKey);

// 도메인, 파일 경로, 서명, 자격 증명 정보 반환
res.send({
code: 0,
data: {
cosHost: cosHost,
cosKey: cosKey,
authorization: authorization,
securityToken: tempCredential.credentials.sessionToken
},
});
});

app.all('*', function (req, res, next) {
res.send({ code: -1, message: '404 Not Found' });
});

// 서명 서비스 시작
app.listen(3000);
console.log('app is listening at http://127.0.0.1:3000');

Go
전체 코드는 예제 코드를 참고하십시오.
package main

import (
"context"
"encoding/json"
"errors"
"fmt"
"github.com/tencentyun/cos-go-sdk-v5"
sts "github.com/tencentyun/qcloud-cos-sts-sdk/go"
"math/rand"
"net/http"
"net/url"
"os"
"reflect"
"strings"
"time"
"unicode"
)

type Config struct {
filename string
appId string
SecretId string
SecretKey string
Proxy string
DurationSeconds int
Bucket string
Region string
AllowActions []string
}

type Permission struct {
LimitExt bool `json:"limitExt"`
ExtWhiteList []string `json:"extWhiteList"`
LimitContentType bool `json:"limitContentType"`
LimitContentLength bool `json:"limitContentLength"`
}

func generateCosKey(ext string) string {
date := time.Now()
m := int(date.Month()) + 1
ymd := fmt.Sprintf("%d%02d%d", date.Year(), m, date.Day())
r := fmt.Sprintf("%06d", rand.Intn(1000000))
cosKey := fmt.Sprintf("file/%s/%s_%s.%s", ymd, ymd, r, ext)
return cosKey
}

func getPermission() Permission {
permission := Permission{
LimitExt: true,
ExtWhiteList: []string{"jpg", "jpeg", "png", "gif", "bmp"},
LimitContentType: false,
LimitContentLength: false,
}
return permission
}

func getConfig() Config {
config := Config{
filename: "test.jpg",
appId: "12500000000",
SecretId: os.Getenv("SECRETID"), // 사용자의 SecretId, 서브 계정 키 사용을 권장하며 최소 권한 가이드에 따라 권한을 부여하여 사용 위험을 줄입니다. 서브 계정 키 획득은 https://cloud.tencent.com/document/product/598/37140 참조
SecretKey: os.Getenv("SECRETKEY"), // 사용자의 SecretKey, 서브 계정 키 사용을 권장하며 최소 권한 가이드에 따라 권한을 부여하여 사용 위험을 줄입니다. 서브 계정 키 획득은 https://cloud.tencent.com/document/product/598/37140 참조
Proxy: os.Getenv("Proxy"),
DurationSeconds: 1800,
Bucket: "0-1253960454",
Region: "ap-guangzhou",
AllowActions: []string{
"name/cos:PutObject",
},
}
return config
}

func stringInSlice(str string, list []string) bool {
for _, v := range list {
if v == str {
return true
}
}
return false
}

func StructToCamelMap(input interface{}) map[string]interface{} {
v := reflect.ValueOf(input)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}

result := make(map[string]interface{})
typ := v.Type()

for i := 0; i < v.NumField(); i++ {
field := typ.Field(i)
fieldValue := v.Field(i)

// 필드 이름을 LowerCamel로 변환
key := toLowerCamel(field.Name)

// 중첩 구조체 처리
if fieldValue.Kind() == reflect.Struct ||
(fieldValue.Kind() == reflect.Ptr && fieldValue.Elem().Kind() == reflect.Struct) {

if fieldValue.IsNil() && fieldValue.Kind() == reflect.Ptr {
result[key] = nil
continue
}

result[key] = StructToCamelMap(fieldValue.Interface())
} else {
// 기본 유형 처리
result[key] = fieldValue.Interface()
}
}

return result
}

// LowerCamel 형식으로 변환(첫 글자가 소문자로)
func toLowerCamel(s string) string {
if s == "" {
return s
}

// 전체 대문자 단어 처리(예: ID)
if strings.ToUpper(s) == s {
return strings.ToLower(s)
}

// 일반 LowerCamel 변환
runes := []rune(s)
runes[0] = unicode.ToLower(runes[0])
return string(runes)
}

func getStsCredential() (map[string]interface{}, error) {
config := getConfig()

permission := getPermission()

c := sts.NewClient(
// 환경 변수를 통해 키 획득, os.Getenv 메서드는 환경 변수 획득을 표시함
config.SecretId, //os.Getenv("SECRETID"), // 사용자의 SecretId, 서브 계정 키 사용을 권장하며 최소 권한 가이드에 따라 권한을 부여하여 사용 위험을 줄입니다. 서브 계정 키 획득은 https://cloud.tencent.com/document/product/598/37140 참조
config.SecretKey, //os.Getenv("SECRETKEY"), // 사용자의 SecretKey, 서브 계정 키 사용을 권장하며 최소 권한 가이드에 따라 권한을 부여하여 사용 위험을 줄입니다. 서브 계정 키 획득은 https://cloud.tencent.com/document/product/598/37140 참조
nil,
// sts.Host("sts.internal.tencentcloudapi.com"), // 도메인 설정, 기본 도메인 sts.tencentcloudapi.com
// sts.Scheme("http"), // 프로토콜 설정, 기본값은 https이며, 퍼블릭 클라우드 sts에서 임시 키를 가져올 때 http는 허용되지 않습니다. 특수한 시나리오에서만 http 설정이 필요합니다.
)

condition := make(map[string]map[string]interface{})

segments := strings.Split(config.filename, ".")
if len(segments) == 0 {
//ext := ""
}
ext := segments[len(segments)-1]

if permission.LimitExt {
extInvalid := ext == "" || !stringInSlice(ext, permission.ExtWhiteList)
if extInvalid {
return nil, errors.New("불법 파일, 업로드 금지")
}
}

if permission.LimitContentType {
condition["string_like_if_exist"] = map[string]interface{}{
// content-type이 이미지 유형인 경우에만 업로드 허용
"cos:content-type": "image/*",
}
}

// 3. 업로드 파일 크기 제한
if permission.LimitContentLength {
condition["numeric_less_than_equal"] = map[string]interface{}{
// 업로드 크기는 최대 5MB로 제한됨(단순 업로드에만 적용됨)
"cos:content-length": 5 * 1024 * 1024,
}
}

key := generateCosKey(ext)
// 정책 개요 https://cloud.tencent.com/document/product/436/18023
opt := &sts.CredentialOptions{
DurationSeconds: int64(config.DurationSeconds),
Region: config.Region,
Policy: &sts.CredentialPolicy{
Version: "2.0",
Statement: []sts.CredentialPolicyStatement{
{
// 키의 권한 목록. 단순 업로드 및 샤딩에는 다음 권한이 필요하며, 기타 권한 목록은 https://cloud.tencent.com/document/product/436/31923 참조
Action: config.AllowActions,
Effect: "allow",
Resource: []string{
// 여기서 허용할 경로 접두사를 변경합니다. 자신의 웹사이트 사용자 로그인 상태에 따라 업로드할 특정 경로를 판단할 수 있습니다. 예: a.jpg, a/* 또는 * (와일드카드 * 사용에는 중대한 보안 위험이 있으므로 신중하게 평가하여 사용하십시오).
// 버킷의 이름 형식은 BucketName-APPID이며, 여기에 입력한 bucket은 반드시 이 형식이어야 합니다.
"qcs::cos:ap-guangzhou:uid/" + config.appId + ":" + config.Bucket + "/" + key,
},
// 적용 조건 구축 시작 condition
// condition에 대한 상세 설정 규칙 및 COS에서 지원하는 condition 유형은 https://cloud.tencent.com/document/product/436/71306 참조
Condition: condition,
},
},
},
}

// case 1 임시 키 요청
res, err := c.GetCredential(opt)
if err != nil {
return nil, err
}
// LowerCamelMap으로 변환
resultMap := StructToCamelMap(res)
resultMap["bucket"] = config.Bucket
resultMap["region"] = config.Region
resultMap["key"] = key

return resultMap, nil
}

func main() {
result, err := getStsCredential()
if err != nil {
fmt.Printf("임시 키 요청 실패: %v\\n", err)
return // 컨텍스트에 따라 종료 여부 결정
}

// credentials를 map[string]interface{}로 타입 단언
credentials, ok := result["credentials"].(map[string]interface{})
if !ok {
fmt.Println("자격 증명 형식 오류")
return
}
// 유형 검사가 포함된 필드 획득
tak, tok := credentials["tmpSecretID"].(string)
tsk, tskok := credentials["tmpSecretKey"].(string)
token, tokenok := credentials["sessionToken"].(string)
if !tok || !tskok || !tokenok {
fmt.Println("임시 자격 증명 필드 누락 또는 유형 오류")
return
}
host := "https://" + result["bucket"].(string) + ".cos." + result["region"].(string) + ".myqcloud.com"
u, _ := url.Parse(host)
b := &cos.BaseURL{BucketURL: u}
c := cos.NewClient(b, &http.Client{})
name := result["key"].(string)
ctx := context.Background()
opt := &cos.PresignedURLOptions{
Query: &url.Values{},
Header: &http.Header{},
}
opt.Query.Add("x-cos-security-token", token)
signature := c.Object.GetSignature(ctx, http.MethodPut, name, "tak", "tsk", time.Hour, opt, true)
fmt.Printf("%s\\n%s\\n%s\\n%s\\n", tak, tsk, token, signature)
data := make(map[string]string)

// token 및 sign 추가
data["securityToken"] = token
data["authorization"] = signature
data["cosHost"] = host
data["cosKey"] = name
// JSON으로 변환
jsonData, err := json.MarshalIndent(data, "", " ")
if err != nil {
fmt.Println("JSON 인코딩 실패:", err)
return
}
fmt.Println(string(jsonData))
}


PHP
전체 코드는 예제 코드를 참고하십시오.
<?php
require_once __DIR__ . '/vendor/autoload.php';

use QCloud\\COSSTS\\Sts;

// 업로드할 COS 파일 경로 파일명 생성
function generateCosKey($ext) {
$ymd = date('Ymd');
$r = substr('000000' . rand(), -6);
$cosKey = 'file/' . $ymd. '/' . $ymd . '_' . $r;
if ($ext) {
$cosKey = $cosKey . '.' . $ext;
}
return $cosKey;
};

// 단일 파일 업로드 권한을 위한 임시 키 획득
function getKeyAndCredentials($filename) {
// 비즈니스 서버가 사용자 로그인 상태 확인 자체 구현, 예를 들어 token 확인
// $canUpload = checkUserRole($userToken);
// if (!$canUpload) {
// return '현재 사용자에게 업로드 권한이 없습니다';
// }

// 파일 업로드는 유형 및 크기를 제어할 수 있으며 필요에 따라 활성화할 수 있습니다.
$permission = array(
'limitExt' => false, // 업로드 파일 확장자 제한
'extWhiteList' => ['jpg', 'jpeg', 'png', 'gif', 'bmp'], // 제한된 업로드 확장자
'limitContentType' => false, // contentType 업로드 제한
'limitContentLength' => false, // 업로드 파일 크기 제한
);
$condition = array();

// 클라이언트에서 전송된 원본 파일 이름을 기반으로 파일 확장자에 따라 임의의 키 생성
$ext = pathinfo($filename, PATHINFO_EXTENSION);

// 1. 업로드 파일 확장자 제한
if ($permission['limitExt']) {
if ($ext === '' || array_key_exists($ext, $permission['extWhiteList'])) {
return '불법 파일, 업로드 금지';
}
}

// 2. content-type 파일 업로드 제한
if ($permission['limitContentType']) {
// content-type이 이미지 유형인 경우에만 업로드 허용
$condition['string_like_if_exist'] = array('cos:content-type' => 'image/*');
}

// 3. 업로드 파일 크기 제한
if ($permission['limitContentLength']) {
// 업로드 크기는 최대 5MB로 제한됨(단순 업로드에만 적용됨)
$condition['numeric_less_than_equal'] = array('cos:content-length' => 5 * 1024 * 1024);
}

$cosKey = generateCosKey($ext);
$bucket = 'test-125000000'; // 사용자의 bucket으로 변경
$region = 'ap-guangzhou'; // bucket이 위치한 리전으로 변경
$config = array(
'url' => 'https://sts.tencentcloudapi.com/', // url과 domain을 일치시킴
'domain' => 'sts.tencentcloudapi.com', // 도메인, 필수 아님, 기본값은 sts.tencentcloudapi.com
'proxy' => '',
'secretId' => "",//getenv('GROUP_SECRET_ID'), // 고정 키, 평문 키인 경우 'xxx' 형태로 직접 입력하고 getenv() 함수에 기입하지 마세요.
'secretKey' => "",//getenv('GROUP_SECRET_KEY'), // 고정 키, 평문 키인 경우 'xxx' 형태로 직접 입력하고 getenv() 함수에 기입하지 마세요.
'bucket' => $bucket, // 사용자의 bucket으로 변경
'region' => $region, // bucket이 위치한 리전으로 변경
'durationSeconds' => 1800, // 키 유효 기간
'allowPrefix' => array($cosKey), // 현재 key의 경로 권한만 할당
// 키의 권한 목록. 단순 업로드 및 샤딩에는 다음 권한이 필요하며, 기타 권한 목록은 https://cloud.tencent.com/document/product/436/31923 참조
'allowActions' => array (
// 단순 업로드
'name/cos:PutObject'
),
);

if (!empty($condition)) {
$config['condition'] = $condition;
}

$sts = new Sts();
$tempKeys = $sts->getTempKeys($config);
$resTemp = array_merge(
$tempKeys,
[
'startTime' => time(),
'bucket' => $bucket,
'region' => $region,
'key' => $cosKey,
]
);
return $resTemp;
}

function getSign()
{
$filename = "test.jpg";
$method = "putObject";
$result = getKeyAndCredentials($filename);
$credentials = $result["credentials"];
$sessionToken = $credentials["sessionToken"];
$tmpSecretId = $credentials["tmpSecretId"];
$tmpSecretKey = $credentials["tmpSecretKey"];
$expiredTime = $result["expiredTime"];
$startTime = $result["startTime"];
$bucket = $result["bucket"];
$region = $result["region"];
$key = $result["key"];

$cosClient = new Qcloud\\Cos\\Client(
array(
'region' => $region,
'scheme' => 'https', //프로토콜 헤더, 기본값은 http
'signHost' => true, //기본적으로 Header Host에 서명함. Header Host에 서명하지 않을 수도 있지만, 이 경우 요청 실패 또는 보안 취약점이 발생할 수 있습니다. host에 서명하지 않으려면 false 입력.
'credentials'=> array(
'secretId' => $tmpSecretId,
'secretKey' => $tmpSecretKey,
'token' => $sessionToken)));
### 단순 업로드 사전 서명
try {
$url = $cosClient->getPresignedUrl($method,array(
'Bucket' => $bucket,
'Key' => $key,
'Body' => "",
'Params'=> array('x-cos-security-token' => $sessionToken),
'Headers'=> array(),
), $expiredTime - $startTime); //서명의 유효 기간

$parsedUrl = parse_url($url);
$host = 'https://' . $parsedUrl['host']; // 포트 자동 포함(있는 경우)
$queryString = isset($parsedUrl['query']) ? $parsedUrl['query'] : '';
$queryParts = explode('&', $queryString);
$signParts = array_filter($queryParts, function($part) {
return strpos($part, 'x-cos-security-token=') !== 0;
});
$sign = implode('&', $signParts);
$result = [
'cosHost' => $host,
'cosKey' => $key,
'authorization' => $sign,
'securityToken' => $sessionToken
];

echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);

} catch (\\Exception $e) {
// 요청 실패
echo($e);
}
}
getSign();
Python
전체 코드는 예제 코드를 참고하십시오.
#!/usr/bin/env python
# coding=utf-8
import json
import os
import datetime
import random
from urllib.parse import urlencode

from qcloud_cos import CosConfig, CosS3Client

from sts.sts import Sts


if __name__ == '__main__':

# 매개변수 설정
config = {
"filename":"test.jpg",
"appId": "1250000000",
"secretId": os.getenv("SecretId"),
"secretKey": os.getenv("SecretKey"),
"proxy": os.getenv("Proxy"),
"durationSeconds": 1800,
"bucket": "0-1253960454",
"region": "ap-guangzhou",
# 키 업로드 작업 권한 목록
"allowActions": [
# 단순 업로드
"name/cos:PutObject"
],
}

permission = {
"limitExt": True, # 업로드 파일 확장자 제한
"extWhiteList": ["jpg", "jpeg", "png", "gif", "bmp"], # 제한된 업로드 확장자
"limitContentType": False, # contentType 업로드 제한
"limitContentLength": False, # 업로드 파일 크기 제한
}


# 업로드할 COS 파일 경로 파일명 생성
def generate_cos_key(ext=None):
date = datetime.datetime.now()
ymd = date.strftime('%Y%m%d')
r = str(int(random.random() * 1000000)).zfill(6)
cos_key = f"file/{ymd}/{ymd}_{r}.{ext if ext else ''}"
return cos_key


segments = config['filename'].split(".")
ext = segments[-1] if segments else ""
key = generate_cos_key(ext)
resource = f"qcs::cos:{config['region']}:uid/{config['appId']}:{config['bucket']}/{key}"

condition = {}

# 1. 업로드 파일 확장자 제한
if permission["limitExt"]:
ext_invalid = not ext or ext not in permission["extWhiteList"]
if ext_invalid:
print('불법 파일, 업로드 금지')

# 2. content-type 파일 업로드 제한
if permission["limitContentType"]:
condition.update({
"string_like_if_exist": {
# content-type이 이미지 유형인 경우에만 업로드 허용
"cos:content-type": "image/*"
}
})

# 3. 업로드 파일 크기 제한
if permission["limitContentLength"]:
condition.update({
"numeric_less_than_equal": {
# 업로드 크기는 최대 5MB로 제한됨(단순 업로드에만 적용됨)
"cos:content-length": 5 * 1024 * 1024
}
})


def get_credential_demo():
credentialOption = {
# 임시 키 유효 기간(단위: 초)
'duration_seconds': config.get('durationSeconds'),
'secret_id': config.get("secretId"),
# 고정 키
'secret_key': config.get("secretKey"),
# 사용자의 bucket으로 변경
'bucket': config.get("bucket"),
'proxy': config.get("proxy"),
# bucket이 위치한 리전으로 변경
'region': config.get("region"),
"policy": {
"version": '2.0',
"statement": [
{
"action": config.get("allowActions"),
"effect": "allow",
"resource": [
resource
],
"condition": condition
}
],
},
}

try:

sts = Sts(credentialOption)
response = sts.get_credential()
credential_dic = dict(response)
credential_info = credential_dic.get("credentials")
credential = {
"bucket": config.get("bucket"),
"region": config.get("region"),
"key": key,
"startTime": credential_dic.get("startTime"),
"expiredTime": credential_dic.get("expiredTime"),
"requestId": credential_dic.get("requestId"),
"expiration": credential_dic.get("expiration"),
"credentials": {
"tmpSecretId": credential_info.get("tmpSecretId"),
"tmpSecretKey": credential_info.get("tmpSecretKey"),
"sessionToken": credential_info.get("sessionToken"),
},
}
return credential
except Exception as e:
print(e)


result = get_credential_demo()
credentials = result["credentials"]
secret_id = credentials["tmpSecretId"]
secret_key = credentials["tmpSecretKey"]
token = credentials["sessionToken"]
bucket = result["bucket"]
region = result["region"]
key = result["key"]
expired = result["expiredTime"]

config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token)
client = CosS3Client(config)
sign = client.get_auth(Method='put',Bucket=bucket, Key=key, Expired=expired, Params={
'x-cos-security-token': token
},SignHost=True)
sign = urlencode(dict([item.split('=', 1) for item in sign.split('&')]))
host = "https://" + result["bucket"] + ".cos." + result["region"] + ".myqcloud.com"
response = {
"cosHost":host,
"cosKey":key,
"authorization":sign,
"securityToken":token
}
print('get data : ' + json.dumps(response, indent=4))
Java
전체 코드는 예제 코드를 참고하십시오.
package com.tencent.cloud;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicSessionCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpMethodName;
import com.qcloud.cos.region.Region;
import com.tencent.cloud.cos.util.Jackson;
import org.junit.Test;

import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.*;

public class ServerSignTest {

public static String generateCosKey(String ext) {
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String ymd = dateFormat.format(date);

Random random = new Random();
int r = random.nextInt(1000000);
String rStr = String.format("%06d", r);

String cosKey = String.format("file/%s/%s_%s.%s", ymd, ymd, rStr, ext != null ? ext : "");
return cosKey;
}

// 구성 정보 획득
public TreeMap<String,Object> getConfig(){

String bucket = "0-1250000000";
String appId = "1250000000";
String filename = "test.jpg";
String region = "ap-guangzhou";
String secretId = "";
String secretKey = "";
String proxy = "";
int durationSeconds = 1800;

String[] segments = filename.split("\\\\.");
String ext = segments.length > 0 ? segments[segments.length - 1] : "";

// 임시 키 제한
Boolean limitExt = false; // 업로드 파일 확장자 제한
List extWhiteList = Arrays.asList("jpg", "jpeg", "png", "gif", "bmp"); // 제한된 업로드 확장자
Boolean limitContentType = false; // contentType 업로드 제한
Boolean limitContentLength = false; // 업로드 파일 크기 제한


Map<String, Object> condition = new HashMap();

// 1. 업로드 파일 확장자 제한
if (limitExt) {
boolean extInvalid = ext == null || !extWhiteList.contains(ext);
if (extInvalid) {
System.out.println("불법 파일, 업로드 금지");
return null;
}
}

// 2. content-type 파일 업로드 제한
if (limitContentType) {
condition.put("string_like_if_exist", new HashMap<String, String>() {{
put("cos:content-type", "image/*");
}});
}

// 3. 업로드 파일 크기 제한(단순 업로드에만 적용됨)
if (limitContentLength) {
condition.put("numeric_less_than_equal", new HashMap<String, Long>() {{
put("cos:content-length", 5L * 1024 * 1024);
}});
}
String key = generateCosKey(ext);
String resource = "qcs::cos:" + region + ":uid/" + appId + ':' + bucket + '/' + key;
List allowActions = Arrays.asList(
// 단순 업로드
"name/cos:PutObject"
);

// policy 구성
Map<String, Object> policy = new HashMap();
policy.put("version", "2.0");
Map<String, Object> statement = new HashMap();
statement.put("action", allowActions);
statement.put("effect", "allow");
List<String> resources = Arrays.asList(
resource
);
statement.put("resource", resources);
statement.put("condition", condition);
policy.put("statement", Arrays.asList(statement));


// config 구성
TreeMap <String,Object> config = new TreeMap<String, Object>();
config.put("secretId",secretId);
config.put("secretKey",secretKey);
config.put("proxy",proxy);
config.put("duration",durationSeconds);
config.put("bucket",bucket);
config.put("region",region);
config.put("key",key);
config.put("policy",Jackson.toJsonPrettyString(policy));
return config;
}

public TreeMap <String,Object> getKeyAndCredentials() {
TreeMap config = this.getConfig();
try {
Response response = CosStsClient.getCredential(config);
TreeMap <String,Object> credential = new TreeMap<String, Object>();
TreeMap <String,Object> credentials = new TreeMap<String, Object>();
credentials.put("tmpSecretId",response.credentials.tmpSecretId);
credentials.put("tmpSecretKey",response.credentials.tmpSecretKey);
credentials.put("sessionToken",response.credentials.sessionToken);
credential.put("startTime",response.startTime);
credential.put("expiredTime",response.expiredTime);
credential.put("requestId",response.requestId);
credential.put("expiration",response.expiration);
credential.put("credentials",credentials);
credential.put("bucket",config.get("bucket"));
credential.put("region",config.get("region"));
credential.put("key",config.get("key"));
return credential;
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("no valid secret !");
}
}
/**
* 기본 임시 키 신청 예시, 한 버킷 내의 일련의 객체 경로에 대해 일괄적으로 일련의 작업 권한을 부여하는 데 적합함
*/
@Test
public void testGetKeyAndCredentials() {
TreeMap <String,Object> credential = this.getKeyAndCredentials();
TreeMap <String,Object> credentials = (TreeMap<String, Object>) credential.get("credentials");
try {


String tmpSecretId = (String) credentials.get("tmpSecretId");
String tmpSecretKey = (String) credentials.get("tmpSecretKey");
String sessionToken = (String) credentials.get("sessionToken");
Date expiredTime = new Date((Long) credential.get("expiredTime"));
String key = (String) credential.get("key");
String bucket = (String) credential.get("bucket");
String region = (String) credential.get("region");

COSCredentials cred = new BasicSessionCredentials(tmpSecretId, tmpSecretKey, sessionToken);
ClientConfig clientConfig = new ClientConfig();
clientConfig.setRegion(new Region(region));

COSClient cosClient = new COSClient(cred, clientConfig);


Map<String, String> headers = new HashMap<String,String>();
Map<String, String> params = new HashMap<String,String>();
params.put("x-cos-security-token",sessionToken);
URL url = cosClient.generatePresignedUrl(bucket, key, expiredTime, HttpMethodName.PUT, headers, params);
String host = "https://" + url.getHost();
String query = url.toString().split("\\\\?")[1];
String sign = query.split("&x-cos-security-token")[0];
TreeMap <String,Object> result = new TreeMap<String, Object>();
result.put("cosHost",host);
result.put("cosKey",key);
result.put("authorization",sign);
result.put("securityToken",sessionToken);
System.out.println(Jackson.toJsonPrettyString(result));
} catch (Exception e) {
\t e.printStackTrace();
throw new IllegalArgumentException("no valid sign !");
}
}
}
.NET(C#)
전체 코드는 예제 코드를 참고하십시오.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Net.Mail;
using COSSTS;
using COSXML;
using COSXML.Auth;
using COSXML.Model.Tag;
using Newtonsoft.Json;
using Formatting = System.Xml.Formatting;


namespace COSSnippet
{
public class ServerSign
{
//영구 키
string secretId = "";
string secretKey = "";

string bucket = "bucket-1250000000";
string appId = "1250000000";
string region = "ap-guangzhou";
string filename = "test.jpg";
string method = "put";
int time = 1800;
// 제한
Boolean limitExt = false; // 업로드 파일 확장자 제한
List<string> extWhiteList = new List<String> { "jpg", "jpeg", "png", "gif", "bmp" }; // 제한된 업로드 확장자
Boolean limitContentType = false; // contentType 업로드 제한
Boolean limitContentLength = false; // 업로드 파일 크기 제한

public string generateCosKey(string ext)
{
DateTime date = DateTime.Now;
int m = date.Month;
string ymd = $"{date.Year}{(m < 10 ? $"0{m}" : m.ToString())}{date.Day}";
Random random = new Random();
string r = random.Next(0, 1000000).ToString("D6"); // 6자리 난수 생성, 앞에 0으로 채움
string cosKey = $"file/{ymd}/{ymd}_{r}.{(string.IsNullOrEmpty(ext) ? "" : ext)}";
return cosKey;
}
public Dictionary<string, object> getConfig()
{
Dictionary<string, object> config = new Dictionary<string, object>();
string[] allowActions = new string[] { // 허용되는 작업 범위, 여기서는 업로드 작업을 예로 들었습니다.
"name/cos:PutObject"
};
string[] segments = filename.Split(".");
string ext = segments.Length > 0 ? segments[segments.Length - 1] : string.Empty;
string key = generateCosKey(ext);
string resource = $"qcs::cos:{region}:uid/{appId}:{bucket}/{key}";

var condition = new Dictionary<string, object>();
// 1. 업로드 파일 확장자 제한
if (limitExt)
{
var extInvalid = string.IsNullOrEmpty(ext) || !extWhiteList.Contains(ext);
if (extInvalid)
{
Console.WriteLine("불법 파일, 업로드 금지");
return null;
}
}

// 2. content-type 파일 업로드 제한
if (limitContentType)
{
condition["string_like_if_exist"] = new Dictionary<string, string>
{
{ "cos:content-type", "image/*" } // content-type이 이미지 유형인 경우에만 업로드 허용
};
}

// 3. 업로드 파일 크기 제한(간단한 업로드에만 적용됨)
if (limitContentLength)
{
condition["numeric_less_than_equal"] = new Dictionary<string, long>
{
{ "cos:content-length", 5 * 1024 * 1024 } // 업로드 크기는 최대 5MB로 제한됨
};
}

var policy = new Dictionary<string, object>
{
{ "version", "2.0" },
{ "statement", new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
{ "action", allowActions },
{ "effect", "allow" },
{ "resource", new List<string>
{
resource,
}
},
{ "condition", condition }
}
}
}
};

// JSON으로 직렬화하여 출력
string jsonPolicy = JsonConvert.SerializeObject(policy);
config.Add("bucket", bucket);
config.Add("region", region);
config.Add("durationSeconds", time);

config.Add("secretId", secretId);
config.Add("secretKey", secretKey);
config.Add("key", key);
config.Add("policy", jsonPolicy);
return config;
}
// 연합 신원 임시 접근 자격 증명 획득 https://cloud.tencent.com/document/product/1312/48195
public Dictionary<string, object> GetCredential()
{

var config = getConfig();
//임시 키 획득
Dictionary<string, object> credential = STSClient.genCredential(config);
Dictionary<string, object> credentials = JsonConvert.DeserializeObject<Dictionary<string, object>>(JsonConvert.SerializeObject((object) credential["Credentials"]));
Dictionary<string, object> credentials1 = new Dictionary<string, object>();
credentials1.Add("tmpSecretId",credentials["TmpSecretId"]);
credentials1.Add("tmpSecretKey",credentials["TmpSecretKey"]);
credentials1.Add("sessionToken",credentials["Token"]);
Dictionary<string, object> dictionary1 = new Dictionary<string, object>();
dictionary1.Add("credentials",credentials1);
dictionary1.Add("startTime",credential["StartTime"]);
dictionary1.Add("requestId",credential["RequestId"]);
dictionary1.Add("expiration",credential["Expiration"]);
dictionary1.Add("expiredTime",credential["ExpiredTime"]);
dictionary1.Add("bucket",config["bucket"]);
dictionary1.Add("region",config["region"]);
dictionary1.Add("key",config["key"]);
return dictionary1;
}
static void Main(string[] args)
{
ServerSign m = new ServerSign();
Dictionary<string, object> result = m.GetCredential();
Dictionary<string, object> credentials = (Dictionary<string, object>)result["credentials"];
string tmpSecretId = (string)credentials["tmpSecretId"];
string tmpSecretKey = (string)credentials["tmpSecretKey"];
string sessionToken = (string)credentials["sessionToken"];
string bucket = (string)result["bucket"];
string region = (string)result["region"];
string key = (string)result["key"];
long expiredTime = (long)result["expiredTime"];
int startTime = (int)result["startTime"];
QCloudCredentialProvider cosCredentialProvider = new DefaultSessionQCloudCredentialProvider(
tmpSecretId, tmpSecretKey, expiredTime, sessionToken);
CosXmlConfig config = new CosXmlConfig.Builder()
.IsHttps(true) //기본 HTTPS 요청 설정
.SetRegion(region) //기본 버킷 리전 설정
.SetDebugLog(true) //로그 표시
.Build(); // CosXmlConfig 객체 생성
CosXml cosXml = new CosXmlServer(config, cosCredentialProvider);
PreSignatureStruct preSignatureStruct = new PreSignatureStruct();
preSignatureStruct.appid = m.appId;//"1250000000";
preSignatureStruct.region = region;//"COS_REGION";
preSignatureStruct.bucket = bucket;//"examplebucket-1250000000";
preSignatureStruct.key = "exampleObject"; // 객체 키
preSignatureStruct.httpMethod = "PUT"; // HTTP 요청 방법
preSignatureStruct.isHttps = true; // HTTPS 요청 URL 생성
preSignatureStruct.signDurationSecond = 600; // 요청 서명 시간은 600초
preSignatureStruct.headers = null; // 서명에서 검증해야 할 header
preSignatureStruct.queryParameters = null; // 서명에서 검증해야 할 URL의 요청 매개변수
//사전 서명 URL 업로드(영구 키 방식으로 계산된 서명 URL)
Dictionary<string, string> queryParameters = new Dictionary<string, string>();
queryParameters.Add("x-cos-security-token",sessionToken);
Dictionary<string, string> headers = new Dictionary<string, string>();
string authorization = cosXml.GenerateSign(m.method,key,queryParameters,headers,expiredTime - startTime,expiredTime - startTime);

string host = "https://" + bucket + ".cos." + region + ".myqcloud.com";
Dictionary<string, object> response = new Dictionary<string, object>();
response.Add("cosHost",host);
response.Add("cosKey",key);
response.Add("authorization",authorization);
response.Add("securityToken",sessionToken);
Console.WriteLine($"{JsonConvert.SerializeObject(response)}");
}
}
}



","recentReleaseTime":"2025-09-19 10:43:53","slate":"[{\"children\":[{\"text\":\"본 문서는 안전한 임시 서명 서비스를 구축하는 방법을 설명합니다.\"}],\"id\":\"3oiBMBvFb_blW1GYAcL9j\",\"type\":\"p\"},{\"children\":[{\"text\":\"솔루션 장점\"}],\"id\":\"bP_J1YFotbXPlPUAwBKTC\",\"nodeId\":\".E6.96.B9.E6.A1.88.E4.BC.98.E5.8A.BF\",\"type\":\"h2\"},{\"children\":[{\"text\":\"권한 보안: 안전한 권한 범위를 효과적으로 제한할 수 있으며, 지정된 하나의 파일 경로에만 업로드할 수 있습니다.\"}],\"id\":\"MaZgSI7eLQRjlcYYsmwc7\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"경로 보안: 서버가 무작위 COS 파일 경로를 결정하므로 기존 파일이 덮어쓰여지는 문제와 보안 위험을 효과적으로 방지할 수 있습니다.\"}],\"id\":\"nINJfbzWgHMVPckMbCoxi\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"전송 보안: 서버에서 서명을 생성하여 임시 키 전송 과정에서 발생할 수 있는 유출 위험을 방지합니다.\"}],\"id\":\"CGHUXMqQ77SldWZ-PVBGa\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"업로드 절차\"}],\"id\":\"8WUVMQ52QM_vI1KDMC2l3\",\"nodeId\":\"a66db716-520f-481e-8467-160d881164bb\",\"type\":\"h2\"},{\"children\":[{\"text\":\"클라이언트에서 파일을 선택하면 클라이언트가 원본 파일 이름을 서버로 전송합니다.\"}],\"id\":\"j3ZL3bbViyRBhUtHbXa96\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"서버는 파일 이름 확장자에 따라 시간이 포함된 임의의 COS 파일 경로를 생성하고, 해당 권한의 서명 정보와 cos key를 요청하여 클라이언트에 반환합니다.\"}],\"id\":\"yZUufuJ-xLrvuwB_HYuG4\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"임시 서명 서비스 구축\"}],\"id\":\"9ho4ZF3t44dwBws57Rxqw\",\"nodeId\":\"a1e3eb7b-f6cb-4686-a8bd-1a78dda9753d\",\"type\":\"h2\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"임시 키(임시 액세스 자격 증명)\"}],\"id\":\"aE0iiyjQnz8prPKkp4Gfk\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/45242\"},\"type\":\"ref\"},{\"text\":\"는 CAM TencentCloud API에서 제공하는 인터페이스를 통해 권한이 제한된 키를 획득합니다. COS API 요청을 수행할 때는 임시 키 획득 인터페이스에서 반환된 TmpSecretId, TmpSecretKey 및 Token 세 가지 필드를 사용하여 서명을 계산해야 합니다.\"}],\"id\":\"ZKxAYBZpqIkdE4RgTSsyc\",\"type\":\"p\"},{\"children\":[{\"text\":\"서버 서명을 요청할 때는 먼저 임시 키를 획득한 후, 해당 임시 키로 서명을 생성하여 클라이언트에 반환합니다.\"}],\"id\":\"3-67ErnrE2oCn0nPyVjDU\",\"type\":\"p\"},{\"children\":[{\"text\":\"다음은 각 언어별 예제 코드입니다.\"}],\"id\":\"ZaDixJ3TX4SV8sKVml-rs\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"children\":[{\"text\":\"전체 코드는 \"},{\"children\":[{\"text\":\"예제 코드\"}],\"id\":\"dupE1LoGPUCG8AC7UQ7Zc\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/tree/main/server/server-sign/nodejs\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"ch88Xp8HIhkXvM8F3VsOL\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"// 임시 키 서비스 예시\"}],\"id\":\"fpW2H4jxWE7dbOfEoQFFG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"var express = require('express');\"}],\"id\":\"2nIOLwyRZ8-7BEBUm4Yzk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"var crypto = require('crypto');\"}],\"id\":\"KKpjygj_3N3bARYa6E2it\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"var moment = require('moment');\"}],\"id\":\"Y1epLoQiLfSKq6P3Ctovs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"var STS = require('qcloud-cos-sts');\"}],\"id\":\"v41Bt2QIT123hr_bUz6Kh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"const url = require('url');\"}],\"id\":\"catfsDVuV2PaGiiODM-bo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"const { log } = require('console');\"}],\"id\":\"Dc5b8iyIzDly7DYmj5P_r\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"43d-Tdt4Sk9SGfbdPiPfq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"// 매개변수 설정\"}],\"id\":\"2gmVg0wWnpGFsj2RZji5V\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"var config = {\"}],\"id\":\"l2_VUKb3Ovs2Yxj5IZyqB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // Tencent Cloud 키를 획득합니다. 제한된 권한을 가진 서브 사용자의 키 사용을 권장합니다. https://console.cloud.tencent.com/cam/capi\"}],\"id\":\"anHdeP7ze59Z6c5xSF5kp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" secretId: process.env.COS_SECRET_ID,\"}],\"id\":\"89sDTLx_UnlKHBHtibSO7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" secretKey: process.env.COS_SECRET_KEY,\"}],\"id\":\"oetByuunL2gfLDWOmU3km\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 키 유효 기간\"}],\"id\":\"a1VbQnREumWjcYsRvbUzi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" durationSeconds: 1800,\"}],\"id\":\"ao_YC-kOiBd8CtqRJNU8F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 여기에 버킷 및 리전을 입력합니다. 예: test-1250000000, ap-guangzhou\"}],\"id\":\"YpFbhwJ9g4Q8lir2MZrSh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" bucket: process.env.PERSIST_BUCKET,\"}],\"id\":\"_gw8yLB9ZgPcpxmHMrCMt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" region: process.env.PERSIST_BUCKET_REGION\"}],\"id\":\"536yfr_u_SQs7gps09z3p\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"};\"}],\"id\":\"uq8QqsE1LrF9dpNpP8RSQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"_Env6YYNSOuKDm3Sp-fgG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"// 임시 키 획득\"}],\"id\":\"BAUACKR1qaEl5chmygsss\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"var getTempCredential = async function(cosKey){\"}],\"id\":\"gymuCAY5MddpAn58sExZF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var shortBucketName = config.bucket.substr(0 , config.bucket.lastIndexOf('-'));\"}],\"id\":\"dgrrjbMgme9yh-4Ri4wfW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var appId = config.bucket.substr(1 + config.bucket.lastIndexOf('-'));\"}],\"id\":\"RbxjShebI8jDfGmUuwYVG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 임시 키 획득 시작\"}],\"id\":\"otKESEc4BLICsvAdwdNWK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var policy = {\"}],\"id\":\"-ie6UolgedoR5GyykzAZ1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\": \\\"2.0\\\",\"}],\"id\":\"lI2MPejOdnGGeWnAwrTo0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"id\":\"9bXc8W0U4mR67zFynm5dz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"yo5UGfg2MuNx1eQDDIEhB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\": [\"}],\"id\":\"NKOxNumqN1MkSou4zl1t8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드에 필요한 작업\"}],\"id\":\"Q54utfVUZqvi0OgVuXFjR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\"\"}],\"id\":\"ZrMjBQVIPM6ZLcGsSldhn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"QQXAJYOq7SMkGoyEhSlWx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"JHkhi4cm_ucsy13w9z33S\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"id\":\"-BywWHXrXdy_BsHQwJ0Dp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // cosKey 리소스만 해당\"}],\"id\":\"N5S2rseHODAZAPHoGm-Qj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'qcs::cos:' + config.region + ':uid/' + appId + ':prefix//' + appId + '/' + shortBucketName + '/' + cosKey,\"}],\"id\":\"c9s49YmXZIKpKL-DVcFxl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"le1uFX4k3mlA-neFW4NmC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"nSboxKxPCv0v8g9QDgR_K\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"X2kV9L22Fxal3mndli1Px\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"8cK4GlfInTkUi0qIhZeXe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let tempKeys = null;\"}],\"id\":\"GeUsuvLlXxSwe_OFYFb1t\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" try{\"}],\"id\":\"-eE2-fh_cKMQR63glDJTx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" tempKeys = await STS.getCredential({\"}],\"id\":\"ylDMQXC6f1Zi5nAVIEHLq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" secretId: config.secretId,\"}],\"id\":\"WAvU4Sp8b_gps-jRSeBcz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" secretKey: config.secretKey,\"}],\"id\":\"HwznnvsfTgvP21ZGRe3xA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" durationSeconds: config.durationSeconds,\"}],\"id\":\"JUk6NXum1xYsQ_aYW4Q8F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" policy: policy,\"}],\"id\":\"W8QZKu9AmQvjK8w9sY8U6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"CbuPKFBAld4vZK5-iKnKP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(tempKeys);\"}],\"id\":\"YywEpe3oLuGWQ8xwmKmqk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return tempKeys;\"}],\"id\":\"4E-pko7rFNpUuDbceSFRS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } catch(err){\"}],\"id\":\"UbmeGNDgt8fwOlJFGoitM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(err);\"}],\"id\":\"mbTUQkNEEzwbGZ_ZrrAgI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" res.send(JSON.stringify(err));\"}],\"id\":\"Sf5TpMXZLHaHwuVmdwjnr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return null;\"}],\"id\":\"xx647q8Rv5XiKAPJMoaYH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"-QsU7TNOSZdbeza8-zdnp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"};\"}],\"id\":\"AnepCluEOXEb0jYW8fTuF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"Nf2k07p8ZIskLhsc9plqT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"// 서명 계산\"}],\"id\":\"wfokxb9dTSka156ijl7H9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"var getSignature = function(tempCredential, httpMethod, cosHost, pathname) {\"}],\"id\":\"kuWseValenh219QDwQWXq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const signAlgorithm = 'sha1';\"}],\"id\":\"L8MpwVM9B6X5HnQrj0JZk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const credentials = tempCredential.credentials;\"}],\"id\":\"1Xuj20XbVAgGI8LhuncYH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const keyTime = `${tempCredential.startTime};${tempCredential.expiredTime}`;\"}],\"id\":\"9WCI-lpsx7mIlue5Zs_6q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"AVYIDmloG_mO4uFZusBkw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 1단계: SignKey 생성\"}],\"id\":\"UEx-Fn3wuVAddrvBIAS0n\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var signKey = crypto.createHmac(signAlgorithm, credentials.tmpSecretKey).update(keyTime).digest('hex');\"}],\"id\":\"aG5fINxmyef_s_Ikoy_1n\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(\\\"signKey:\\\"+signKey);\"}],\"id\":\"MB5UVl60KEr2xUgRcZXoo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"r-YjUGZyyPFZSr43uPDvQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 2단계: StringToSign 생성\"}],\"id\":\"GTwDPU5FULUiBVVZG2h8J\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const httpString = `${httpMethod.toLowerCase()}\\\\n/${pathname}\\\\n\\\\nhost=${cosHost}\\\\n`;\"}],\"id\":\"he-LShT6mefk4i3sH5jVC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(\\\"httpString:\\\"+httpString);\"}],\"id\":\"tzSxefMW7iWSbG0rmerOK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const httpStringHash = crypto.createHash(signAlgorithm).update(httpString).digest('hex');\"}],\"id\":\"Ils_pT-9R4FARyjuHcCFB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" const stringToSign = `${signAlgorithm}\\\\n${keyTime}\\\\n${httpStringHash}\\\\n`;\"}],\"id\":\"og9lwR8MV0XcRBZ81LFOm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(\\\"stringToSign:\\\"+stringToSign);\"}],\"id\":\"rYu6P8AUED-T9OpmcERtm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"-KnFC1RJptcZQA3XhSRQm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 3단계: Signature 생성\"}],\"id\":\"ZOi9g_D2OqJ4hBJ45JPv7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var signature = crypto.createHmac(signAlgorithm, signKey).update(stringToSign).digest('hex');\"}],\"id\":\"GiBAD72JL7bYKeEpJLbBi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(\\\"signature:\\\"+signature);\"}],\"id\":\"6bE7O65RTMl080l2pkVRA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"JUxzUzXalIKxgGud-X3WV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 4단계: authorization 생성\"}],\"id\":\"XEs8GhamZkozi_zE8yV6c\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let authorization = `q-sign-algorithm=${signAlgorithm}&\"}],\"id\":\"Jn6KeTym-qpHbYmopGxOn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"q-ak=${credentials.tmpSecretId}&\"}],\"id\":\"tvVUSvM4vq756wxOW7Iw2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"q-sign-time=${keyTime}&\"}],\"id\":\"HZXT9dM2HgBCyk9SZpaLJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"q-key-time=${keyTime}&\"}],\"id\":\"dYs8LSYzNmBVHmgGdNAES\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"q-header-list=host&q-url-param-list=&q-signature=${signature}`;\"}],\"id\":\"JJTMPmt97DwDyFecuvtTe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"oZVH4SrH7hD84wPeobXE6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 위의 줄바꿈으로 인해 나타난 \\\\n 제거\"}],\"id\":\"-RBXxoR8w9d9oF3cWItM6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" authorization = authorization.replace(/\\\\n/g, '');\"}],\"id\":\"Tt5eQNuc5WO3YKx2ES9ZP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(\\\"authorization:\\\"+authorization);\"}],\"id\":\"XzYvTjpAJ8j3bs5PJxOyv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"UK6aTp9vo9pNus5cYRT6J\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return authorization;\"}],\"id\":\"IdxitkyqJ86l_m3kU6C-1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"KhXOEPiH2PSfM7gv3dPPz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"FwQmF4-BHQxm85qaquTud\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"// 임시 키 서비스 및 디버깅을 위한 정적 서비스 생성\"}],\"id\":\"kvdxdFAEf5fcu78FWDQNh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"var app = express();\"}],\"id\":\"mlIl8enfmVjlEHTnRHirz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"// 직접 업로드 서명 인터페이스\"}],\"id\":\"1c6WX8LfHStQhX9Pu8Be_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"app.all('/sts-server-sign', async function (req, res, next) {\"}],\"id\":\"XTWLmCwISN3uiZlA_6TfZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 서명이 필요한 필드 획득\"}],\"id\":\"UxAebtlbo4pEesCWEbZRu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var httpMethod = req.query.httpMethod;\"}],\"id\":\"Ah9DATIJiweZFOGAO_SzW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var cosHost = req.query.host;\"}],\"id\":\"fKqYWP69ffsQuC4LXTPKw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var cosKey = req.query.cosKey;\"}],\"id\":\"TRYtTjaauNxG6gV3dkP84\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"hTTrIMSMjBwVuEOrEADah\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(httpMethod + \\\" \\\" + cosHost + \\\" \\\" + cosKey);\"}],\"id\":\"575wjEvsnsVYqlbhxZv3y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"l6ZS5CREMtLc08Fqrg9w6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" cosHost = decodeURIComponent(cosHost);\"}],\"id\":\"-hAE-W-A1rejjGcRVOaXG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" cosKey = decodeURIComponent(cosKey);\"}],\"id\":\"3jTO-diw9Vjc5Szjl1zvG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"DJixvEx5Jjuxxv6Sozwzf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.log(httpMethod + \\\" \\\" + cosHost + \\\" \\\" + cosKey);\"}],\"id\":\"gO_DG-hjDeJOS3MgCo_Eo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"mYI2qyDzIs9xMjKHeV5YC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 예외 상황 판단\"}],\"id\":\"xp1-zhEqri-4bU8c5HoE8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (!config.secretId || !config.secretKey) return res.send({ code: '-1', message: 'secretId or secretKey not ready' });\"}],\"id\":\"VenNgi_tM2GELPDeZ1twZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (!config.bucket || !config.region) return res.send({ code: '-1', message: 'bucket or regions not ready' });\"}],\"id\":\"0jO5vMr-ZiiSQu1vdC9Cm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (!httpMethod || !cosHost || !cosKey) return res.send({ code: '-1', message: 'httpMethod or host or coskey is not empty' });\"}],\"id\":\"GH4acJ8z6j8Z00wLFMeYy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"9fe_hPqVAJ-8qqW1DrjA7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //임시 키 획득 시작\"}],\"id\":\"pophju87Uz4yYsVyVJFsW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var tempCredential = await getTempCredential(cosKey);\"}],\"id\":\"bCrXuMnaqG7SowHiNiZM0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if(!tempCredential){\"}],\"id\":\"p1dE7C5uMv9q147cQo0aw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" res.send({ code: -1, message: 'get temp credentials fail' });\"}],\"id\":\"44y3MzMdi8J4Qki86ePcz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return;\"}],\"id\":\"sWrCxJ4YVEYJgflVqexBM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"nIbZFfK63GSZhlQImojiU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"rnEUo3I7PDP9YNuLNZh_9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 임시 키로 서명 계산\"}],\"id\":\"8oc05vXebOHfN4d_YzyJY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let authorization = getSignature(tempCredential, httpMethod, cosHost, cosKey);\"}],\"id\":\"yUGhwNGyKZ_AT1wn4BgzC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"mxOjMQcw0i8PHbx68GNLu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 도메인, 파일 경로, 서명, 자격 증명 정보 반환\"}],\"id\":\"h6N9XdgGcLBGMKCU3D44O\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" res.send({\"}],\"id\":\"IlI3T3md6I5t7yzAEWtTR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" code: 0,\"}],\"id\":\"dA-JlWQwhzRNQ8hlZaBbH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" data: {\"}],\"id\":\"mwfkeaTJx7jssmIVyaZT4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" cosHost: cosHost,\"}],\"id\":\"_ox0wN6wjyA8mCbYY8kIQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" cosKey: cosKey,\"}],\"id\":\"e10eDg5EBeQSFFfyvwDXa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" authorization: authorization,\"}],\"id\":\"LmAXrkWTRwpAloNpZKquJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" securityToken: tempCredential.credentials.sessionToken\"}],\"id\":\"u10pU_X2Ta-Gggm4fkErh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"PzpMaSag5P8U3j4YOR5SX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"JhmUUFCfWYEoqeTlu_fD6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"id\":\"dBFuRTFPuWBiD1YEXzhO1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"zm4EarTtg_LPNTjVb2IiY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"app.all('*', function (req, res, next) {\"}],\"id\":\"2nVx-jcRz8fvVN-K6oZ8K\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" res.send({ code: -1, message: '404 Not Found' });\"}],\"id\":\"2RX8Vzb2VIi46MOro_E64\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"});\"}],\"id\":\"e8Bl84XleL48Emaess8ay\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"i2d9E_plEUF2ei8VTp_as\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"// 서명 서비스 시작\"}],\"id\":\"1rJ1xD01XHuOTL1YFZNNf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"app.listen(3000);\"}],\"id\":\"H3Hmf6tkozvhAcKLKLnja\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"console.log('app is listening at http://127.0.0.1:3000');\"}],\"id\":\"5vJEa98SsrjPiWg5_eF7F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"g-_Wm_jKRfeqm6hIgx3lI\",\"type\":\"code-line\"}],\"id\":\"eHbouVEMQI290Um8KQrEs\",\"language\":\"javascript\",\"type\":\"code-block\"}],\"id\":\"tSiKXa-5gKQMn9bLzGSMK\",\"name\":\"Node.js\",\"type\":\"tab\"},{\"children\":[{\"children\":[{\"text\":\"전체 코드는 \"},{\"children\":[{\"text\":\"예제 코드\"}],\"id\":\"SxW4QxJlH6CzkqufRbEeW\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/tree/main/server/server-sign/go\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"KNRF3QhqI2Y4h_YmJ3caR\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"package main\"}],\"id\":\"XKXyjW5QD2cjvvzL9iy_8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"dtBpTDEfXuKT1Lnnbz3-E\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import (\"}],\"id\":\"V4UBuZaJ9jfzN7C7Ptq2H\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"context\\\"\"}],\"id\":\"F75tspohT636MV8OL8vwb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"encoding/json\\\"\"}],\"id\":\"8pfS9sLhyNH-jCGoYehnx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"errors\\\"\"}],\"id\":\"paGTkL7Yzucqgdo-5TLdQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"fmt\\\"\"}],\"id\":\"m88A_ucBSZqm0VgIFr0XP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"github.com/tencentyun/cos-go-sdk-v5\\\"\"}],\"id\":\"9MxMFrAmoTzL_cFOqHNlb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" sts \\\"github.com/tencentyun/qcloud-cos-sts-sdk/go\\\"\"}],\"id\":\"1JaGpfu6btjz9Roy6jas6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"math/rand\\\"\"}],\"id\":\"k9yFAipR6ivfi8LpVshX5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"net/http\\\"\"}],\"id\":\"KkGvI2R0b9mf1S1dU4z0-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"net/url\\\"\"}],\"id\":\"qgbu0eb-Wxw9TUiAgPqlZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"os\\\"\"}],\"id\":\"GB9oJ9JaELXrd0EY5rhwL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"reflect\\\"\"}],\"id\":\"Sf8XNZjlappaRQ6kRJXFy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"strings\\\"\"}],\"id\":\"53zw2-x9SBVIgzZtg1RW6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"time\\\"\"}],\"id\":\"c_U9OqP2rpL1d4k7XYgU6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"unicode\\\"\"}],\"id\":\"pO9ayfaJs6WFCVaXA0dPE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\")\"}],\"id\":\"xIqbPTjKW_P0yVvAKxJRq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"k_SMUk3Ua79F6V6Z7okTD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"type Config struct {\"}],\"id\":\"Y-TbOFeeF5bwT_1rKxcjN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" filename string\"}],\"id\":\"tPUkjuLH71JYbtAFiMgzW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" appId string\"}],\"id\":\"Qan4fpxiEARUxTyJNjOMy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" SecretId string\"}],\"id\":\"b1yG8Me5g4rGzBFOdguRf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" SecretKey string\"}],\"id\":\"aNEhclhYH3g0dzgr0sVTZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Proxy string\"}],\"id\":\"qmyBgB5bVckiP-ELrIged\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" DurationSeconds int\"}],\"id\":\"dJnYgKgN8C-IXks70uyxK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Bucket string\"}],\"id\":\"YuG3p33GYXWeCOwwQASYK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Region string\"}],\"id\":\"pc2rAZOzq_B17ZEw6vXp5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" AllowActions []string\"}],\"id\":\"whOh0Q6o4U0a_WEEDjki1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"37Xjkn3WmpgwZfb9SfKeh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"PcvIG-UmWc26CE8cZ1ncn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"type Permission struct {\"}],\"id\":\"OHtD1HcztqVnIkutZ0ItB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" LimitExt bool `json:\\\"limitExt\\\"`\"}],\"id\":\"WhXWYoqQZm6ATb5hEWZba\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ExtWhiteList []string `json:\\\"extWhiteList\\\"`\"}],\"id\":\"UBJ502CINtplT1YqbfRhe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" LimitContentType bool `json:\\\"limitContentType\\\"`\"}],\"id\":\"EnOc4i-quwQC3oe2y8vL_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" LimitContentLength bool `json:\\\"limitContentLength\\\"`\"}],\"id\":\"PjYkwH4gkY-1iZGl0T3QC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"gaArzSOfi-1lz9ypvHEQ_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"Ldl43tWCntiprtO7Z5YTL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"func generateCosKey(ext string) string {\"}],\"id\":\"XcaRI_EONHr74uRcSEkaR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" date := time.Now()\"}],\"id\":\"Mmxj35irPqcrzFQwikpZu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" m := int(date.Month()) + 1\"}],\"id\":\"BEoWm2AbZlRjzyBAp0ihT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ymd := fmt.Sprintf(\\\"%d%02d%d\\\", date.Year(), m, date.Day())\"}],\"id\":\"xjOpIB5T2d4cb_wtyCYGU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" r := fmt.Sprintf(\\\"%06d\\\", rand.Intn(1000000))\"}],\"id\":\"iYhEiOTMLxK2oF2Pswk5G\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" cosKey := fmt.Sprintf(\\\"file/%s/%s_%s.%s\\\", ymd, ymd, r, ext)\"}],\"id\":\"3db_YccTHzK2DQhmKmeVt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return cosKey\"}],\"id\":\"UJBfDYwKQBVz5FGVWas3y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"Jq6bG1kR9BOLZ4T45lYHJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"pBIywrHYRR87nBNXnXqBx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"func getPermission() Permission {\"}],\"id\":\"l7gw7nP77SXb5EMibMsK6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" permission := Permission{\"}],\"id\":\"UQqOQaTE5NbgIg0BPFWy-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" LimitExt: true,\"}],\"id\":\"bL02ELegZSgc_XmXINRny\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ExtWhiteList: []string{\\\"jpg\\\", \\\"jpeg\\\", \\\"png\\\", \\\"gif\\\", \\\"bmp\\\"},\"}],\"id\":\"thhjuWQDb_NsPELmrHHQu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" LimitContentType: false,\"}],\"id\":\"X6voKE046AHnaBfKkKWBa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" LimitContentLength: false,\"}],\"id\":\"DUE5l6fNOUmm7xwdZ2l36\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"5h_dk4SyDNmNn69EJY4On\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return permission\"}],\"id\":\"vr4FvPdoqfOy9UBQl8Ad7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"oIL7o4Sz_cxkw_53Pu6Fp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"_-MqMQsY8mwAgpGy-fyCa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"func getConfig() Config {\"}],\"id\":\"hAoIiaU37z7XUPos9mkJr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config := Config{\"}],\"id\":\"ZZHTfbC8hLM9s0C_sYnW5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" filename: \\\"test.jpg\\\",\"}],\"id\":\"QoxsfFxbF_SO9YsQe3TiW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" appId: \\\"12500000000\\\",\"}],\"id\":\"7dSHraR72uM9myyUeyvRz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" SecretId: os.Getenv(\\\"SECRETID\\\"), // 사용자의 SecretId, 서브 계정 키 사용을 권장하며 최소 권한 가이드에 따라 권한을 부여하여 사용 위험을 줄입니다. 서브 계정 키 획득은 https://cloud.tencent.com/document/product/598/37140 참조\"}],\"id\":\"8O0g7voFY_ozeLlxDDq6n\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" SecretKey: os.Getenv(\\\"SECRETKEY\\\"), // 사용자의 SecretKey, 서브 계정 키 사용을 권장하며 최소 권한 가이드에 따라 권한을 부여하여 사용 위험을 줄입니다. 서브 계정 키 획득은 https://cloud.tencent.com/document/product/598/37140 참조\"}],\"id\":\"CROXkWK80X1jU2hwPQbcx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Proxy: os.Getenv(\\\"Proxy\\\"),\"}],\"id\":\"UhPSP4Tek0ogmafi-29NG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" DurationSeconds: 1800,\"}],\"id\":\"WrF_GB0GUMK9wbJWAZCQj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Bucket: \\\"0-1253960454\\\",\"}],\"id\":\"sok3hXWb3KMVrdI9jpGF2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Region: \\\"ap-guangzhou\\\",\"}],\"id\":\"g7jRuWW0MzgINEzN3WXhL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" AllowActions: []string{\"}],\"id\":\"nx93fKUYNajdfRB7KNmmS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\",\"}],\"id\":\"USk86043U98JAygfSvCgk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"IN_adS_BSkrzkMRV05mMv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"_eyHDpWpSxl-62xDLa1HL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return config\"}],\"id\":\"-1HaCoZexjBVOkMQK3jFc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"UnbUN5n22WBBKjFpVQXq1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"9WezG9NmoSEVebOFa-VSP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"func stringInSlice(str string, list []string) bool {\"}],\"id\":\"wYEEi0VbNVVidRaGesYc3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" for _, v := range list {\"}],\"id\":\"OTierXOayhs43QxpOoLIT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if v == str {\"}],\"id\":\"I3c9ITQCdQ2acXtw7MaAE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return true\"}],\"id\":\"AxuuShFqY2ZJoYXu1qtER\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"5xKCr8nr3A5BDxe2fWlYr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"E9u8cN6GIAmy2fqYxls_b\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return false\"}],\"id\":\"5CPEgLYE4ZpAPoU0vXnIr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"lDT0zAjJFXxrubWToLXI-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"7xYV2V_bgEfeWrQyTzfex\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"func StructToCamelMap(input interface{}) map[string]interface{} {\"}],\"id\":\"Gd0rXA9APz86SCNNhHxAf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" v := reflect.ValueOf(input)\"}],\"id\":\"5YIAbLl3QqZnU1UbcwH8Q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if v.Kind() == reflect.Ptr {\"}],\"id\":\"8M9YTfqChuNz02ljXqt9W\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" v = v.Elem()\"}],\"id\":\"YEvdhVcF_uoC3xhNmrtil\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"JbfdjDVxAa8wgUXu3TeBU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"zGjrzf3L8H2i0UlFuzn8Y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" result := make(map[string]interface{})\"}],\"id\":\"AV8WjGGPKnS8COLJdLnIX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" typ := v.Type()\"}],\"id\":\"MkO4hsDmwOtx0l8ymVq1D\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"zj9IuBapXVAsZ0JJe96nk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" for i := 0; i < v.NumField(); i++ {\"}],\"id\":\"z2u9UObat1Qt6R2Ej3v2P\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" field := typ.Field(i)\"}],\"id\":\"bn5MTFqdpGqewIelYOlPT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fieldValue := v.Field(i)\"}],\"id\":\"H3pkSEjtWX7HqK-fQqBWg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"tVj_riKVhBQLdd-d6pBSR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 필드 이름을 LowerCamel로 변환\"}],\"id\":\"wtxFtIZQNT_auteuQy2Oh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" key := toLowerCamel(field.Name)\"}],\"id\":\"04GL2QoRHD1MlciONC8ZI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"jLOnDv6tMpeiDQOzrf9ls\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 중첩 구조체 처리\"}],\"id\":\"KiGl4qk9f3l-xAH4mfkXH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if fieldValue.Kind() == reflect.Struct ||\"}],\"id\":\"Y28RkVYP0AI60QovEa3kh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" (fieldValue.Kind() == reflect.Ptr && fieldValue.Elem().Kind() == reflect.Struct) {\"}],\"id\":\"gqpvj3e4DmLLvk3QVQLQn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"_mDmoxg35KLRyD6OmL5W9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if fieldValue.IsNil() && fieldValue.Kind() == reflect.Ptr {\"}],\"id\":\"XUdtyakIiScW6C4Ce9xnJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" result[key] = nil\"}],\"id\":\"CrpyzUoJlVOQHTvWe1ctm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" continue\"}],\"id\":\"u5bO-fiBzdeyPprqwgOiE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"WbX7hO8j7MZAaEdRat_28\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"krNt-Y8QAu_-bhGUm-58Z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" result[key] = StructToCamelMap(fieldValue.Interface())\"}],\"id\":\"JCnDMJZU6MFsNgghKR0Jz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } else {\"}],\"id\":\"1VPxj6SwRGTSxQmB3RfUx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 기본 유형 처리\"}],\"id\":\"FXUy-_RXV2NAb3G06ny1H\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" result[key] = fieldValue.Interface()\"}],\"id\":\"ERpeWpOL60nXtFbdO_Vy7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"FwTNOYSLyDiMaWJ2oYopG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"KvXKbXm5BOlGounR9DInA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"20sYEs20cRqucOQ6AGRBP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return result\"}],\"id\":\"t3Iw_UnffT6cL5kGwg9WS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"rv4Q5Igo1cfl2P5AGXElQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"lT35xSZvWaETarFhVoAum\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"// LowerCamel 형식으로 변환(첫 글자가 소문자로)\"}],\"id\":\"HbsBTar0PZ-SSUVS1puwd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"func toLowerCamel(s string) string {\"}],\"id\":\"YMCeFrv1MlIKn7DRH6W6r\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if s == \\\"\\\" {\"}],\"id\":\"btKkvh_WZriN6voGnke6f\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return s\"}],\"id\":\"CmtLxqPcoy0DE6Cr9sRn2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"afUvTytc02dcPQv4tPRKZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"nKeuEUR3K2_8MK2zjEzhQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 전체 대문자 단어 처리(예: ID)\"}],\"id\":\"6NCPoZUUczQal_D9yRPNM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if strings.ToUpper(s) == s {\"}],\"id\":\"0MNi1mnBmPiaJBo11IoP9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return strings.ToLower(s)\"}],\"id\":\"VncCqSTe1Mq91BsCWpX77\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"V2RjQPERd4kIXnr-bD5KO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"GvgCpXf6GPXbVzRMY3H2t\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 일반 LowerCamel 변환\"}],\"id\":\"xQkwagEC_nFTU_Ka0GAdl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" runes := []rune(s)\"}],\"id\":\"VzyRpg2MnosDQR9gT-BOQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" runes[0] = unicode.ToLower(runes[0])\"}],\"id\":\"GuOOp6c8VVfIRbYXiwUqk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return string(runes)\"}],\"id\":\"BJGKzgmDp4jtltvxJXO1t\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"ezzmXk2qugO4hAK1LOzBi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"0gMrJEI1XRj63300ZrwfC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"func getStsCredential() (map[string]interface{}, error) {\"}],\"id\":\"0S5wDPLBG43L8R1vNHgzk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config := getConfig()\"}],\"id\":\"B7kfZSytE2wSaF5DrO9ut\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"3w5KXG4fZ6lZ6eK_bc-ox\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" permission := getPermission()\"}],\"id\":\"brEU6QUnzjBzs74QWB_sC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"JOw_zeZcLfIbOCUVmZ7KZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" c := sts.NewClient(\"}],\"id\":\"P9afG7DDasDwoiQS4AUjZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 환경 변수를 통해 키 획득, os.Getenv 메서드는 환경 변수 획득을 표시함\"}],\"id\":\"l2Y47dslRqQ2eNSTCTFJd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.SecretId, //os.Getenv(\\\"SECRETID\\\"), // 사용자의 SecretId, 서브 계정 키 사용을 권장하며 최소 권한 가이드에 따라 권한을 부여하여 사용 위험을 줄입니다. 서브 계정 키 획득은 https://cloud.tencent.com/document/product/598/37140 참조\"}],\"id\":\"ve0Eigt2PlDudiVMTTHKG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.SecretKey, //os.Getenv(\\\"SECRETKEY\\\"), // 사용자의 SecretKey, 서브 계정 키 사용을 권장하며 최소 권한 가이드에 따라 권한을 부여하여 사용 위험을 줄입니다. 서브 계정 키 획득은 https://cloud.tencent.com/document/product/598/37140 참조\"}],\"id\":\"7HGPmzOwd1lTHIHiViE7t\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" nil,\"}],\"id\":\"bzS2FTz95No9ECXPzp_jg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // sts.Host(\\\"sts.internal.tencentcloudapi.com\\\"), // 도메인 설정, 기본 도메인 sts.tencentcloudapi.com\"}],\"id\":\"ajhb1K2KuBtuldeDYhcMI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // sts.Scheme(\\\"http\\\"), // 프로토콜 설정, 기본값은 https이며, 퍼블릭 클라우드 sts에서 임시 키를 가져올 때 http는 허용되지 않습니다. 특수한 시나리오에서만 http 설정이 필요합니다.\"}],\"id\":\"I1QSyC7aJC7VIbu9UvjZv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" )\"}],\"id\":\"D4ngOooh4Y6CKpIZZ_AAH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"x8Q_6SJRpkf9wexVYEABm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" condition := make(map[string]map[string]interface{})\"}],\"id\":\"g1WzjrzGcm7C_PSTuPRwh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"tyfpDZpf7ZkkiSNn7j2C9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" segments := strings.Split(config.filename, \\\".\\\")\"}],\"id\":\"MD3vOAmbb4NOdsybXDcUR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if len(segments) == 0 {\"}],\"id\":\"bnJE6tlhZ6HeTkCtpCnS-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //ext := \\\"\\\"\"}],\"id\":\"5WJcniJELpWMoLOd4M-U8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"FvNsF9j7UwHvXdl_FvPAS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ext := segments[len(segments)-1]\"}],\"id\":\"U7ogJJCFjEH3BIGpCn6e8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"gwZTJffDgXntxSpI7Nb-l\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if permission.LimitExt {\"}],\"id\":\"zXf0lOhqiZN5klu3M_ynq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" extInvalid := ext == \\\"\\\" || !stringInSlice(ext, permission.ExtWhiteList)\"}],\"id\":\"kyieyBd-uaDBpoNLO29H6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if extInvalid {\"}],\"id\":\"W2b0L49ihzjJPRZPob-HU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return nil, errors.New(\\\"불법 파일, 업로드 금지\\\")\"}],\"id\":\"kqv0qWbJ1-XyDeRLLNncJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"-8thCwQQILllsRgG2JVZ4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"NsPT4kH3Mf-fP8wecwACZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"dGOmh3PRuxzCWDiG4pmYR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if permission.LimitContentType {\"}],\"id\":\"oIYYnRp3woPDzKnYj24Di\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" condition[\\\"string_like_if_exist\\\"] = map[string]interface{}{\"}],\"id\":\"JPePtCv_LshNtfqvngjqH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // content-type이 이미지 유형인 경우에만 업로드 허용\"}],\"id\":\"9qSIAvuSFzfBGu2vZ_62y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:content-type\\\": \\\"image/*\\\",\"}],\"id\":\"33D47twC2_vOJPQCnMvJJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"nMJf8H2OEqkz6zZfSQiO_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"tARZy8T4Cee41Qt-5tJhg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"X_W7mbaQLPHMDDTpv6CeK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 3. 업로드 파일 크기 제한\"}],\"id\":\"X7vXnyUM8Ej24KK-bu-B5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if permission.LimitContentLength {\"}],\"id\":\"MdXNIpb2I7ThCU-qodxxT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" condition[\\\"numeric_less_than_equal\\\"] = map[string]interface{}{\"}],\"id\":\"N3JOWnJgA2sUoH1BJdzZ6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드 크기는 최대 5MB로 제한됨(단순 업로드에만 적용됨)\"}],\"id\":\"zAu4BWYSzPXBHR5NOqbao\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:content-length\\\": 5 * 1024 * 1024,\"}],\"id\":\"CkhFo6ubxXDdNTeP10NCE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"TXdrgUJxcOAmFlB0wxvYo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"exV0EmbI5Fikb2XURur9u\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"qLWvQI_lgrdf3SdYb_t5T\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" key := generateCosKey(ext)\"}],\"id\":\"vOQrLqbX78OVEupl5bZk5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 정책 개요 https://cloud.tencent.com/document/product/436/18023\"}],\"id\":\"lTEmYJWsSU2mQCZCGUStf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" opt := &sts.CredentialOptions{\"}],\"id\":\"kq4zdQpxEmHQig6zAyuK_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" DurationSeconds: int64(config.DurationSeconds),\"}],\"id\":\"MvMch0_r1rv_k2s0-JoL-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Region: config.Region,\"}],\"id\":\"JyTMOoVq4aNHyLzz7y0JQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Policy: &sts.CredentialPolicy{\"}],\"id\":\"YTKAS9lrgBav7THTmeFM2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Version: \\\"2.0\\\",\"}],\"id\":\"uAH1kkFhrU6s7ToRXk3Gf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Statement: []sts.CredentialPolicyStatement{\"}],\"id\":\"HD72zX124VNNlDaTePqkS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"Pb0Gw5MI9_Lp6xAwfDy-O\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 키의 권한 목록. 단순 업로드 및 샤딩에는 다음 권한이 필요하며, 기타 권한 목록은 https://cloud.tencent.com/document/product/436/31923 참조\"}],\"id\":\"U8UioESMM0fRdeThSY1Xx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Action: config.AllowActions,\"}],\"id\":\"abQoCOgsGL1xvhWPi3eyS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Effect: \\\"allow\\\",\"}],\"id\":\"4F9w0IvPHBTpT-FzGD_zE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Resource: []string{\"}],\"id\":\"D_B-ms2vQofXq0C_IAI-i\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 여기서 허용할 경로 접두사를 변경합니다. 자신의 웹사이트 사용자 로그인 상태에 따라 업로드할 특정 경로를 판단할 수 있습니다. 예: a.jpg, a/* 또는 * (와일드카드 * 사용에는 중대한 보안 위험이 있으므로 신중하게 평가하여 사용하십시오).\"}],\"id\":\"HRj-l3sgbLeDJhh5GfTzT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 버킷의 이름 형식은 BucketName-APPID이며, 여기에 입력한 bucket은 반드시 이 형식이어야 합니다.\"}],\"id\":\"R2a7AbxYkyscH-CjDkRt3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"qcs::cos:ap-guangzhou:uid/\\\" + config.appId + \\\":\\\" + config.Bucket + \\\"/\\\" + key,\"}],\"id\":\"y3ds_scCPTcqEMvsWp67o\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"HNgDF8PAp-F-KQIM24q8k\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 적용 조건 구축 시작 condition\"}],\"id\":\"Jrj0jtqITpFR-Yg2354Cz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // condition에 대한 상세 설정 규칙 및 COS에서 지원하는 condition 유형은 https://cloud.tencent.com/document/product/436/71306 참조\"}],\"id\":\"5eEbCtdtUOYf5u5JjJ6pY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Condition: condition,\"}],\"id\":\"LdomO3MhzhhoHifjP68MA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"acpJ7tRzGdAU1yGUYu8YM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"eBWhTCff6ReF-Ei3B_j-V\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"gqRtoF5sFC4Qo1yoxEbh5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"xO47t2gPcYUF4lfjH12Tb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"rD35XJyiZA3Wd7xvmDDWT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // case 1 임시 키 요청\"}],\"id\":\"v-0xA3U578sFGK7mNFR6U\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" res, err := c.GetCredential(opt)\"}],\"id\":\"s1uBMP35p9E8Ilj0DV69A\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if err != nil {\"}],\"id\":\"WTIBuFq7vekyZ48zpH-ef\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return nil, err\"}],\"id\":\"Jj644Obr_u-ifgy8qkXcO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"0NnekeBD9svOGdDqvVpNI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // LowerCamelMap으로 변환\"}],\"id\":\"H4F-KjYfLHslG2MmasXiC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" resultMap := StructToCamelMap(res)\"}],\"id\":\"mJ5BAz_5sk0EPgtJ55A4_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" resultMap[\\\"bucket\\\"] = config.Bucket\"}],\"id\":\"2AHxWDp4cR77r_B0LOpt3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" resultMap[\\\"region\\\"] = config.Region\"}],\"id\":\"Alv3OnSPB-WyxjJuMowZg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" resultMap[\\\"key\\\"] = key\"}],\"id\":\"siHn8jh2PBoi591geCtx7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"wI2fWbnwGhhS6A2B7w2IQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return resultMap, nil\"}],\"id\":\"Acu_DHlLQ9m2XggS1Posj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"59-cNO7gf877QUGt3wfG9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"QTh0Pr24WnPeM7Yp9V8oO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"func main() {\"}],\"id\":\"zXhP8IFPapemPREDxeQLv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" result, err := getStsCredential()\"}],\"id\":\"xdMBIe-tkkMRp7f22d5v4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if err != nil {\"}],\"id\":\"OZ0vKGIVKt4qn745zX-k0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fmt.Printf(\\\"임시 키 요청 실패: %v\\\\n\\\", err)\"}],\"id\":\"a82esLrKmo7S98yJk6mCo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return // 컨텍스트에 따라 종료 여부 결정\"}],\"id\":\"GqsJ4VBpR5yoryxPt3TE9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"9qbIwFPYFuRlut3tVnU17\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"s2mb5olEHheNuFQKRbj1h\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // credentials를 map[string]interface{}로 타입 단언\"}],\"id\":\"BprTnKLdMo2oWUOP2Gaok\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credentials, ok := result[\\\"credentials\\\"].(map[string]interface{})\"}],\"id\":\"KgGhpUc5PFGmMn73sE7g2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if !ok {\"}],\"id\":\"uSRn92GKwhTrYmeRtv_d_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fmt.Println(\\\"자격 증명 형식 오류\\\")\"}],\"id\":\"yc4rO6nNwyujuA84KZj2q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return\"}],\"id\":\"Gu9cBz0x7qfZ6-P84cZVI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"gBTwBg4VpcaEYznZeTxZg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 유형 검사가 포함된 필드 획득\"}],\"id\":\"QrvLXw45Jza5vKE-uyWt2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" tak, tok := credentials[\\\"tmpSecretID\\\"].(string)\"}],\"id\":\"G2ac275ohT_-trtNbrbO5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" tsk, tskok := credentials[\\\"tmpSecretKey\\\"].(string)\"}],\"id\":\"DF-ppamb02qWGQbKoe5uP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" token, tokenok := credentials[\\\"sessionToken\\\"].(string)\"}],\"id\":\"52y66sNi31Njs5zyett55\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if !tok || !tskok || !tokenok {\"}],\"id\":\"069rk_sxXVionrzreiHbP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fmt.Println(\\\"임시 자격 증명 필드 누락 또는 유형 오류\\\")\"}],\"id\":\"yn3JgXyKGgrkjo_wYo7wT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return\"}],\"id\":\"S3wThxGpsrGwJ-HJJGy3-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"a4Mxr5FrH5DcBgXXWsJnM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" host := \\\"https://\\\" + result[\\\"bucket\\\"].(string) + \\\".cos.\\\" + result[\\\"region\\\"].(string) + \\\".myqcloud.com\\\"\"}],\"id\":\"YU90mAkYnjLGrVppKlLgK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" u, _ := url.Parse(host)\"}],\"id\":\"81_RbgjovbLNOHg8Ml4lv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" b := &cos.BaseURL{BucketURL: u}\"}],\"id\":\"L3G5MGR6FMKS34PpmY7Y_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" c := cos.NewClient(b, &http.Client{})\"}],\"id\":\"eg4SdfOi3Qhnpd0N12fLn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" name := result[\\\"key\\\"].(string)\"}],\"id\":\"PEt6i-WlwwFFswfPNu9iZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ctx := context.Background()\"}],\"id\":\"FHtBZaeasWaXqHsyMKr6C\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" opt := &cos.PresignedURLOptions{\"}],\"id\":\"mdMS-VRwq7k_UQBYo98wX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Query: &url.Values{},\"}],\"id\":\"Yjxq_e9mFT06uE5t22rpO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Header: &http.Header{},\"}],\"id\":\"nDbl4a5Q_iFNocTJvaLUw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"2aEswzS_JgUs6pK1WoB56\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" opt.Query.Add(\\\"x-cos-security-token\\\", token)\"}],\"id\":\"5ezdf0eAHZKGMze_rTSfg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" signature := c.Object.GetSignature(ctx, http.MethodPut, name, \\\"tak\\\", \\\"tsk\\\", time.Hour, opt, true)\"}],\"id\":\"FBGXUUEwOryVSPwtHIZHk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fmt.Printf(\\\"%s\\\\n%s\\\\n%s\\\\n%s\\\\n\\\", tak, tsk, token, signature)\"}],\"id\":\"r5VWt4RyXiJJwDBXgWdyj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" data := make(map[string]string)\"}],\"id\":\"qrhqOrzvoy8YphAM0RUKl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"8-bc-Wuhp810hOmLgR9Ij\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // token 및 sign 추가\"}],\"id\":\"fj4J6IMu-BbTkkHvp2JcD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" data[\\\"securityToken\\\"] = token\"}],\"id\":\"8nAFFngpmvulDGrgFyZO0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" data[\\\"authorization\\\"] = signature\"}],\"id\":\"HMfWY6IZogUo0OyEMKlWQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" data[\\\"cosHost\\\"] = host\"}],\"id\":\"BhlkV0qqifvxeBZbE-cT_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" data[\\\"cosKey\\\"] = name\"}],\"id\":\"ITfabmWo_Yp1fa8Hv1Xd0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // JSON으로 변환\"}],\"id\":\"wiwt1QiIZ4_6EXoYXptlO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" jsonData, err := json.MarshalIndent(data, \\\"\\\", \\\" \\\")\"}],\"id\":\"-KdrNsse7_cZCfN4iT2xZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if err != nil {\"}],\"id\":\"Tv10cEKFwmhX4MP0hqq2G\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fmt.Println(\\\"JSON 인코딩 실패:\\\", err)\"}],\"id\":\"-uWOoFp6X3subfM2hSE9w\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return\"}],\"id\":\"Lh8yh-oZs5XYzkOgoifSq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"wbzyutUyxKFCdGWUqOFZo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" fmt.Println(string(jsonData))\"}],\"id\":\"nvGOynxVSiTGR4A7G3MjN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"AqubqUih9WPUOFpiOn9rm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"rviEwmDb5wowFa8I4a3dk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"UHXqrwbE39E73SI2b7vLU\",\"type\":\"code-line\"}],\"executionContext\":{},\"id\":\"dqSmt1o_TRpN6m4tMXRwP\",\"language\":\"go\",\"type\":\"code-block\"}],\"id\":\"1xUJDoDE71-mw6kY7jqJy\",\"name\":\"Go\",\"type\":\"tab\"},{\"children\":[{\"children\":[{\"text\":\"전체 코드는 \"},{\"children\":[{\"text\":\"예제 코드\"}],\"id\":\"OrwXQsFlaKtm1Sfg3fN2W\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/tree/main/server/server-sign/php/demo\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"0LlqBMAuM8s6FAO2L9yJX\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\" false, // 업로드 파일 확장자 제한\"}],\"id\":\"0fqlMHxNSLMC7rsYmHJIh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'extWhiteList' => ['jpg', 'jpeg', 'png', 'gif', 'bmp'], // 제한된 업로드 확장자\"}],\"id\":\"6d4bNbDSS16rBj_BH2esm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'limitContentType' => false, // contentType 업로드 제한\"}],\"id\":\"vPqCT-VZBf6DchdWGv9Vi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'limitContentLength' => false, // 업로드 파일 크기 제한\"}],\"id\":\"H6-pnMDhAIWR4KIWZGj6N\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" );\"}],\"id\":\"6qdxK_eb5VhqTKGETm7dK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $condition = array();\"}],\"id\":\"NrasmzgOGZHu5-dhEIXx-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"87xvJIwibTJAog7zmSN6B\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 클라이언트에서 전송된 원본 파일 이름을 기반으로 파일 확장자에 따라 임의의 키 생성\"}],\"id\":\"Ml14qiNzHBySmj8jUdVEY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $ext = pathinfo($filename, PATHINFO_EXTENSION);\"}],\"id\":\"ws6ZgG3PGz4i2q5h9ZxsS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"dHbnuDPnuEdwJxJa8l35J\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 1. 업로드 파일 확장자 제한\"}],\"id\":\"27KO3kVAkAqGQfAZemndf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if ($permission['limitExt']) {\"}],\"id\":\"66nSsQJnYBLjcfdkbabyr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if ($ext === '' || array_key_exists($ext, $permission['extWhiteList'])) {\"}],\"id\":\"_9rCcxXtS7ts1zEG-Vac1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return '불법 파일, 업로드 금지';\"}],\"id\":\"856XxT0ecGfJB1ppjVHHo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"Jrb2nM_imodqlIdkhvEQR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"KWr1Q2eeP1nHOQ4nkGr9S\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"27ELLjuWLoTTq64-BU_S4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 2. content-type 파일 업로드 제한\"}],\"id\":\"n4iz0RUI70R7f97HAsQR9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if ($permission['limitContentType']) {\"}],\"id\":\"pmfz1zvqBosdl1_eME2FS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // content-type이 이미지 유형인 경우에만 업로드 허용\"}],\"id\":\"_--sNBMxz-A3eoN2Ig5R_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $condition['string_like_if_exist'] = array('cos:content-type' => 'image/*');\"}],\"id\":\"bjfW7qddYSwldFZG-zMfA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"_icthue3TPNX97LxgE_7T\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"_uj82kqfWirlGM2Fds1Fx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 3. 업로드 파일 크기 제한\"}],\"id\":\"ECyWltJGbTcKRnET6B-kW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if ($permission['limitContentLength']) {\"}],\"id\":\"B1JxoEkVefrBb1k0Nu8YG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드 크기는 최대 5MB로 제한됨(단순 업로드에만 적용됨)\"}],\"id\":\"-nn62uBP3EupUsv36jqxs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $condition['numeric_less_than_equal'] = array('cos:content-length' => 5 * 1024 * 1024);\"}],\"id\":\"tZFwSVSUvCmfOEtXdyhQz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"2cY9P74sgZt90OBYTh9PG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"wzmZhiMEkES_H9nboYAX1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $cosKey = generateCosKey($ext);\"}],\"id\":\"V-HDcU8eRiJRPXXqAB-pP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $bucket = 'test-125000000'; // 사용자의 bucket으로 변경\"}],\"id\":\"iRGvmQAQ8d3U_pCGj8Qrq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $region = 'ap-guangzhou'; // bucket이 위치한 리전으로 변경\"}],\"id\":\"ip22_eUbBldTKUHcqqXMa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"E0mZZhYGAO9A1Ry5sZo_l\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $config = array(\"}],\"id\":\"0IoZ8kCppMvNRnDqkoqzb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'url' => 'https://sts.tencentcloudapi.com/', // url과 domain을 일치시킴\"}],\"id\":\"gHOOjK1WiWh_ZxAvjaIhQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'domain' => 'sts.tencentcloudapi.com', // 도메인, 필수 아님, 기본값은 sts.tencentcloudapi.com\"}],\"id\":\"stKGFyMyfmgyeWuxNhIkO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'proxy' => '',\"}],\"id\":\"xJtJjlHph00ES2_VCth85\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'secretId' => \\\"\\\",//getenv('GROUP_SECRET_ID'), // 고정 키, 평문 키인 경우 'xxx' 형태로 직접 입력하고 getenv() 함수에 기입하지 마세요.\"}],\"id\":\"VZ1PVbgtdnTF8-pnIImAz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'secretKey' => \\\"\\\",//getenv('GROUP_SECRET_KEY'), // 고정 키, 평문 키인 경우 'xxx' 형태로 직접 입력하고 getenv() 함수에 기입하지 마세요.\"}],\"id\":\"RxxEYbJJzSjXSe5PV9ebU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'bucket' => $bucket, // 사용자의 bucket으로 변경\"}],\"id\":\"Iu1jvKRkR7tIZ_kcMXJuZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'region' => $region, // bucket이 위치한 리전으로 변경\"}],\"id\":\"lxb32PCAsfidIpJA9GQJx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'durationSeconds' => 1800, // 키 유효 기간\"}],\"id\":\"wSdU-pZCnVMxguk9Zfd4X\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'allowPrefix' => array($cosKey), // 현재 key의 경로 권한만 할당\"}],\"id\":\"nku-cbEZdZueGKN_WKIX_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 키의 권한 목록. 단순 업로드 및 샤딩에는 다음 권한이 필요하며, 기타 권한 목록은 https://cloud.tencent.com/document/product/436/31923 참조\"}],\"id\":\"RAxrE4yWrrI51tEm_iwXO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'allowActions' => array (\"}],\"id\":\"yxtvMDiEoCK89eg7XKqvv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 단순 업로드\"}],\"id\":\"M-DSEFMo1PJ412lv-NsWy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'name/cos:PutObject'\"}],\"id\":\"TMKplEdm8se3VRuX9JmH-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ),\"}],\"id\":\"lLsMCYqKB7y58WKY7hgxm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" );\"}],\"id\":\"vA3sKM3wV7GRq5sZLVWQh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"d1LH1-qEe-V8eB_Dp63Id\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (!empty($condition)) {\"}],\"id\":\"vVl-Q0XDSWxf9MaWHwS5U\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $config['condition'] = $condition;\"}],\"id\":\"Or3Yro0Qz4J8AZUEJcl_E\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"qn5vklm4s0MSshEDXuWPB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"ZB48kNxdu303FzI-ZKOPn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $sts = new Sts();\"}],\"id\":\"BC39MpnmQnNeWg71sdyS2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $tempKeys = $sts->getTempKeys($config);\"}],\"id\":\"k-8ogveCe-3xX64riu4or\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $resTemp = array_merge(\"}],\"id\":\"pYo7pKsRNBd23O8nHVxfV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $tempKeys,\"}],\"id\":\"7t_12g4TXk54JRlqxnRg1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" [\"}],\"id\":\"uW28jwkb11iyvWeMTbH46\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'startTime' => time(),\"}],\"id\":\"nAB7r__e2yTE4EdmgMOvH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'bucket' => $bucket,\"}],\"id\":\"piME3nMpoRHf3-uZgsDJT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'region' => $region,\"}],\"id\":\"nX36csnah__utmsxbe311\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'key' => $cosKey,\"}],\"id\":\"RHgcGqqB0Uf2opwcNiDIN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ]\"}],\"id\":\"prcFFxRrwdEutu33vorao\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" );\"}],\"id\":\"N7IeTAeW0JkPL0wI7GPU-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return $resTemp;\"}],\"id\":\"XaOdK_YH_KnXKsAp25snu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"h2nQkzwwM8q_7WG96FXsD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"9nAf7mdD6VV-o0xu9XjnU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"function getSign()\"}],\"id\":\"XzisZT_yd3XznYSJEsr-5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"{\"}],\"id\":\"FJaeJxKVDRED33O22ymbN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $filename = \\\"test.jpg\\\";\"}],\"id\":\"ovRywCQP71kzEtFJm6bPH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $method = \\\"putObject\\\";\"}],\"id\":\"ndRT3aJtrYOHKEeS4_o6R\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $result = getKeyAndCredentials($filename);\"}],\"id\":\"Tipli_KK2DFVgOdm5dOHv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $credentials = $result[\\\"credentials\\\"];\"}],\"id\":\"kuRc9emZIIft3bMjGna60\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $sessionToken = $credentials[\\\"sessionToken\\\"];\"}],\"id\":\"EUA-u88hBHwRGd3vUVxsf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $tmpSecretId = $credentials[\\\"tmpSecretId\\\"];\"}],\"id\":\"RZZvWqMICPbzMzwMSDBBn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $tmpSecretKey = $credentials[\\\"tmpSecretKey\\\"];\"}],\"id\":\"2BJx-fit2Mg2JfZT4dgot\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $expiredTime = $result[\\\"expiredTime\\\"];\"}],\"id\":\"pRwPV-w4AlVtaqKRzAsGG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $startTime = $result[\\\"startTime\\\"];\"}],\"id\":\"IhVVINtFfPRy9GazpHACD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $bucket = $result[\\\"bucket\\\"];\"}],\"id\":\"bVYl3Vffal7w1kzasD7xM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $region = $result[\\\"region\\\"];\"}],\"id\":\"LdbXam3U77mS-EBgTYuaC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $key = $result[\\\"key\\\"];\"}],\"id\":\"QVCZNuCqIP73T-0-55G1-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"JX9xTEDI00eSKy2lC-J2z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $cosClient = new Qcloud\\\\Cos\\\\Client(\"}],\"id\":\"4YGynZ9jJed87i1HXfW3R\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" array(\"}],\"id\":\"wtCxVHXN2UA5Jprf-CX7o\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'region' => $region,\"}],\"id\":\"_bueNY8EhDOR_Ul1nqyYN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'scheme' => 'https', //프로토콜 헤더, 기본값은 http\"}],\"id\":\"7N1ycySxpgUYU9Hqmbfr4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'signHost' => true, //기본적으로 Header Host에 서명함. Header Host에 서명하지 않을 수도 있지만, 이 경우 요청 실패 또는 보안 취약점이 발생할 수 있습니다. host에 서명하지 않으려면 false 입력.\"}],\"id\":\"hiEC5FJeRfJaxc-TdFf1H\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'credentials'=> array(\"}],\"id\":\"evVnBq7nU0s13Ac6yTpaV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'secretId' => $tmpSecretId,\"}],\"id\":\"x0Aq7xQoUA_UsB9zNk5AR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'secretKey' => $tmpSecretKey,\"}],\"id\":\"pf8Lyix2jJWLcQDemcozy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'token' => $sessionToken)));\"}],\"id\":\"_RgOEUhoOQLlvi9rL_aLQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ### 단순 업로드 사전 서명\"}],\"id\":\"q2S_hqe5jXr-R__uhXl8H\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" try {\"}],\"id\":\"1w1ydNijVSJOJOkiC0OgJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $url = $cosClient->getPresignedUrl($method,array(\"}],\"id\":\"BbYgh6pRUszsevCcASejc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Bucket' => $bucket,\"}],\"id\":\"sgy2oBILb0C9uLlXzGMwQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Key' => $key,\"}],\"id\":\"8euhx45lM_LQsyVhjPZ53\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Body' => \\\"\\\",\"}],\"id\":\"fOS6yLWN_o6pBEVTybZiS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Params'=> array('x-cos-security-token' => $sessionToken),\"}],\"id\":\"GBdq5XEcwDtKIy2VUt_f1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Headers'=> array(),\"}],\"id\":\"yMvAdGZR3IUeGWqJGhvi3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ), $expiredTime - $startTime); //서명의 유효 기간\"}],\"id\":\"hFL7oKhiI4bs9lOWfAjB1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"q5-1Ceaz8ONtyNaRIfJRj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $parsedUrl = parse_url($url);\"}],\"id\":\"a3hdhIh7G-dvwiYjn7Elq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $host = 'https://' . $parsedUrl['host']; // 포트 자동 포함(있는 경우)\"}],\"id\":\"o681fyXhdWp-oGMRIACl4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $queryString = isset($parsedUrl['query']) ? $parsedUrl['query'] : '';\"}],\"id\":\"yeaa0-AQn8J48o5IfsKM7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $queryParts = explode('&', $queryString);\"}],\"id\":\"-oSYSaTb_riJYnEvtC4Tc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $signParts = array_filter($queryParts, function($part) {\"}],\"id\":\"Vax_OjqvQABg6e9H7lrKr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return strpos($part, 'x-cos-security-token=') !== 0;\"}],\"id\":\"QkyfiIiTUM7yKvsKW_bcQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"5J-mQblUhN0QRpQy_HN3W\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $sign = implode('&', $signParts);\"}],\"id\":\"rwDfHl17zb7XYvJBblzL8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" $result = [\"}],\"id\":\"ghd2KA1SWS1ccWgreavp2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'cosHost' => $host,\"}],\"id\":\"4aO6A0Rebcpotu7Du3iMf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'cosKey' => $key,\"}],\"id\":\"XkpLyn5wHFgo82WnGrIUb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'authorization' => $sign,\"}],\"id\":\"LdjgUqvIQ0EVJQtGKh9q2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'securityToken' => $sessionToken\"}],\"id\":\"BdDLMjkkHeacz1RLVCWt7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ];\"}],\"id\":\"T5n1ju6R87y2qehG3f3l-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"V8iB4EuMnCnzgvqE-4IIv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);\"}],\"id\":\"ZP0znQRN-KaKhaiHsBy0b\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"MeqXEV9nVpfBU5OVtizWx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } catch (\\\\Exception $e) {\"}],\"id\":\"nJaOZS1algCrlSPjjPMe7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 요청 실패\"}],\"id\":\"1G5aeXYXFInOvEbHf3BoU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" echo($e);\"}],\"id\":\"1-13GHcI3ZGOPLlW_Jmxs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"t9AEY9Uih2wAWPO8AeJrA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"pa-Wmps91NJvU4PkLnY3A\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"getSign();\"}],\"id\":\"NAdx6pZMXjhT1Il2TORZC\",\"type\":\"code-line\"}],\"id\":\"trKHkp3_VF0N8-Srp_nXF\",\"language\":\"php\",\"type\":\"code-block\"}],\"id\":\"mTIMgfMHRNb3k3QIyJHkp\",\"name\":\"PHP\",\"type\":\"tab\"},{\"children\":[{\"children\":[{\"text\":\"전체 코드는 \"},{\"children\":[{\"text\":\"예제 코드\"}],\"id\":\"yXF6XFZcZlOUnfek4TdhJ\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/tree/main/server/server-sign/python\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"U9elWYOYI04YvryNBSFz6\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"#!/usr/bin/env python\"}],\"id\":\"L2-N7MO548vLN5awCCcxQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"# coding=utf-8\"}],\"id\":\"SN83F6sKxSiT8spBKBzUp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import json\"}],\"id\":\"15SPchDlOfne-nvULM-hw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import os\"}],\"id\":\"Qd_YppJNcHzj6DF9p-NJT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import datetime\"}],\"id\":\"W3mDQfAoNWlp6s0oLAqyB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import random\"}],\"id\":\"zsTWyvti0SIRTM4wbZ7Zf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"from urllib.parse import urlencode\"}],\"id\":\"DHn-w4Ohs12rg7Xx-6hef\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"dF-1U1r_sIBchIrYZYQt1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"from qcloud_cos import CosConfig, CosS3Client\"}],\"id\":\"8wzRTKLjh7HnVPqH5B24i\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"E7gs4ytyXlBllLLtI3diR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"from sts.sts import Sts\"}],\"id\":\"U9T5My02gjgRYHTG5Rih5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"HcnAStMJspMDubKgITcjh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"sMoGHPJtHLCUIL5W-pj8p\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"if __name__ == '__main__':\"}],\"id\":\"zX3YHHAtgkOYfQKzHrlAK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"WKgHSrt5NrWJsfKqHJL1v\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # 매개변수 설정\"}],\"id\":\"rflJQqRxQHV4Yx4Y5lPPR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config = {\"}],\"id\":\"EFbphomjdeIsUfnQYzNMh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"filename\\\":\\\"test.jpg\\\",\"}],\"id\":\"xbJoUOJi6TzCcfa1ikNsO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"appId\\\": \\\"1250000000\\\",\"}],\"id\":\"g_54w-K_y2ekHxYuf3Qu6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"secretId\\\": os.getenv(\\\"SecretId\\\"),\"}],\"id\":\"zmR1lUT0gznFdCLSkS-3S\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"secretKey\\\": os.getenv(\\\"SecretKey\\\"),\"}],\"id\":\"OOvfSCphT3oPGyNO-9sqD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"proxy\\\": os.getenv(\\\"Proxy\\\"),\"}],\"id\":\"xwl4nW2M5XTJ5jPER_Kzg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"durationSeconds\\\": 1800,\"}],\"id\":\"2o20YqmgpjZLIkN33Kzdy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"bucket\\\": \\\"0-1253960454\\\",\"}],\"id\":\"kdK9TKAg_uIvF-cKTSl88\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"region\\\": \\\"ap-guangzhou\\\",\"}],\"id\":\"OX8oZlaSDPSCKaIIfGTHD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # 키 업로드 작업 권한 목록\"}],\"id\":\"wBEQkm4x0C-lLsoZt7L_w\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"allowActions\\\": [\"}],\"id\":\"6C14q42WIH1daHaUyJIVO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # 단순 업로드\"}],\"id\":\"NJhXTx8-9z6OS6sAzeil3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\"\"}],\"id\":\"7ppRAEnjQtaPv5w9OnKO4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"0KktleOuEnJPfldD2ammC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"lF5qx48norjw6k-DFgIIJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"Ym_QsOTzyRhJOcUNSiXYz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" permission = {\"}],\"id\":\"fWGeGiOLNXdOji7_sJa_e\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"limitExt\\\": True, # 업로드 파일 확장자 제한\"}],\"id\":\"obQrlCze2uGJFY47gr2zq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"extWhiteList\\\": [\\\"jpg\\\", \\\"jpeg\\\", \\\"png\\\", \\\"gif\\\", \\\"bmp\\\"], # 제한된 업로드 확장자\"}],\"id\":\"ewbfvJFLFeWEp_0PG4Eqy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"limitContentType\\\": False, # contentType 업로드 제한\"}],\"id\":\"s0VuctH86CZMdyePSDX2I\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"limitContentLength\\\": False, # 업로드 파일 크기 제한\"}],\"id\":\"ZHjmwdrKqg1PtRmgrUDUs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"I_MlRflahQIDYeyStAnY5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"AB4wuLmbRvSzfclVQOEX6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"9pOPahVy4OuAjcs3MHaLS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # 업로드할 COS 파일 경로 파일명 생성\"}],\"id\":\"Wde1pVQAIWHymSlgwQ9YA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" def generate_cos_key(ext=None):\"}],\"id\":\"0rN5PorjPV2LT_JzbOmIV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" date = datetime.datetime.now()\"}],\"id\":\"6BFS8ijiX-a3KxYItKqsu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ymd = date.strftime('%Y%m%d')\"}],\"id\":\"8uiCDcz4fSiudCzI3UIPu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" r = str(int(random.random() * 1000000)).zfill(6)\"}],\"id\":\"jf7npPqrYNgiH4uJ5qHov\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" cos_key = f\\\"file/{ymd}/{ymd}_{r}.{ext if ext else ''}\\\"\"}],\"id\":\"MumgeKckTMZGYb7ZPjVBY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return cos_key\"}],\"id\":\"nVRLdb4BTofOS0oLPUHM9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"IYNdYoEWhJ-LIXh5vNCsc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"G5f_T423FZJmZt3B4h0bH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" segments = config['filename'].split(\\\".\\\")\"}],\"id\":\"Ms0EClRdyUhaEUByTmzNx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ext = segments[-1] if segments else \\\"\\\"\"}],\"id\":\"t8ql7CT9Q7vcmIIgDYUI6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" key = generate_cos_key(ext)\"}],\"id\":\"yf728OoGhZfqgQ9LCV2bG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" resource = f\\\"qcs::cos:{config['region']}:uid/{config['appId']}:{config['bucket']}/{key}\\\"\"}],\"id\":\"lttZZZMAccyNrX7hpBcUy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"-g_Q3SlblvePeQY94nSrQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" condition = {}\"}],\"id\":\"NW_0d8aKxxD4z13caDOd_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"CjHrcGoNhv-UygytwoJFA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # 1. 업로드 파일 확장자 제한\"}],\"id\":\"g2XnaYN8w5JRioWkOvzke\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if permission[\\\"limitExt\\\"]:\"}],\"id\":\"hfNKRcX8ykOunbZtXlRIc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ext_invalid = not ext or ext not in permission[\\\"extWhiteList\\\"]\"}],\"id\":\"52BAhIpFwrHoCsUS5kYWU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if ext_invalid:\"}],\"id\":\"wshym8fqmHKrDAj7IxLcB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print('불법 파일, 업로드 금지')\"}],\"id\":\"aHNDMr7b2Iy2bS7vmkM4y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"tA7vaaP9Du5ypGgMmdJqi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # 2. content-type 파일 업로드 제한\"}],\"id\":\"LLcMmLaR18tPROrQ2iTZU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if permission[\\\"limitContentType\\\"]:\"}],\"id\":\"nHFVcmODFYS8pW190T4mg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" condition.update({\"}],\"id\":\"DXJR34xuPwVGazvv2rZt_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"string_like_if_exist\\\": {\"}],\"id\":\"airUY5hbSg3ahUOCOa6OI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # content-type이 이미지 유형인 경우에만 업로드 허용\"}],\"id\":\"i95Jdxs7zv4cJLBPT3TSk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:content-type\\\": \\\"image/*\\\"\"}],\"id\":\"N3eXqYDxdvURLyFOUS2AC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"USPCxSyyCiDC5AHUB---s\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" })\"}],\"id\":\"vhVFTmIk2TgJmCJ4So-or\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"uxmAPMcB7BG5WEqfki7gN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # 3. 업로드 파일 크기 제한\"}],\"id\":\"_GShirb_qWhpzdKX16bzf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if permission[\\\"limitContentLength\\\"]:\"}],\"id\":\"AItbQHQrlfd48CvZHZgsF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" condition.update({\"}],\"id\":\"FXuknbRwfr_NNyHRw6iLi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"numeric_less_than_equal\\\": {\"}],\"id\":\"GFtESpjRpRirNNl4JqsTU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # 업로드 크기는 최대 5MB로 제한됨(단순 업로드에만 적용됨)\"}],\"id\":\"P2F-d3JWDTiKGsFqCtJX_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cos:content-length\\\": 5 * 1024 * 1024\"}],\"id\":\"yo7xLL_bDmULzGA8I477i\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"KS0XPZvIiZsQCS35KrpZj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" })\"}],\"id\":\"Bsnt1thsXVshH7By-knEC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"Ih9kusuctyozvqsxfhMga\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"Y8lk3NpiuMJmBTEumL81L\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" def get_credential_demo():\"}],\"id\":\"UV_rJvEuIAH2THsJ3DhvY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credentialOption = {\"}],\"id\":\"h53b2y0eOBy2npdjuZZO4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # 임시 키 유효 기간(단위: 초)\"}],\"id\":\"eKg9SIt7Gm-_NgmwjFnqf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'duration_seconds': config.get('durationSeconds'),\"}],\"id\":\"MZ5bDwUtsqozTYn20FO8v\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'secret_id': config.get(\\\"secretId\\\"),\"}],\"id\":\"I7s91Bi2RHm63eR87DKgQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # 고정 키\"}],\"id\":\"A4sh3OnjCJgHwTnXZH-QD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'secret_key': config.get(\\\"secretKey\\\"),\"}],\"id\":\"CAawhxFiSm7u1zu05L89y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # 사용자의 bucket으로 변경\"}],\"id\":\"cMsN5J8GnOa07psa40x3R\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'bucket': config.get(\\\"bucket\\\"),\"}],\"id\":\"cTUjYdJlmEqwhFIJHh1_p\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'proxy': config.get(\\\"proxy\\\"),\"}],\"id\":\"6lwqRkYQJHC-sODAymntC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" # bucket이 위치한 리전으로 변경\"}],\"id\":\"fRm4Cq4TwfB5ZbpbDZutz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'region': config.get(\\\"region\\\"),\"}],\"id\":\"aAaAWCFZ3Lgy30Zm4KRMp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"policy\\\": {\"}],\"id\":\"2wUOsN245VVSQgwl8o0VA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"version\\\": '2.0',\"}],\"id\":\"9IAN0wllq2NnNflwNcsBM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"statement\\\": [\"}],\"id\":\"E0Owg7knGmDhfBr1OOob4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"ErsZ5jMS2KvYScht98Nza\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"action\\\": config.get(\\\"allowActions\\\"),\"}],\"id\":\"fB81MvAZnT1OqUIuPY9Bj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"effect\\\": \\\"allow\\\",\"}],\"id\":\"7-qRLih4DQ-Nw1K2hbP7G\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"resource\\\": [\"}],\"id\":\"n-qDCx6ixUY4_algYX_GY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" resource\"}],\"id\":\"db0EPhfEcDg-W0ouP4-Ya\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"KxQRYMj87jZ97ylsiD0jW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"condition\\\": condition\"}],\"id\":\"s0YiGo1vynw_wCeXsPasX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"RAEPsQFX_4RlSrX0p8o8y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ],\"}],\"id\":\"xFoPkvwsIhQDSVyyNj3gI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"seLXchtDox9WkgwAromR3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"xQUdPUj7LDjd7XpVof3Xs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"rtLPXvwKkREa-j6kXZS86\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" try:\"}],\"id\":\"n8UNVsMzX97BJ7ngCev6K\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"njv5JcWy_lGl7ZCWUNlyR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" sts = Sts(credentialOption)\"}],\"id\":\"DCa90AHvAo15tIsAE7v07\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" response = sts.get_credential()\"}],\"id\":\"HOt1_uLEfHGkQpco45Y2m\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credential_dic = dict(response)\"}],\"id\":\"dIFtDpXZoVOz4exhimHGv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credential_info = credential_dic.get(\\\"credentials\\\")\"}],\"id\":\"FtiHA3N2doaz3oB_2_5ap\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credential = {\"}],\"id\":\"3cCnS7Vx4MeJytzHJQtpL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"bucket\\\": config.get(\\\"bucket\\\"),\"}],\"id\":\"J02XfUkuOYcbBlDqYFMJj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"region\\\": config.get(\\\"region\\\"),\"}],\"id\":\"BJQncE3s2Wpog4eoTUWPy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"key\\\": key,\"}],\"id\":\"PfM9A3Pj4w4TBsGK4Wl3A\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"startTime\\\": credential_dic.get(\\\"startTime\\\"),\"}],\"id\":\"CALhaU7UXq0qS2DY7TOd0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"expiredTime\\\": credential_dic.get(\\\"expiredTime\\\"),\"}],\"id\":\"hjNQF7IGwIgSEOLwFCCAd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"requestId\\\": credential_dic.get(\\\"requestId\\\"),\"}],\"id\":\"_nMhqyt29GFuInBcWlZLl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"expiration\\\": credential_dic.get(\\\"expiration\\\"),\"}],\"id\":\"BJhTYCdWP5qOBVYY2A0y2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"credentials\\\": {\"}],\"id\":\"TbT5PYIDIHzSKc7DzjI1X\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"tmpSecretId\\\": credential_info.get(\\\"tmpSecretId\\\"),\"}],\"id\":\"f4piryyPlUAZ4nJ5lkRIk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"tmpSecretKey\\\": credential_info.get(\\\"tmpSecretKey\\\"),\"}],\"id\":\"YDV9qjlIUTHnrFZ0DnfsT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"sessionToken\\\": credential_info.get(\\\"sessionToken\\\"),\"}],\"id\":\"HDsyYJTJt6SNKOCMXw-G5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"VHLprEotvOZP6HdFp3ZGT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"_LNWnLosOdTYXifx5pVzU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return credential\"}],\"id\":\"NK9-zYV_RO1M0I_GYjCIb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" except Exception as e:\"}],\"id\":\"XtmFLuDfqSag_EWDrAr16\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print(e)\"}],\"id\":\"aLaA1fCjRAaDHnoH4P2KL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"wMVcB59jy5BJMmgFJPECH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"yuJ36I3TPb8CM8rzJf883\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" result = get_credential_demo()\"}],\"id\":\"HWI7_ljRfbhmJtWJgdCvk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credentials = result[\\\"credentials\\\"]\"}],\"id\":\"bN3usDtp77A5MInJMX1sf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" secret_id = credentials[\\\"tmpSecretId\\\"]\"}],\"id\":\"VkySqVGzOKB791WHrWUpU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" secret_key = credentials[\\\"tmpSecretKey\\\"]\"}],\"id\":\"3P2Pv9bHsKJAzF2h-MBkn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" token = credentials[\\\"sessionToken\\\"]\"}],\"id\":\"DAgzsqkXacWutVuyxWduY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" bucket = result[\\\"bucket\\\"]\"}],\"id\":\"BA615D2qxROI1aX4CuhMj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" region = result[\\\"region\\\"]\"}],\"id\":\"9CuZa1AIj9Ohx_pgsmGAa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" key = result[\\\"key\\\"]\"}],\"id\":\"gNerC9J-kcN3XR-guwK9x\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" expired = result[\\\"expiredTime\\\"]\"}],\"id\":\"0-MNEsKDemqvRtTDtwL5E\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"_Pl3VQVZh9s-NWLv-8-q5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token)\"}],\"id\":\"inlv4eErNHULIt4jEboUT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" client = CosS3Client(config)\"}],\"id\":\"OUpZi1l5jAfvpqkuarhUo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" sign = client.get_auth(Method='put',Bucket=bucket, Key=key, Expired=expired, Params={\"}],\"id\":\"_PxA-3wkhw6D9ikE9p7tA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'x-cos-security-token': token\"}],\"id\":\"zA8_Ye_9AdLk_juySiCuY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },SignHost=True)\"}],\"id\":\"leoyH2RyIzMLdYtSVogOl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" sign = urlencode(dict([item.split('=', 1) for item in sign.split('&')]))\"}],\"id\":\"SvmBV5yjpVv4puPWsA5C_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" host = \\\"https://\\\" + result[\\\"bucket\\\"] + \\\".cos.\\\" + result[\\\"region\\\"] + \\\".myqcloud.com\\\"\"}],\"id\":\"MTyNMYfp-R5B_VXXfSOWK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" response = {\"}],\"id\":\"gBaOEzTiENC_GgnXU175E\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cosHost\\\":host,\"}],\"id\":\"zfFsPmof4E0n0N9VwTnoA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"cosKey\\\":key,\"}],\"id\":\"1PPZoImPVD0dN-zEeg-Ce\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"authorization\\\":sign,\"}],\"id\":\"zglhOnS9byMlM-ysPE-fp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"securityToken\\\":token\"}],\"id\":\"f7YkCCVsKV5rjMlirXn4q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"eMdoMPuyvFVgOO6uEB-F_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print('get data : ' + json.dumps(response, indent=4))\"}],\"id\":\"2FtmC1zwSPe-BofXruZdx\",\"type\":\"code-line\"}],\"id\":\"tLp3z4fBgUojQ7FdMe8lx\",\"language\":\"python\",\"type\":\"code-block\"}],\"id\":\"5qNO2mptGm9J8ai_-aQ1O\",\"name\":\"Python\",\"type\":\"tab\"},{\"children\":[{\"children\":[{\"text\":\"전체 코드는 \"},{\"children\":[{\"text\":\"예제 코드\"}],\"id\":\"mUv8h5a5dfBNCBbKJqzok\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/tree/main/server/server-sign/java\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"wELaVNkgOlrN1leZiNU4c\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"package com.tencent.cloud;\"}],\"id\":\"O3SnAaz3JdVVvfTWFj07d\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"yCWE12BziXEMSwa_n6-AP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.qcloud.cos.COSClient;\"}],\"id\":\"q4jQ4VWiGpvzfLUiIVIqR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.qcloud.cos.ClientConfig;\"}],\"id\":\"BVfmDqzuD6cozWfyBjhrT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.qcloud.cos.auth.BasicSessionCredentials;\"}],\"id\":\"N-SFZXh4vqKAfRP812Fvu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.qcloud.cos.auth.COSCredentials;\"}],\"id\":\"m45AoZbrI1t-eb7ICcyOj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.qcloud.cos.http.HttpMethodName;\"}],\"id\":\"uakpA93JXNsfgBcD1fRmj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.qcloud.cos.region.Region;\"}],\"id\":\"FmvpOKYC6MRaxO_JFmHPh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import com.tencent.cloud.cos.util.Jackson;\"}],\"id\":\"CTRspdWbhjkEivJ4yIQOl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import org.junit.Test;\"}],\"id\":\"Qezar9xKbCXJ3EXSm7pBV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"OqaAGDFLL_8ZIADa01O8A\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import java.net.URL;\"}],\"id\":\"SvCEE5PB3r4N6DCEvKXTq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import java.text.SimpleDateFormat;\"}],\"id\":\"P-CBRs8wKHkUQJ3dI3fNm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import java.util.*;\"}],\"id\":\"jwBtfkM2BRITxGSZg6_Ba\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"oq_sGw63emCur2uTWjf6P\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"public class ServerSignTest {\"}],\"id\":\"KHRvwdlkKKmTUjTN1l0Cj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"TilDRh1eg6_rnYfBuOlLN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" public static String generateCosKey(String ext) {\"}],\"id\":\"N39hk7phcr1i2q_egFByv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Date date = new Date();\"}],\"id\":\"mZWpwfescvRNMaeU8KrnN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" SimpleDateFormat dateFormat = new SimpleDateFormat(\\\"yyyyMMdd\\\");\"}],\"id\":\"N64a9OI7yVFOafyUrDZYi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String ymd = dateFormat.format(date);\"}],\"id\":\"wHpAZDML95HMJGUvMNqkz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"gL0yTQLuzN14DTjnFq6_d\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Random random = new Random();\"}],\"id\":\"349jxkH5Yk9dXczCLdI36\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" int r = random.nextInt(1000000);\"}],\"id\":\"pJLTrWWVakp44PNIXQz6O\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String rStr = String.format(\\\"%06d\\\", r);\"}],\"id\":\"DeQryStFjYr8AONPYSi8o\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"gyUu_R2cbMA69teyER1TA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String cosKey = String.format(\\\"file/%s/%s_%s.%s\\\", ymd, ymd, rStr, ext != null ? ext : \\\"\\\");\"}],\"id\":\"hj-IldI6GcTbu65BPtG_n\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return cosKey;\"}],\"id\":\"As7kcr3gT04EtpmP_fSUD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"CjUnVzISjDSGqBbQoYfjp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"xyZrPQyr9w78a7knuy7LJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 구성 정보 획득\"}],\"id\":\"jZZY97cntqOS3_8e59QYs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" public TreeMap getConfig(){\"}],\"id\":\"eNygxsP5YT3QCz7NHbaUE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"ZL9_n2HosdnlwM2SZMqQV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String bucket = \\\"0-1250000000\\\";\"}],\"id\":\"3J1H169yJpjGvbhjjMWVB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String appId = \\\"1250000000\\\";\"}],\"id\":\"o3o4JuhhQq4w8-OMvSrlh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String filename = \\\"test.jpg\\\";\"}],\"id\":\"X7H9-FHOkexXpCwTBczsc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String region = \\\"ap-guangzhou\\\";\"}],\"id\":\"IbWzGBaYrtvESA0goVI0X\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String secretId = \\\"\\\";\"}],\"id\":\"euU2iF154ZEoDttOohb1r\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String secretKey = \\\"\\\";\"}],\"id\":\"KgH-N0e8IY2DyMLDHbKkJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String proxy = \\\"\\\";\"}],\"id\":\"NHMxDbd1iMnhK0pcYfPTG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" int durationSeconds = 1800;\"}],\"id\":\"bEOhLtgGyWYR_HHzXbPh6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"IEt8yocX-ZPhzSmWMUuok\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String[] segments = filename.split(\\\"\\\\\\\\.\\\");\"}],\"id\":\"utNzK10xiQvW5TpuF3_tt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String ext = segments.length > 0 ? segments[segments.length - 1] : \\\"\\\";\"}],\"id\":\"x75YgLILiAdybWv5LDGsl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"8TsWeyjtpAzc56kfO2efy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 임시 키 제한\"}],\"id\":\"y0tdbVoVgdz4Rbx7m-XLL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Boolean limitExt = false; // 업로드 파일 확장자 제한\"}],\"id\":\"0SI2VdeWFjzgPWpJfpXot\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" List extWhiteList = Arrays.asList(\\\"jpg\\\", \\\"jpeg\\\", \\\"png\\\", \\\"gif\\\", \\\"bmp\\\"); // 제한된 업로드 확장자\"}],\"id\":\"rvri71RIRp6Ko-5N1sJlK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Boolean limitContentType = false; // contentType 업로드 제한\"}],\"id\":\"EB_PmFjZ_5kB1mlkqo4lT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Boolean limitContentLength = false; // 업로드 파일 크기 제한\"}],\"id\":\"-4uvYxa1rCx2ATxsg7vAf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"pu6fv7cbk5KmKqDlju9j8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"yocWJ4QC4KkL78AKOdMMf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Map condition = new HashMap();\"}],\"id\":\"zvcaLk9lbpOmmqoG4l7Xi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"nVAjCrHpvxQv0C5nC5n85\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 1. 업로드 파일 확장자 제한\"}],\"id\":\"bnCF6__2oQKJOi9YLTOQD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (limitExt) {\"}],\"id\":\"qzWn8z3YCUbVzFrcLFFYh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" boolean extInvalid = ext == null || !extWhiteList.contains(ext);\"}],\"id\":\"7hfDKfa9kpRbGQ4imUkAG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (extInvalid) {\"}],\"id\":\"KDtvAEMaqPunUZ82frr1-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" System.out.println(\\\"불법 파일, 업로드 금지\\\");\"}],\"id\":\"l2qiMuKt1yYbQq6Kp0Cc6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return null;\"}],\"id\":\"CQq5ZyF1c_CcOKtGtGOgw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"ZdVAF7ZblI8ARvBJP4G3a\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"zrwEpgycUAYN92Rp9qXRm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"YJ5h3vatznBXzNMDifCeR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 2. content-type 파일 업로드 제한\"}],\"id\":\"T7YgqcaqWLPxoAYPtpF9J\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (limitContentType) {\"}],\"id\":\"GnxD9nXuj7KHVIS_MKWwM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" condition.put(\\\"string_like_if_exist\\\", new HashMap() {{\"}],\"id\":\"J1glATHwmCHhqj2m8gKtG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" put(\\\"cos:content-type\\\", \\\"image/*\\\");\"}],\"id\":\"ZmcdOJetjnR8NBbUKDYJK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }});\"}],\"id\":\"YP71TgXdItNiYRBb83VDP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"v5g0EgupF-okIpYHH3XJU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"f9qlz-BI3c_UWZpTsqAIF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 3. 업로드 파일 크기 제한(단순 업로드에만 적용됨)\"}],\"id\":\"vs0NUUHr6aUsIW8z87sDV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (limitContentLength) {\"}],\"id\":\"1Np1F__P_SKoRFHpT3yP9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" condition.put(\\\"numeric_less_than_equal\\\", new HashMap() {{\"}],\"id\":\"SDiRNCqqfNfC7bzTg_Q9V\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" put(\\\"cos:content-length\\\", 5L * 1024 * 1024);\"}],\"id\":\"OeRdjOtdFTi6dBngY34xR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }});\"}],\"id\":\"s1GPPFTuq5sX3-hdMwXma\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"aPSBSgzijzC5i8oI002pB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String key = generateCosKey(ext);\"}],\"id\":\"vEz19Mvni5NflMbCT0xDO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String resource = \\\"qcs::cos:\\\" + region + \\\":uid/\\\" + appId + ':' + bucket + '/' + key;\"}],\"id\":\"zDYkTXQcTYc6CcW_s1hzp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" List allowActions = Arrays.asList(\"}],\"id\":\"bs9q9SupggqVgtquGtTES\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 단순 업로드\"}],\"id\":\"90s4XiMl4jPK2VOca8xwH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\"\"}],\"id\":\"DXRToCTPtYNJMJUzOK9aj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" );\"}],\"id\":\"FUL7W7PmPN5tJYpikCB9k\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"uLIyJgV0v1igcS095FctF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // policy 구성\"}],\"id\":\"cMHmCK2HSW7baF7tRLscT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Map policy = new HashMap();\"}],\"id\":\"IjfpbeaxGHdqVNzohuiAG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" policy.put(\\\"version\\\", \\\"2.0\\\");\"}],\"id\":\"g6qQcv45I698vkRTkGB7i\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Map statement = new HashMap();\"}],\"id\":\"WLBy0deMV0HDaqaL2zYPa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" statement.put(\\\"action\\\", allowActions);\"}],\"id\":\"xbmXtLZr0Z-hm_iU9iXCk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" statement.put(\\\"effect\\\", \\\"allow\\\");\"}],\"id\":\"0wBuv0Jq__r12Q1IEdtYU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" List resources = Arrays.asList(\"}],\"id\":\"9_xRcclbTOctFf4AD0_3r\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" resource\"}],\"id\":\"UYH9XN_xnl2kaJhOlrhor\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" );\"}],\"id\":\"VFhRrZBh_rFVEJX7_XD9n\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" statement.put(\\\"resource\\\", resources);\"}],\"id\":\"v-Z6j_L9bbSi6BP7opVfV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" statement.put(\\\"condition\\\", condition);\"}],\"id\":\"Wj2wgbU5c-a5v4dzg7lR_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" policy.put(\\\"statement\\\", Arrays.asList(statement));\"}],\"id\":\"lLbUFFMcCcBuptAl8jrkH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"L7LJL0GVeaWJ8AlVMA9a4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"IUNT0VQeqyjrOSG6tOg7B\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // config 구성\"}],\"id\":\"T6pAuL8avBGeADsUiiO0W\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" TreeMap config = new TreeMap();\"}],\"id\":\"pfoswBGo2H4GXv3eXyGKj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"secretId\\\",secretId);\"}],\"id\":\"eGr-NKwSG_IOAc10TSJoD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"secretKey\\\",secretKey);\"}],\"id\":\"Nm1E_NhfwuCgPwEkxMYx_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"proxy\\\",proxy);\"}],\"id\":\"fgo39N-zgyQvbjjw9OCx-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"duration\\\",durationSeconds);\"}],\"id\":\"NZaHmDpDDlNw6oZDQNW3t\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"bucket\\\",bucket);\"}],\"id\":\"N25MZ7m7gxuc7KyKcUI77\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"region\\\",region);\"}],\"id\":\"9Gah9cS5DjnNIb_Jr6quF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"key\\\",key);\"}],\"id\":\"V8UY9MwejyK0K3VnSPh0T\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.put(\\\"policy\\\",Jackson.toJsonPrettyString(policy));\"}],\"id\":\"IDB2e9T5t5yGyAHXWniWA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return config;\"}],\"id\":\"Y4IumqJrTMzfatss7iedg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"0tUkvNxmg_WruDwAIJzxr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"C29UC7tuCDw14kr4G5zFC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" public TreeMap getKeyAndCredentials() {\"}],\"id\":\"YR8ZdY4Ic0jkTMZNFAf-S\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" TreeMap config = this.getConfig();\"}],\"id\":\"9FcQ_WjEtuSJM26zgyr67\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" try {\"}],\"id\":\"tZHdk1E_afrZB-SdchySx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Response response = CosStsClient.getCredential(config);\"}],\"id\":\"LB1mF46gYZGFME9p59zbH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" TreeMap credential = new TreeMap();\"}],\"id\":\"tvLGjem4eHkgotjt7TaGJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" TreeMap credentials = new TreeMap();\"}],\"id\":\"wBKlcdspYOVGgI9WxKvTx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credentials.put(\\\"tmpSecretId\\\",response.credentials.tmpSecretId);\"}],\"id\":\"1L17CLc8WZFQm7bOynUJm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credentials.put(\\\"tmpSecretKey\\\",response.credentials.tmpSecretKey);\"}],\"id\":\"g_ujALKuTXf4WabSm4733\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credentials.put(\\\"sessionToken\\\",response.credentials.sessionToken);\"}],\"id\":\"Xb38RNuLlBgzTsIeRes2s\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credential.put(\\\"startTime\\\",response.startTime);\"}],\"id\":\"L_ILOHw0YNMokPXDn8QAx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credential.put(\\\"expiredTime\\\",response.expiredTime);\"}],\"id\":\"JY-7PulXriqSe0iL8RMwb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credential.put(\\\"requestId\\\",response.requestId);\"}],\"id\":\"gUGlrkahTi-7W-C62w6Mt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credential.put(\\\"expiration\\\",response.expiration);\"}],\"id\":\"XZtb9HcRMvoYb4KnxZJkj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credential.put(\\\"credentials\\\",credentials);\"}],\"id\":\"7wuK5aeVvrJeUyvAM7i1G\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credential.put(\\\"bucket\\\",config.get(\\\"bucket\\\"));\"}],\"id\":\"vEj-Y9yDua0IsMrwtgjH2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credential.put(\\\"region\\\",config.get(\\\"region\\\"));\"}],\"id\":\"O-8FC0XmiYRJJ3zIt2lh1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credential.put(\\\"key\\\",config.get(\\\"key\\\"));\"}],\"id\":\"5k8GpYlohr9aEB5rdB-cq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return credential;\"}],\"id\":\"ESl367gc112FEBb8SPzyM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } catch (Exception e) {\"}],\"id\":\"QTR1MSvvaR9Z73B76AUqL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" e.printStackTrace();\"}],\"id\":\"eNY_mSB_Q8omsX-IYjxyy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw new IllegalArgumentException(\\\"no valid secret !\\\");\"}],\"id\":\"PYxDkSM62Jutg_DAbxix0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"Wu9BcH1IhSvahHZNQfa7d\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"R4Z_EUOgDWbUlz7AAV9wh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" /**\"}],\"id\":\"d8mgUGu_6htEV_JJg1UYt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" * 기본 임시 키 신청 예시, 한 버킷 내의 일련의 객체 경로에 대해 일괄적으로 일련의 작업 권한을 부여하는 데 적합함\"}],\"id\":\"FE2kpFdJEvgEMvPwN6yS6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" */\"}],\"id\":\"Fff3Hnstx51KXe6vQpynD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" @Test\"}],\"id\":\"Bao5yLI_ddLDghv72Sjfo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" public void testGetKeyAndCredentials() {\"}],\"id\":\"3BXwrJIyHvccmlwg7ZwfL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" TreeMap credential = this.getKeyAndCredentials();\"}],\"id\":\"nnfB4L7nt4HeG6VNZk7Ko\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" TreeMap credentials = (TreeMap) credential.get(\\\"credentials\\\");\"}],\"id\":\"1fr8ICvtW5rLW5r9ODJam\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" try {\"}],\"id\":\"l7TADcTUG8hqCHUyKHS8q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"UqvvSbDE8FUJhuJUDWkKO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"cxsUnuQ60V3xLVUXxRG3u\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String tmpSecretId = (String) credentials.get(\\\"tmpSecretId\\\");\"}],\"id\":\"cMgyMHzctmVDZsI4T8vn5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String tmpSecretKey = (String) credentials.get(\\\"tmpSecretKey\\\");\"}],\"id\":\"_0GJfs5kh5nOVSrgFqYtW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String sessionToken = (String) credentials.get(\\\"sessionToken\\\");\"}],\"id\":\"MOEQ8820z_2AJ3AXfjyH7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Date expiredTime = new Date((Long) credential.get(\\\"expiredTime\\\"));\"}],\"id\":\"-ANL_Ibu-puFiJP0Awp1T\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String key = (String) credential.get(\\\"key\\\");\"}],\"id\":\"LEkd9HQZN7YvqDvq4zRVw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String bucket = (String) credential.get(\\\"bucket\\\");\"}],\"id\":\"AP7YefmxF2c8qT4rjc5GR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String region = (String) credential.get(\\\"region\\\");\"}],\"id\":\"TIUxKdnB6qT1auNTM-I9P\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"ssW9ovcbUv-AlF0uaeIWm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" COSCredentials cred = new BasicSessionCredentials(tmpSecretId, tmpSecretKey, sessionToken);\"}],\"id\":\"GHJ3uIBlX2dfkiJZGL5E3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ClientConfig clientConfig = new ClientConfig();\"}],\"id\":\"qsKOsaoyPdlNgmqheDsJl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" clientConfig.setRegion(new Region(region));\"}],\"id\":\"Dg9Vs6N9DB3qU7SqUq2kU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"LXb2aX29YyMM2f1N7rIIv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" COSClient cosClient = new COSClient(cred, clientConfig);\"}],\"id\":\"6cqvquVoDO2xRloYJOCTe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"NngSAYgeBDSgHFAZbJiye\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"9dcLSwTRUfp7760l06fU7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Map headers = new HashMap();\"}],\"id\":\"Jn4o1P4LiubQ7Zsec0lOI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Map params = new HashMap();\"}],\"id\":\"82vNVtFOgiseCiB9PkUpK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" params.put(\\\"x-cos-security-token\\\",sessionToken);\"}],\"id\":\"7qTynV6W4474pxor4OUcz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" URL url = cosClient.generatePresignedUrl(bucket, key, expiredTime, HttpMethodName.PUT, headers, params);\"}],\"id\":\"yU0KNkFi9CClJ6HI-VcTG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String host = \\\"https://\\\" + url.getHost();\"}],\"id\":\"p_sfLB0ovjvT8g6V9FV-8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String query = url.toString().split(\\\"\\\\\\\\?\\\")[1];\"}],\"id\":\"O8O8a7RkkqqUMdId_0-R0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String sign = query.split(\\\"&x-cos-security-token\\\")[0];\"}],\"id\":\"smq6fFgh58BUgLJSpy0Ke\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" TreeMap result = new TreeMap();\"}],\"id\":\"ssDCvLC5Mqa_CgUI6VNp5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" result.put(\\\"cosHost\\\",host);\"}],\"id\":\"G6qDVrz7zCK99QVRhpCeF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" result.put(\\\"cosKey\\\",key);\"}],\"id\":\"PbBaURHAh-RawgkjEs8tY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" result.put(\\\"authorization\\\",sign);\"}],\"id\":\"xwh5P0FrQdjV7DWtje9PA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" result.put(\\\"securityToken\\\",sessionToken);\"}],\"id\":\"McwjRoaekr87rkN4XVWKs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" System.out.println(Jackson.toJsonPrettyString(result));\"}],\"id\":\"s2xQtiUxw5zl-VLnutKqI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } catch (Exception e) {\"}],\"id\":\"As7OODzZCuZD6HkyISG0O\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\t e.printStackTrace();\"}],\"id\":\"Lo-4E7cD8-BJPh57WhK1W\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw new IllegalArgumentException(\\\"no valid sign !\\\");\"}],\"id\":\"E2aM_U9eRwS4q6GeQjZLX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"kjmSiN41B_tDnqS2VkKot\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"Hovf2bmIT_2bS1-QY_6v9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"64c_r0r-EzpcvIg2ZYRZT\",\"type\":\"code-line\"}],\"id\":\"dUzUQa0cIit6cQYO6cR9j\",\"language\":\"java\",\"type\":\"code-block\"}],\"id\":\"2h9HePpVEpN1shtvT1jX5\",\"name\":\"Java\",\"type\":\"tab\"},{\"children\":[{\"children\":[{\"text\":\"전체 코드는 \"},{\"children\":[{\"text\":\"예제 코드\"}],\"id\":\"Nd8lNAfSpmI9M7Eiy_hVA\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/cos-demo/tree/main/server/server-sign/dotnet\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"vT2OT5H6Kv9_2FFZVr1xp\",\"type\":\"p\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"\"}],\"id\":\"MwzIy2KEgPOihDWSY0xZ2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using System;\"}],\"id\":\"wIBFIaNaAb2DvyMe0JIyk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using System.Collections.Generic;\"}],\"id\":\"GG86wqFhFQtDez6Yge-st\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using System.IO;\"}],\"id\":\"q8Riwzf9RiqAmoI4zl-Bj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using System.Linq;\"}],\"id\":\"ErNWhVFngSfTCArLaValU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using System.Reflection;\"}],\"id\":\"XRCwvjizhPwdOxju4-UQI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using System.Text;\"}],\"id\":\"kTgtIWhmzaq-_SHXAeO5M\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using System.Threading;\"}],\"id\":\"r1mtCfIEGZdizc6enmgvr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using System.Threading.Tasks;\"}],\"id\":\"ib7Ebkqzd2NAicbsY0y5d\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using System.Net.Mail;\"}],\"id\":\"8E1o-gEjg4oCdpKrHDrLi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using COSSTS;\"}],\"id\":\"gqCHTOFn8JrZAz_ZUEb-c\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using COSXML;\"}],\"id\":\"gvrUKjFYIDGrLWxFLEd25\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using COSXML.Auth;\"}],\"id\":\"amJhLWJ6NeLfH5BNPBkRr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using COSXML.Model.Tag;\"}],\"id\":\"Ht98Aaew4cpTdobvmnX-2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using Newtonsoft.Json;\"}],\"id\":\"eAxEbo1iEEKo2ISY7F2b6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"using Formatting = System.Xml.Formatting;\"}],\"id\":\"8srM8y2MnNjAOKFm6fsxw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"Y07giUmNGcAsQnWFZQyjE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"akM-kDEMKSti6n35bVrGK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"namespace COSSnippet\"}],\"id\":\"gIhY3fHO5srGMGsrNZhWt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"{\"}],\"id\":\"aTVeuAXX1jato1xpBQvao\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" public class ServerSign\"}],\"id\":\"ZRTnCe_7uDXF8ElbMz-au\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"JdWmTasgosYOwnZpnD_SI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //영구 키\"}],\"id\":\"arGTC7M7h2w0nNt6QPmTh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string secretId = \\\"\\\";\"}],\"id\":\"ERwQQvgU1qeaqwC_D7KzQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string secretKey = \\\"\\\";\"}],\"id\":\"rs9r7hUeKf4vKCJKICMHt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"8lNs_lm5041VRgHEQgRQl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string bucket = \\\"bucket-1250000000\\\";\"}],\"id\":\"nhc1jYZyLOf_moYj317to\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string appId = \\\"1250000000\\\";\"}],\"id\":\"umyAMG7B8aXR2dF50mHJR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string region = \\\"ap-guangzhou\\\";\"}],\"id\":\"SFj00JaTjFtkLA-17qq54\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string filename = \\\"test.jpg\\\";\"}],\"id\":\"ixioCf7HowktPmLMPFMKC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string method = \\\"put\\\";\"}],\"id\":\"WHUX-x-w9zh-6-IroJ69X\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" int time = 1800;\"}],\"id\":\"NMNhKk5HUqv-NCNLg-gBx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"YbVakFYljjX7fiwJrV8X1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 제한\"}],\"id\":\"RrqCP0GndM_CYr1ewmgYp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Boolean limitExt = false; // 업로드 파일 확장자 제한\"}],\"id\":\"B9AyH5lLuQwmCJoL4X9wz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" List extWhiteList = new List { \\\"jpg\\\", \\\"jpeg\\\", \\\"png\\\", \\\"gif\\\", \\\"bmp\\\" }; // 제한된 업로드 확장자\"}],\"id\":\"eaVUpbo5v-CgFmZazLLYd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Boolean limitContentType = false; // contentType 업로드 제한\"}],\"id\":\"AQ-I-DZvJbyZlV1io_cXD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Boolean limitContentLength = false; // 업로드 파일 크기 제한\"}],\"id\":\"Vr9gSk9PGczzN7KTa-kD5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"2nMWD2uRviekb-QdGJDow\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"miDcXE3421y5xqLUgynKF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" public string generateCosKey(string ext)\"}],\"id\":\"qopQ8trJbibAV6fKUGEi6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"6AJJfhMb-7QSTFBcENZHl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" DateTime date = DateTime.Now;\"}],\"id\":\"YdAEJPWniDEhDETdHKWGa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" int m = date.Month;\"}],\"id\":\"jMQhjz2QPCZ6ndtU2NbJt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string ymd = $\\\"{date.Year}{(m < 10 ? $\\\"0{m}\\\" : m.ToString())}{date.Day}\\\";\"}],\"id\":\"CtU2rj3-p0K4P61SIym1O\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"8wEuvVw225TRB0e1h6M1J\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Random random = new Random();\"}],\"id\":\"ZatQaHto72ZrkSqU16JDr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string r = random.Next(0, 1000000).ToString(\\\"D6\\\"); // 6자리 난수 생성, 앞에 0으로 채움\"}],\"id\":\"5YB2joELPIrouI5rXyrZn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"C3GiV5SBxGHSqeP3JxpVR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string cosKey = $\\\"file/{ymd}/{ymd}_{r}.{(string.IsNullOrEmpty(ext) ? \\\"\\\" : ext)}\\\";\"}],\"id\":\"t_JHap3V4AD6mSgT-USiZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return cosKey;\"}],\"id\":\"fUVDpuyj9mDd84Yc8ErHv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"8alT6B5BIK7yYqQVQyGc_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"MArxyt8UCz37QhdlaxlAP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" public Dictionary getConfig()\"}],\"id\":\"oYbl5uP3CQnFld5GoC6cl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"KbToyRkOrIxnd4KHx-7CJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Dictionary config = new Dictionary();\"}],\"id\":\"Rvs8EYQ5L7gyHVNhVqCmj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string[] allowActions = new string[] { // 허용되는 작업 범위, 여기서는 업로드 작업을 예로 들었습니다.\"}],\"id\":\"3e8jsX5m783atxP27fshJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"name/cos:PutObject\\\"\"}],\"id\":\"1-w94-QJP1azh7glwnvF1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"CugQrQQetuj6fFsYBIBBp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"b1wk8D_LPeoF5ayxvvos6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string[] segments = filename.Split(\\\".\\\");\"}],\"id\":\"CCbEYZUSgnjvCxeMFuRCY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string ext = segments.Length > 0 ? segments[segments.Length - 1] : string.Empty;\"}],\"id\":\"DvhqTYSXqgaKOG1PP9Ebx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string key = generateCosKey(ext);\"}],\"id\":\"4OW5wYzVBSoXUQWr4JQRK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string resource = $\\\"qcs::cos:{region}:uid/{appId}:{bucket}/{key}\\\";\"}],\"id\":\"q0wNPpLpGazk-l7UyZu-s\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"y-oRxzHCRyezqaSHqAOtr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var condition = new Dictionary();\"}],\"id\":\"X92uS6Ij6kqUdP-ejZ52u\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"OoqSDu1JE_8pQGI2mmj_v\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 1. 업로드 파일 확장자 제한\"}],\"id\":\"3gWW4k6w0DCIaSJ_uJ-oP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (limitExt)\"}],\"id\":\"W8CODxdhzIXQvTmRAvN-D\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"BoBKloyvmmE-ietxrxmtG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var extInvalid = string.IsNullOrEmpty(ext) || !extWhiteList.Contains(ext);\"}],\"id\":\"umpfxPEGpCFeHOsKkXzTt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (extInvalid)\"}],\"id\":\"vwWOpvEL7tFdO7Zfyd9Cs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"sdcmR4Izy69HGhQAUrrac\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Console.WriteLine(\\\"불법 파일, 업로드 금지\\\");\"}],\"id\":\"A1qPHJfcQUTdK9K_LtBAY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return null;\"}],\"id\":\"Dsb7buPiNiBgZgZGh--mn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"xBQL0Xa1mqSQ1J5LqcpCJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"PivKsrGyZquXWx1UYcqXp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"wQEu_yPlNdl_o_7A8bdua\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 2. content-type 파일 업로드 제한\"}],\"id\":\"j4erXwI7rsF-CQkK8o9hD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (limitContentType)\"}],\"id\":\"r5yEEKOB9imuNosFve5om\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"rgZ5STuxWwVIUC9Y1_iBt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" condition[\\\"string_like_if_exist\\\"] = new Dictionary\"}],\"id\":\"dk-a1azJY_R6YjqjlMWbX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"vSL-u6PHx06w80uVPlB_h\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" { \\\"cos:content-type\\\", \\\"image/*\\\" } // content-type이 이미지 유형인 경우에만 업로드 허용\"}],\"id\":\"lR5RNleOGnuGUYMM1yYnv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"0tCJ5wImNzjDZST0lZJNx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"64xnTu5--_yEIfUl5KisM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"VVdGzfbwCaln6dhI6gBea\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 3. 업로드 파일 크기 제한(간단한 업로드에만 적용됨)\"}],\"id\":\"HVg2UztyfSjvuiHNVLzEm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (limitContentLength)\"}],\"id\":\"8fJMgh-tBIFABCCUmwEAs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"wb4jvUALmXDvESqCJKOb7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" condition[\\\"numeric_less_than_equal\\\"] = new Dictionary\"}],\"id\":\"qUfrTv8uExqUGZxJLuafT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"nchsxJ0DI9OnSCM_K0nxH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" { \\\"cos:content-length\\\", 5 * 1024 * 1024 } // 업로드 크기는 최대 5MB로 제한됨\"}],\"id\":\"FK0anE2cBijSgJcLd6o54\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"Zm6nr9fwEztfuY5Ohxo-D\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"7ShRLnRWNsbxEr1DpAfcr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"bzpYTESeMj1uZUKIkHM1g\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var policy = new Dictionary\"}],\"id\":\"2lbUv0nS0VhOGK0Y_KJac\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"rh4vhE-_uPQWmlEV99eJC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" { \\\"version\\\", \\\"2.0\\\" },\"}],\"id\":\"5l1Yr_jijaCafNaOes0BD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" { \\\"statement\\\", new List>\"}],\"id\":\"FUPzJ9DtFD7yK3gKOOsWp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"3I_Qh3TUqgj_Waj3bZV6K\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" new Dictionary\"}],\"id\":\"GqP3PBS2otTRnw6C4KiQg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"ooIVFceFkb8FXgoDMufB4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" { \\\"action\\\", allowActions },\"}],\"id\":\"XUlTmOOQ4QC8aDe6UHpKP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" { \\\"effect\\\", \\\"allow\\\" },\"}],\"id\":\"WUfZWtsMhF15-PMXEK-OC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" { \\\"resource\\\", new List\"}],\"id\":\"7N3LCsD1cYGA3RbEzUvgx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"Gf-H_RvOQIpJuJnu5NWsi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" resource,\"}],\"id\":\"LqgKILxTk9yfQVKjxaFEu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"feXnxPJpreUrMFoNcg9GA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"K_wx0L_16KAr6YElOjuRe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" { \\\"condition\\\", condition }\"}],\"id\":\"SExuHC-6sXAi9PFMEXg62\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"BNlVQL00VHXwnNxac6XGN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"tJtZ1FBmEQdGo0c7kwSGw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"hnk1j9MbAwBb9ZiciV-k2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"7pKuQ70LqhDhmxIN4ZtSx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"FNLjO4eTzCxPsiVpQkA10\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // JSON으로 직렬화하여 출력\"}],\"id\":\"1aBNyNRRS0McSOtnc3n9A\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string jsonPolicy = JsonConvert.SerializeObject(policy);\"}],\"id\":\"1mIoRTPS1Fv2l472uVGbo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"7yTKxH2HYyPJGdgMM_ObF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.Add(\\\"bucket\\\", bucket);\"}],\"id\":\"lmeHE1oMAq7IluNa2rcoH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.Add(\\\"region\\\", region);\"}],\"id\":\"kWGpsj_rMAs0funaJF1Sb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.Add(\\\"durationSeconds\\\", time);\"}],\"id\":\"4HwasT1zLJa8gKq5ACH63\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"JHOUyq1arr-bPXxd7zFW8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.Add(\\\"secretId\\\", secretId);\"}],\"id\":\"c8m-1vCXb-v8nDribHNv1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.Add(\\\"secretKey\\\", secretKey);\"}],\"id\":\"9zjjA8Vmd0lrzJoNjP9Nc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.Add(\\\"key\\\", key);\"}],\"id\":\"765nhDqVBTiYqae9dycfA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" config.Add(\\\"policy\\\", jsonPolicy);\"}],\"id\":\"71S-L0K5PKkqZMwH4C1p6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return config;\"}],\"id\":\"xqvClqep-ASzGipEQehPL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"uudeqwKyGhtjyps-zkbhn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"VTvnahS_BRGxXL5SiHrXm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 연합 신원 임시 접근 자격 증명 획득 https://cloud.tencent.com/document/product/1312/48195\"}],\"id\":\"4wl9I8Oz4S_Op1_TYVo9a\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" public Dictionary GetCredential()\"}],\"id\":\"lMx66xiVW67nXQIASEUyo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"GXtRSLLdalAPCZaY39557\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"f9o0-DUNqhQbT5Qx3xigK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" var config = getConfig();\"}],\"id\":\"wGeYnq9qoIJ3b7lagYopU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //임시 키 획득\"}],\"id\":\"EQvZYSlcDSDcItkJu62z2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Dictionary credential = STSClient.genCredential(config);\"}],\"id\":\"nKhg1rHA2pFls0-pFsz-y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Dictionary credentials = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject((object) credential[\\\"Credentials\\\"]));\"}],\"id\":\"F5rEC17E7sFrpcQqKmitt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Dictionary credentials1 = new Dictionary();\"}],\"id\":\"QZs4GCYRlA9NkSTp37lWF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credentials1.Add(\\\"tmpSecretId\\\",credentials[\\\"TmpSecretId\\\"]);\"}],\"id\":\"8CIchm72NoJwGNG-bFyNX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credentials1.Add(\\\"tmpSecretKey\\\",credentials[\\\"TmpSecretKey\\\"]);\"}],\"id\":\"mH5bwiVfGC5v1fF193aWy\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" credentials1.Add(\\\"sessionToken\\\",credentials[\\\"Token\\\"]);\"}],\"id\":\"FZ9lgeAt72YxUDhSa1VB_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Dictionary dictionary1 = new Dictionary();\"}],\"id\":\"8wzEpYzOteSz5-iGLcjrB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" dictionary1.Add(\\\"credentials\\\",credentials1);\"}],\"id\":\"PVYy0e8K0WN174o56hgxg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" dictionary1.Add(\\\"startTime\\\",credential[\\\"StartTime\\\"]);\"}],\"id\":\"IFhNqtxm8vn836k8No1b-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" dictionary1.Add(\\\"requestId\\\",credential[\\\"RequestId\\\"]);\"}],\"id\":\"maNGRqVb6ANvOCJSrOd0h\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" dictionary1.Add(\\\"expiration\\\",credential[\\\"Expiration\\\"]);\"}],\"id\":\"-f5KaN0ASgWe5swfv6Rd1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" dictionary1.Add(\\\"expiredTime\\\",credential[\\\"ExpiredTime\\\"]);\"}],\"id\":\"6gGFwYpmlpYk79-84kPFu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" dictionary1.Add(\\\"bucket\\\",config[\\\"bucket\\\"]);\"}],\"id\":\"Oo5vQV8AkrybpQa-KYJD0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" dictionary1.Add(\\\"region\\\",config[\\\"region\\\"]);\"}],\"id\":\"JHNw6LPVxZ1cwKUXmdVIX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" dictionary1.Add(\\\"key\\\",config[\\\"key\\\"]);\"}],\"id\":\"x88aPX1nlZ5Ax71Sxrmot\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return dictionary1;\"}],\"id\":\"jqgwm-vKOdjvyOQchd5kd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"J-_16C7XgEv0jjppX6FEa\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" static void Main(string[] args)\"}],\"id\":\"4fMaG8FzBQMcVjeVRdXc5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" {\"}],\"id\":\"PrHbOj21C-ZPQzxkt-RLS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" ServerSign m = new ServerSign();\"}],\"id\":\"I3Uzkcl91bRo_9wYYlbwK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Dictionary result = m.GetCredential();\"}],\"id\":\"l4mePC1zkgk8mRCw_mald\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Dictionary credentials = (Dictionary)result[\\\"credentials\\\"];\"}],\"id\":\"TBVlegWKosdkCHaGcTMmS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string tmpSecretId = (string)credentials[\\\"tmpSecretId\\\"];\"}],\"id\":\"zfHSwsSc7kSTTARfCzgRr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string tmpSecretKey = (string)credentials[\\\"tmpSecretKey\\\"];\"}],\"id\":\"5uZouw7Cvs8maxLFJQIKU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string sessionToken = (string)credentials[\\\"sessionToken\\\"];\"}],\"id\":\"s7jgXQKHuFq0qRmsx3NPT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string bucket = (string)result[\\\"bucket\\\"];\"}],\"id\":\"vim8wsxzoOoyBjrG7AEit\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string region = (string)result[\\\"region\\\"];\"}],\"id\":\"uNt7KNTd3UsS4RMeWBY_t\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string key = (string)result[\\\"key\\\"];\"}],\"id\":\"66I6CcA9Yjr_72PC9PiM7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" long expiredTime = (long)result[\\\"expiredTime\\\"];\"}],\"id\":\"JqDCbdftuVh0LVJtgOjy9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" int startTime = (int)result[\\\"startTime\\\"];\"}],\"id\":\"yc9mUrXOkr1XI6HC8dFul\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"J_22mPwZe8HKoa3myYLXJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" QCloudCredentialProvider cosCredentialProvider = new DefaultSessionQCloudCredentialProvider(\"}],\"id\":\"B6cnb9-mSUy9zZFfL16tK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" tmpSecretId, tmpSecretKey, expiredTime, sessionToken);\"}],\"id\":\"OZNXz0Ly6dMiy3PbBp2nI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"mSpJWA-vV7_WHCCumZ00c\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" CosXmlConfig config = new CosXmlConfig.Builder()\"}],\"id\":\"eCXvbXB6hmwW5L8KSrtcT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .IsHttps(true) //기본 HTTPS 요청 설정\"}],\"id\":\"lN-MQHqhvqYHcTudJzlk4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .SetRegion(region) //기본 버킷 리전 설정\"}],\"id\":\"p-vwxV5k_sF3wR0pqIdgo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .SetDebugLog(true) //로그 표시\"}],\"id\":\"N6bZdu1wxUOFDbWLBvNU-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .Build(); // CosXmlConfig 객체 생성\"}],\"id\":\"HAG1q5bFDQ0JkN2ZO5e43\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" CosXml cosXml = new CosXmlServer(config, cosCredentialProvider);\"}],\"id\":\"bHfstQa2qLo-TKdC3SLe-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"fPhCpNpX0FUBqINjYdH7w\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" PreSignatureStruct preSignatureStruct = new PreSignatureStruct();\"}],\"id\":\"WP2DphsNtJv1QpdOkpeOn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"w-tQFlWLVnblw_EZb4cB1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" preSignatureStruct.appid = m.appId;//\\\"1250000000\\\";\"}],\"id\":\"b0TUWQHLkQREgAOFMdlol\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"s7qvKHMRTxRlgv17JBf4b\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" preSignatureStruct.region = region;//\\\"COS_REGION\\\";\"}],\"id\":\"g-gSLWRTbTWmKxUJfAfkl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \"}],\"id\":\"T4Bh6ShEHb5kcf3Tson2Z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" preSignatureStruct.bucket = bucket;//\\\"examplebucket-1250000000\\\";\"}],\"id\":\"ZOK9d5ZebGeZJH4S3nlvt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" preSignatureStruct.key = \\\"exampleObject\\\"; // 객체 키\"}],\"id\":\"2xKBonGNYJ4GvilHGMYz1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" preSignatureStruct.httpMethod = \\\"PUT\\\"; // HTTP 요청 방법\"}],\"id\":\"UIDSF_8VlseNrvpI3RS7e\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" preSignatureStruct.isHttps = true; // HTTPS 요청 URL 생성\"}],\"id\":\"4etebxGCQfhoJKdk1PgME\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" preSignatureStruct.signDurationSecond = 600; // 요청 서명 시간은 600초\"}],\"id\":\"xXrcmKTweupFJaZKYN9bb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" preSignatureStruct.headers = null; // 서명에서 검증해야 할 header\"}],\"id\":\"dl0I5CFA_vvPk-Rvox3kq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" preSignatureStruct.queryParameters = null; // 서명에서 검증해야 할 URL의 요청 매개변수\"}],\"id\":\"PL2PtVoKrFpwjy1FSJem2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //사전 서명 URL 업로드(영구 키 방식으로 계산된 서명 URL)\"}],\"id\":\"SXGDfL9MtZfMdYVQJo0S2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Dictionary queryParameters = new Dictionary();\"}],\"id\":\"PO3XQL-uyohdfZEG0m0L2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" queryParameters.Add(\\\"x-cos-security-token\\\",sessionToken);\"}],\"id\":\"vVhkQRjwXWynskGYtwFLf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Dictionary headers = new Dictionary();\"}],\"id\":\"5tw4ZvHzeFUw7CGCSXly8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string authorization = cosXml.GenerateSign(m.method,key,queryParameters,headers,expiredTime - startTime,expiredTime - startTime);\"}],\"id\":\"HduGtD4z27CFmu2jpEGwj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"s0t9MHCoXe_MeH5iCW9R8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" string host = \\\"https://\\\" + bucket + \\\".cos.\\\" + region + \\\".myqcloud.com\\\";\"}],\"id\":\"mpqBO6QcG-B_zvl-W6snO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Dictionary response = new Dictionary();\"}],\"id\":\"pds6JI3HUwCCU1RiFIVxN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" response.Add(\\\"cosHost\\\",host);\"}],\"id\":\"udx7Y303tqtbEmDo3GwBl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" response.Add(\\\"cosKey\\\",key);\"}],\"id\":\"dtbYTaiex2YCBkkgYZ37N\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" response.Add(\\\"authorization\\\",authorization);\"}],\"id\":\"30847jvcxJYfJjR_TZUtV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" response.Add(\\\"securityToken\\\",sessionToken);\"}],\"id\":\"HW-79nM5tpG6et5ZAJdFD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Console.WriteLine($\\\"{JsonConvert.SerializeObject(response)}\\\");\"}],\"id\":\"bplqra9JCWJO6dMP1-izP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"eteVQNJosD7JCsDifw8gQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"FXCPXn9mUWi_8qUqsNFgc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"kherBDItLCq5vKANnSYWI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"y5wuhyLsmfyxXMhIlErsJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"B2oKW1kMqMQiKDiIDYJ0w\",\"type\":\"code-line\"}],\"id\":\"jeZyC1N7pMyuxM2hGsAkm\",\"language\":\"csharp\",\"type\":\"code-block\"}],\"id\":\"oqcriqY37uaFvzkDLoQxS\",\"name\":\".NET(C#)\",\"type\":\"tab\"}],\"id\":\"JYjLKtVSgHzIoAmFAMDbI\",\"type\":\"tabs\"},{\"children\":[{\"text\":\"\"}],\"id\":\"uRVehUAeE5wgTvE_MM82M\",\"type\":\"p\"}]"}},"73581":{"categoryId":436,"weight":59,"type":"page","extension":"","pid":33419,"id":73581,"lang":"ko","title":"COS_HarmonyOS 직접 업로드 사례","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2025-09-19 18:43:53","recentReleaseTime":"2025-09-19 18:43:53","content":{"title":"COS_HarmonyOS 직접 업로드 사례","body":"

소개

본 문서는 SDK에 의존하지 않고 간단한 코드로 HarmonyOS에서 COS(Cloud Object Storage)의 버킷으로 파일을 직접 업로드하는 방법을 설명합니다.
주의:
본 문서의 내용은 XML 버전의 API를 기반으로 합니다.

전제 조건

COS 콘솔에 로그인하여 버킷을 생성하고 Bucket(버킷 이름)과 Region(리전 이름)을 획득하세요. 자세한 내용은 버킷 생성을 참고하십시오.
CAM 콘솔에 로그인하여 프로젝트 SecretId와 SecretKey를 획득합니다.

작업 절차

전체 단계는 다음과 같습니다:
1. 클라이언트가 서버 인터페이스를 호출하여 파일 확장자를 전달하면, 서버는 확장자와 타임스탬프 등을 기반으로 cos key와 직접 업로드 url을 생성합니다.
2. 서버는 STS SDK를 통해 임시 키를 획득합니다.
3. 서버는 획득한 임시 키로 직접 업로드 url에 서명하고 url, 서명, 토큰 등의 정보를 반환합니다.
4. 클라이언트는 절차 3에서 획득한 정보를 바탕으로 직접 put 요청을 보내며, 서명과 토큰 등을 헤더에 포함하여 업로드합니다.
구체적인 코드는 HarmonyOS 예제를 참고하십시오.

서버 서명 구현 구성

주의:
정식 배포 시 서버에는 귀하의 웹사이트 자체 권한 검증 단계를 추가해야 합니다.
보안상의 이유로 서버드는 임시 키를 획득한 후 직접 업로드 url을 생성하고 즉시 서명해야 합니다. 자세한 내용은 서버 서명 사례을 참고하십시오.
구체적인 절차는 다음과 같습니다.
1. STS SDK를 통해 임시 키를 획득합니다.
2. 확장자에 따라 cos key와 직접 업로드 url을 생성합니다.
3. 임시 키를 사용하여 직접 업로드 url에 서명하고 직접 업로드 url, 서명, 토큰 등의 정보를 반환합니다.
서버 구성 절차:
1. 키, bucket 및 region을 구성합니다.
var config = {
// Tencent Cloud 키를 획득합니다. 제한된 권한을 가진 서브 사용자의 키 사용을 권장합니다. https://console.tencentcloud.com/cam/capi
secretId: process.env.COS_SECRET_ID,
secretKey: process.env.COS_SECRET_KEY,
// 키 유효 기간
durationSeconds: 1800,
// 여기에 버킷 및 리전을 입력합니다. 예: test-1250000000, ap-guangzhou
bucket: process.env.PERSIST_BUCKET,
region: process.env.PERSIST_BUCKET_REGION,
// 제한된 업로드 확장자
extWhiteList: ['jpg', 'jpeg', 'png', 'gif', 'bmp'],
};
2. 터미널 실행
npm install
3. 서비스 시작
node app.js
여기까지 서버가 성공적으로 시작되었으며, 클라이언트 프로세스를 시작할 수 있습니다.
다른 언어 또는 자체 구현이 필요한 경우 다음 프로세스를 참조할 수 있습니다.
1. 서버에서 임시 키를 획득합니다. 서버는 먼저 고정 키 SecretId, SecretKey를 사용하여 STS 서비스에서 임시 키를 획득하고, 임시 키 tmpSecretId, tmpSecretKey, sessionToken을 획득합니다. 자세한 내용은 임시 키 생성 및 사용 가이드 또는 cos-sts-sdk를 참고하십시오.
2. 직접 업로드 url에 서명하여 authorization을 생성합니다.
3. 직접 업로드 url, authorization, sessionToken 등의 정보를 반환하며, 클라이언트가 파일을 업로드할 때 획득한 서명과 sessionToken을 각각 요청 헤더의 authorization 및 x-cos-security-token 필드에 넣습니다.

HarmonyOS 업로드 예시

1. 서버에서 직접 업로드 및 서명 정보를 요청합니다.
import http from '@ohos.net.http';

/**
* 직접 업로드 url 및 서명 등 획득
*
* @param ext 파일 확장자. 직접 업로드 시 서버드에서 확장자에 따라 cos key 생성
* @return 직접 업로드 url 및 서명 등
*/
public static async getStsDirectSign(ext: string): Promise<Object> {
// 각 httpRequest는 하나의 HTTP 요청 작업에 해당하며 재사용할 수 없음
let httpRequest = http.createHttp();
//직접 업로드 서명 비즈니스 서버 url(정식 환경에서는 정식 직접 업로드 서명 비즈니스 url로 교체해 주세요)
//직접 업로드 서명 비즈니스 서버 코드 예제는 다음을 참고하세요: https://github.com/tencentyun/cos-demo/blob/main/server/direct-sign/nodejs/app.js
let url = "http://127.0.0.1:3000/sts-direct-sign?ext=" + ext;
try {
let httpResponse = await httpRequest.request(url, { method: http.RequestMethod.GET });
if (httpResponse.responseCode == 200) {
let result = JSON.parse(httpResponse.result.toString())
if (result.code == 0) {
return result.data;
} else {
console.info(`getStsDirectSign error code: ${result.code}, error message: ${result.message}`);
}
} else {
console.info("getStsDirectSign HTTP error code: " + httpResponse.responseCode);
}
} catch (err) {
console.info("getStsDirectSign Error sending GET request: " + JSON.stringify(err));
} finally {
// 해당 요청 사용이 완료되면 destroy 메서드를 호출하여 직접 파기합니다.
httpRequest.destroy();
}
return null;
}
2. 획득한 직접 업로드 및 서명 정보를 사용하여 파일 업로드를 시작합니다.
import http from '@ohos.net.http';
import promptAction from '@ohos.promptAction'
import fs from '@ohos.file.fs';
import request from '@ohos.request';
import common from '@ohos.app.ability.common';
import { MediaBean } from '../bean/MediaBean';
import { MediaHelper } from './MediaHelper';

/**
* 파일 업로드(uploadTask로 구현)
* @param context context
* @param media 미디어 파일
*/
public static async uploadFileByTask(context: common.Context, media: MediaBean, progressCallback: (uploadedSize: number, totalSize: number) => void) {
// 직접 업로드 서명 등 정보 획득
let ext = MediaHelper.getFileExtension(media.fileName);
let directTransferData: any = await UploadHelper.getStsDirectSign(ext);
if (directTransferData == null) {
promptAction.showToast({ message: 'getStsDirectSign fail' });
return;
}

// 비즈니스 서버에서 반환된 업로드 정보
let cosHost: String = directTransferData.cosHost;
let cosKey: String = directTransferData.cosKey;
let authorization: String = directTransferData.authorization;
let securityToken: String = directTransferData.securityToken;

// 업로드 url 생성
let url = `https://${cosHost}/${cosKey}`;
try {
// uri 파일을 cacheDir에 복사(request.uploadFile은 internal: 유형의 경로만 허용)
let file = await fs.open(media.fileUri, fs.OpenMode.READ_ONLY);
let destPath = context.cacheDir + "/" + media.fileName;
await fs.copyFile(file.fd, destPath);
let realuri = "internal://cache/" + destPath.split("cache/")[1];

let uploadConfig = {
url: url,
header: {
"Content-Type": "application/octet-stream",
"Authorization": authorization,
"x-cos-security-token": securityToken,
"Host": cosHost
},
method: "PUT",
files: [{ filename: media.fileName, name: "file", uri: realuri, type: ext }],
data: []
};
// 업로드 시작
let uploadTask = await request.uploadFile(context, uploadConfig)

uploadTask.on('progress', progressCallback);
let upCompleteCallback = (taskStates) => {
for (let i = 0; i < taskStates.length; i++) {
promptAction.showToast({ message: '업로드 성공' });
console.info("upOnComplete taskState:" + JSON.stringify(taskStates[i]));
}
};
uploadTask.on('complete', upCompleteCallback);

let upFailCallback = (taskStates) => {
for (let i = 0; i < taskStates.length; i++) {
promptAction.showToast({ message: '업로드 실패' });
console.info("upOnFail taskState:" + JSON.stringify(taskStates[i]));
}
};
uploadTask.on('fail', upFailCallback);
} catch (err) {
console.info("uploadFile Error sending PUT request: " + JSON.stringify(err));
promptAction.showToast({ message: "uploadFile Error sending PUT request: " + JSON.stringify(err) });
}
}

","recentReleaseTime":"2025-09-19 10:43:53","slate":"[{\"children\":[{\"text\":\"소개\"}],\"id\":\"4uJKkHnySk_Ki4lT58WAK\",\"nodeId\":\".E7.AE.80.E4.BB.8B\",\"type\":\"h2\"},{\"children\":[{\"text\":\"본 문서는 SDK에 의존하지 않고 간단한 코드로 HarmonyOS에서 COS(Cloud Object Storage)의 버킷으로 파일을 직접 업로드하는 방법을 설명합니다.\"}],\"id\":\"EpWMPTrrVfTF14Y-cWmLa\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"주의:\"}],\"id\":\"CfoEKWBOwO9qPoWJ3Ujpk\",\"type\":\"p\"},{\"children\":[{\"text\":\"본 문서의 내용은 XML 버전의 \"},{\"children\":[{\"text\":\"API\"}],\"id\":\"OYTwrPOYJMjHnIOyZqqir\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/7751\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/7751\"},\"type\":\"ref\"},{\"text\":\"를 기반으로 합니다.\"}],\"id\":\"CP7s3AwMXlku2l-5DoVcW\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"W7pTbjA1wZGjsL0dm0YzS\",\"type\":\"hint\"},{\"children\":[{\"text\":\"전제 조건\"}],\"id\":\"SmWGDoZnU1ZP1MrEeap53\",\"nodeId\":\".E5.89.8D.E6.8F.90.E6.9D.A1.E4.BB.B6\",\"type\":\"h2\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"COS 콘솔\"}],\"id\":\"ikq_-FdExoGSfu4orY-He\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\"},{\"text\":\"에 로그인하여 버킷을 생성하고 Bucket(버킷 이름)과 Region(리전 이름)을 획득하세요. 자세한 내용은 \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"id\":\"uq9LFVyk_8Hv0d--TdMnz\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/14106\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14106\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"tCJntK1seI0Ot3H9AccnT\",\"start\":true,\"type\":\"uli\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"CAM 콘솔\"}],\"id\":\"wAQKzSgtiUqWY0gA-AVrE\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cam/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/capi\"},\"type\":\"ref\"},{\"text\":\"에 로그인하여 프로젝트 SecretId와 SecretKey를 획득합니다.\"}],\"id\":\"RWPiVvJp29lqJ63O-Vr33\",\"start\":false,\"type\":\"uli\"},{\"children\":[{\"text\":\"작업 절차\"}],\"id\":\"xuzH_li2dC7W8cPKVMfJQ\",\"nodeId\":\"878c6106-1aba-4f0f-bc6c-583ecc3b7de8\",\"type\":\"h2\"},{\"children\":[{\"text\":\"전체 단계는 다음과 같습니다:\"}],\"id\":\"Wjn-sp3RYCcnb9mJGw6nM\",\"type\":\"p\"},{\"children\":[{\"text\":\"클라이언트가 서버 인터페이스를 호출하여 파일 확장자를 전달하면, 서버는 확장자와 타임스탬프 등을 기반으로 cos key와 직접 업로드 url을 생성합니다.\"}],\"id\":\"-4tegh_IO40KSkoA-G_hN\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"서버는 STS SDK를 통해 임시 키를 획득합니다.\"}],\"id\":\"esAhcBIL2Kk6Em1egKfpR\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"서버는 획득한 임시 키로 직접 업로드 url에 서명하고 url, 서명, 토큰 등의 정보를 반환합니다.\"}],\"id\":\"a5Dae0HCzELypuQgc_mFp\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"클라이언트는 절차 3에서 획득한 정보를 바탕으로 직접 put 요청을 보내며, 서명과 토큰 등을 헤더에 포함하여 업로드합니다.\"}],\"id\":\"lADfrYcuH0b26_TCm0rf8\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"구체적인 코드는 \"},{\"children\":[{\"text\":\"HarmonyOS 예제\"}],\"id\":\"kd2D6_dWFqsF_p34Nmng0\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-harmonyos-samples/tree/main/COSDirectTransferPractice\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"9_sRsLm2TYIOHH1TM9ig9\",\"type\":\"p\"},{\"children\":[{\"text\":\"서버 서명 구현 구성\"}],\"id\":\"1ckv5zIOdcE6hl_9aR7yx\",\"nodeId\":\".E9.85.8D.E7.BD.AE.E6.9C.8D.E5.8A.A1.E7.AB.AF.E5.AE.9E.E7.8E.B0.E7.AD.BE.E5.90.8D\",\"type\":\"h3\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"주의:\"}],\"id\":\"a3rOe-2x4a5CtY2DJ1VOv\",\"type\":\"p\"},{\"children\":[{\"text\":\"정식 배포 시 서버에는 귀하의 웹사이트 자체 권한 검증 단계를 추가해야 합니다.\"}],\"id\":\"T30PUG42x380iTE-AMD19\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"0gMY0oAdF-YMJlbrUMZmL\",\"type\":\"hint\"},{\"children\":[{\"text\":\"보안상의 이유로 서버드는 임시 키를 획득한 후 직접 업로드 url을 생성하고 즉시 서명해야 합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"서버 서명 사례\"}],\"id\":\"PvItlCn-hDzG2fuaoeNZ-\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/73580\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"b_TWO3-akcZUdC3kroNVZ\",\"type\":\"p\"},{\"children\":[{\"text\":\"구체적인 절차는 다음과 같습니다.\"}],\"id\":\"m5Sh1PsT8ByVWHAXtSwo8\",\"type\":\"p\"},{\"children\":[{\"text\":\"STS SDK를 통해 임시 키를 획득합니다.\"}],\"id\":\"jKSjFWanc36UYf4QpGK6I\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"확장자에 따라 cos key와 직접 업로드 url을 생성합니다.\"}],\"id\":\"U0s2MScwfiev7ewB00jsO\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"임시 키를 사용하여 직접 업로드 url에 서명하고 직접 업로드 url, 서명, 토큰 등의 정보를 반환합니다.\"}],\"id\":\"3DajzEnVt0XofRprsKxU7\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"b\":1,\"text\":\"서버 구성 절차:\"}],\"id\":\"cir8InMmGwuwdPsZ7Qj5H\",\"type\":\"p\"},{\"children\":[{\"text\":\"키, bucket 및 region을 구성합니다.\"}],\"id\":\"fV-DaMmTVEt9nr1R62MO_\",\"start\":true,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"var config = {\"}],\"id\":\"odou6SLSo9lbzOadexi8A\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // Tencent Cloud 키를 획득합니다. 제한된 권한을 가진 서브 사용자의 키 사용을 권장합니다. https://console.tencentcloud.com/cam/capi\"}],\"id\":\"UjbuahVdhNtax4pnQzK7Z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" secretId: process.env.COS_SECRET_ID,\"}],\"id\":\"fS8FjGg6xmLHTQEtFOPgC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" secretKey: process.env.COS_SECRET_KEY,\"}],\"id\":\"7Yh1YhH-TZEuLxdyd53OC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 키 유효 기간\"}],\"id\":\"cRncKwv3ImBQnBcRA4DpK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" durationSeconds: 1800,\"}],\"id\":\"1xAhgtsjNOphu2gWtYeDW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 여기에 버킷 및 리전을 입력합니다. 예: test-1250000000, ap-guangzhou\"}],\"id\":\"fziXThwmYmZ4RgNEStGy8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" bucket: process.env.PERSIST_BUCKET,\"}],\"id\":\"a5Kl_pJK7EGbpyTOFs_uW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" region: process.env.PERSIST_BUCKET_REGION,\"}],\"id\":\"WM6-70sQV82Spp0z9IEXt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 제한된 업로드 확장자\"}],\"id\":\"mByGTrUcCQveByY4i-fwF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" extWhiteList: ['jpg', 'jpeg', 'png', 'gif', 'bmp'],\"}],\"id\":\"VGwYzSPQGywlZA_mgmEQD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"};\"}],\"id\":\"2niH0yKQc-eOX9uYU-MBB\",\"type\":\"code-line\"}],\"id\":\"Yk1-pet-6kwlFmLIiTis3\",\"language\":\"cpp\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"터미널 실행\"}],\"id\":\"W_TkDzvnbDHbDuv3qFxnV\",\"start\":false,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"npm install\"}],\"id\":\"Xk-OWfCS3nkBuq1ApJ421\",\"type\":\"code-line\"}],\"id\":\"f7Aulr2KbVRjIGuwHmYB3\",\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"서비스 시작\"}],\"id\":\"PmCjHwpASIC73tCb5dWyE\",\"start\":false,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"node app.js\"}],\"id\":\"E7uS2MM7ZakgNo6BKxf6W\",\"type\":\"code-line\"}],\"id\":\"Po80wSL3L24EiM4tFWF9p\",\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"여기까지 서버가 성공적으로 시작되었으며, 클라이언트 프로세스를 시작할 수 있습니다.\"}],\"id\":\"rmgnQ8qL-DtuB2lgn4V_g\",\"type\":\"p\"},{\"children\":[{\"b\":1,\"text\":\"다른 언어 또는 자체 구현이 필요한 경우 다음 프로세스를 참조할 수 있습니다.\"}],\"id\":\"5A4ZY_L4Wor8JC-BOxIz1\",\"type\":\"p\"},{\"children\":[{\"text\":\"서버에서 임시 키를 획득합니다. 서버는 먼저 고정 키 SecretId, SecretKey를 사용하여 STS 서비스에서 임시 키를 획득하고, 임시 키 tmpSecretId, tmpSecretKey, sessionToken을 획득합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"임시 키 생성 및 사용 가이드\"}],\"id\":\"g3mK-kNfw_ByZtV4TkD4F\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/14048\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14048\"},\"type\":\"ref\"},{\"text\":\" 또는 \"},{\"children\":[{\"text\":\"cos-sts-sdk\"}],\"id\":\"IiMK8JG4lpK5GfIxcn0-r\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"xOgMMjuitaJCmp2m-LUID\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"직접 업로드 url에 서명하여 authorization을 생성합니다.\"}],\"id\":\"cC7O3nKppQbBa0DgObXJL\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"직접 업로드 url, authorization, sessionToken 등의 정보를 반환하며, 클라이언트가 파일을 업로드할 때 획득한 서명과 sessionToken을 각각 요청 헤더의 authorization 및 x-cos-security-token 필드에 넣습니다.\"}],\"id\":\"7Oeuy1iVwXqnmsiAMgfav\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"HarmonyOS 업로드 예시\"}],\"id\":\"QBoGedfL4QuB8ec8wX6WA\",\"nodeId\":\".E5.AE.A2.E6.88.B7.E7.AB.AF.E4.B8.8A.E4.BC.A0.E7.A4.BA.E4.BE.8B\",\"type\":\"h3\"},{\"children\":[{\"text\":\"서버에서 직접 업로드 및 서명 정보를 요청합니다.\"}],\"id\":\"uYFGNyHLuJrFwyWnl-A00\",\"start\":true,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"import http from '@ohos.net.http';\"}],\"id\":\"MGVL8HnmqyjtOw-SU_F32\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"mQFPVL57nf2PE4QYOLHZR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"/**\"}],\"id\":\"OR1vN-LY0G6McZZKsVmIZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" * 직접 업로드 url 및 서명 등 획득\"}],\"id\":\"WPYDx8_9gAMF9-_99-nJR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" *\"}],\"id\":\"sk7rphQ40Z45bMxWtzJIS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" * @param ext 파일 확장자. 직접 업로드 시 서버드에서 확장자에 따라 cos key 생성\"}],\"id\":\"4NzjCUdpSwq6WVQhZh5Ag\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" * @return 직접 업로드 url 및 서명 등\"}],\"id\":\"U8t_nrLlXmpAZQ-brmRW1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" */\"}],\"id\":\"qDlUi_NG4k7GopkGbAfck\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"public static async getStsDirectSign(ext: string): Promise {\"}],\"id\":\"nxBQdkvnTAa4Wt8MIBAd-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 각 httpRequest는 하나의 HTTP 요청 작업에 해당하며 재사용할 수 없음\"}],\"id\":\"26s1dqJLFPp8770S4hdjG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let httpRequest = http.createHttp();\"}],\"id\":\"9DuvhVCbspKZL5lPW2ngg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //직접 업로드 서명 비즈니스 서버 url(정식 환경에서는 정식 직접 업로드 서명 비즈니스 url로 교체해 주세요)\"}],\"id\":\"j6avlydV37Diqc1pH91rF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //직접 업로드 서명 비즈니스 서버 코드 예제는 다음을 참고하세요: https://github.com/tencentyun/cos-demo/blob/main/server/direct-sign/nodejs/app.js\"}],\"id\":\"JoRw-wmvxK1mwL9Vq-xqF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let url = \\\"http://127.0.0.1:3000/sts-direct-sign?ext=\\\" + ext;\"}],\"id\":\"9effSahYc-Ag1_guxRAG6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" try {\"}],\"id\":\"DqF2Y81WKmFNbIQm0tyQW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let httpResponse = await httpRequest.request(url, { method: http.RequestMethod.GET });\"}],\"id\":\"GhFr9GTSQmZS0lRLjeCZ_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (httpResponse.responseCode == 200) {\"}],\"id\":\"Dj40_Ycq-a8OSdFisuNPW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let result = JSON.parse(httpResponse.result.toString())\"}],\"id\":\"CIOkTb63PFnUYYq3_BWJJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (result.code == 0) {\"}],\"id\":\"NTPAh7FJJduMTsvDAEf3o\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return result.data;\"}],\"id\":\"LBKF1emKSBDND3Hrh1qtW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } else {\"}],\"id\":\"XVidcN5F-_qYEnLOlJTHj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.info(`getStsDirectSign error code: ${result.code}, error message: ${result.message}`);\"}],\"id\":\"yKXeMlgkF3UqneDJIG0FG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"am7MCyHhSaEsGnps96t-r\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } else {\"}],\"id\":\"boi4ZHoj4eP7N0ZVV-Jt_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.info(\\\"getStsDirectSign HTTP error code: \\\" + httpResponse.responseCode);\"}],\"id\":\"EuLkObN5Jv1lY8t7Qa4Os\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"ETHyge29-An1BWAvDpnK7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } catch (err) {\"}],\"id\":\"DUYW8kvxiMsFBUs3qcWSz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.info(\\\"getStsDirectSign Error sending GET request: \\\" + JSON.stringify(err));\"}],\"id\":\"lp_BWTlsyRuf0JJB34PYq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } finally {\"}],\"id\":\"l-2hXHA6j7WaE7J2A3NdE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 해당 요청 사용이 완료되면 destroy 메서드를 호출하여 직접 파기합니다.\"}],\"id\":\"i9YhpFtd2DpEcCfgVyKc3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" httpRequest.destroy();\"}],\"id\":\"FLdk-QqUv3CO1riVQeOht\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"KI3rvvg9W7VZvinGb_mfC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return null;\"}],\"id\":\"PRfbBUcAj0bubdDxgyHQJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"RJhLRYz_RYDjHc7AuPNH6\",\"type\":\"code-line\"}],\"id\":\"8Dw7fTwCKPJ-DxQUc7w1y\",\"language\":\"typescript\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"획득한 직접 업로드 및 서명 정보를 사용하여 파일 업로드를 시작합니다.\"}],\"id\":\"_H-NmghPm_8x5Vw8ioBgF\",\"start\":false,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"import http from '@ohos.net.http';\"}],\"id\":\"tu4qIrNHi2GYGQXzPMx4j\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import promptAction from '@ohos.promptAction'\"}],\"id\":\"19-GPUPBuw5ccDQTYD2IY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import fs from '@ohos.file.fs';\"}],\"id\":\"Zj7liujbeg9CeOKm9CGJb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import request from '@ohos.request';\"}],\"id\":\"HA3PVIuyfVixL4pRXH_60\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import common from '@ohos.app.ability.common';\"}],\"id\":\"0Lb5zuh4YS7em7-imEmPK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import { MediaBean } from '../bean/MediaBean';\"}],\"id\":\"lL5D4zaP_49_aFQTgIoU6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"import { MediaHelper } from './MediaHelper';\"}],\"id\":\"DbRUw5fxmkQhu6szdb6pO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"nMNlnz-jnAGxt8XmOxNFn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"/**\"}],\"id\":\"8OfMPXzCchZEAgIxAADFE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" * 파일 업로드(uploadTask로 구현)\"}],\"id\":\"1sF-BDNcCdfTwpUa71ZGB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" * @param context context\"}],\"id\":\"yIsfq85ONnBhx_cAZv8Xn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" * @param media 미디어 파일\"}],\"id\":\"mrPaTkilLDiyeVYLRHIK8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" */\"}],\"id\":\"BVWtSKO4mUpfMoWcWRk6k\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"public static async uploadFileByTask(context: common.Context, media: MediaBean, progressCallback: (uploadedSize: number, totalSize: number) => void) {\"}],\"id\":\"9nW_cc1QndgU_cXD1qFkv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 직접 업로드 서명 등 정보 획득\"}],\"id\":\"udIW4-fm4Ef7oXE6VHG9Z\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let ext = MediaHelper.getFileExtension(media.fileName);\"}],\"id\":\"-HBxzTTOa2WAOF4-UtYOb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let directTransferData: any = await UploadHelper.getStsDirectSign(ext);\"}],\"id\":\"9l584nNFV2PwVRgVAgywP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (directTransferData == null) {\"}],\"id\":\"u4F17is5lqEDFE2Xzp0eR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" promptAction.showToast({ message: 'getStsDirectSign fail' });\"}],\"id\":\"E455bq1evLaASVjWnJkV3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return;\"}],\"id\":\"TdXbedq-vZwbu9Uo-nV-H\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"c4r9W35PbESzYc0nMQrmT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"NwuzRsQz3NkRrFYewol9F\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 비즈니스 서버에서 반환된 업로드 정보\"}],\"id\":\"YhO9oYVjPU8cvNBAyNsFo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let cosHost: String = directTransferData.cosHost;\"}],\"id\":\"VpksUD-yjV_DrgK942F5G\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let cosKey: String = directTransferData.cosKey;\"}],\"id\":\"tmMwX5PRI7obbu767GGOX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let authorization: String = directTransferData.authorization;\"}],\"id\":\"-25plMfSBnBF7fTWyZbBK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let securityToken: String = directTransferData.securityToken;\"}],\"id\":\"-IqoqRszx3b_f4O10joZB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"RYum_otm00JjzDQCsTPRC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드 url 생성\"}],\"id\":\"23T55MvOxJFZOLkv_xwjo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let url = `https://${cosHost}/${cosKey}`;\"}],\"id\":\"AFNSoYmZuj-gxwSGbEjDV\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" try {\"}],\"id\":\"F6Vfu7V68ZMiDXZ4lKB_I\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // uri 파일을 cacheDir에 복사(request.uploadFile은 internal: 유형의 경로만 허용)\"}],\"id\":\"QIPVCRyR0u2QWLxIC1GU1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let file = await fs.open(media.fileUri, fs.OpenMode.READ_ONLY);\"}],\"id\":\"MUeEiA4so4uGot-h7wzHH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let destPath = context.cacheDir + \\\"/\\\" + media.fileName;\"}],\"id\":\"58j-vKGJ3FQOoilLSCxDo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" await fs.copyFile(file.fd, destPath);\"}],\"id\":\"_mZyIDWAgLFzhfMDNbLmX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let realuri = \\\"internal://cache/\\\" + destPath.split(\\\"cache/\\\")[1];\"}],\"id\":\"4NKn7RJ8bDbtP-N8RjVbP\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"KBcLF8Lp_5S88FRRS0_2L\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let uploadConfig = {\"}],\"id\":\"JKVkPBe4-YNyko-qKN1DZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" url: url,\"}],\"id\":\"pzDSSCjH63gHCR0bb7v1N\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" header: {\"}],\"id\":\"dz45YWixv0xh8qr5FIZ1S\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"Content-Type\\\": \\\"application/octet-stream\\\",\"}],\"id\":\"bB4yk5NadKMuUzl5AhXSW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"Authorization\\\": authorization,\"}],\"id\":\"S03wsJ7SOqOMx6Zxfw0nq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"x-cos-security-token\\\": securityToken,\"}],\"id\":\"_JIUIw7nSpTsUXV5Ix2-M\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" \\\"Host\\\": cosHost\"}],\"id\":\"Frir1uU-wp0DH47gXBSpH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"_zqQDfWdHGym7shnZOdVY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" method: \\\"PUT\\\",\"}],\"id\":\"zWXLKM2Vsp38PbPAcHLVR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" files: [{ filename: media.fileName, name: \\\"file\\\", uri: realuri, type: ext }],\"}],\"id\":\"A55JpbN7Jt5DaTXt5WSzC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" data: []\"}],\"id\":\"07t7pldOAcZ-g9fq0B6Uq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"jMtihZMqNdNBX-L6WUA8E\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 업로드 시작\"}],\"id\":\"SvU9ik1QHJW8_IhPbxL7T\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let uploadTask = await request.uploadFile(context, uploadConfig)\"}],\"id\":\"oXTVsUx8sscgTcN-EHKmJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"UYu-SU_hXObMUvSJ9m0XH\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uploadTask.on('progress', progressCallback);\"}],\"id\":\"P1WLKjCaD800yqxWgEs9J\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let upCompleteCallback = (taskStates) => {\"}],\"id\":\"vVGyGLv1kJgqgh8o_YGS3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" for (let i = 0; i < taskStates.length; i++) {\"}],\"id\":\"VGZvByWy5my-ELb2BaNqQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" promptAction.showToast({ message: '업로드 성공' });\"}],\"id\":\"iZ7bKTucZcUJgbU0QGJrx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.info(\\\"upOnComplete taskState:\\\" + JSON.stringify(taskStates[i]));\"}],\"id\":\"iHwTr6GCafj89eu6S0lgY\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"BdgfZE2DcZxGXeAZmPF2a\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"8vGyW_Fb5R-mX-1TMXYYM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uploadTask.on('complete', upCompleteCallback);\"}],\"id\":\"YS0r7r1Oh9QL4pHpkkvFq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"FZiFT8CYiqRT1nPt9xgob\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" let upFailCallback = (taskStates) => {\"}],\"id\":\"DYSJGm92O7F5KuJUo5bQT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" for (let i = 0; i < taskStates.length; i++) {\"}],\"id\":\"xvDvZWridOrgl0ZbMjDP3\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" promptAction.showToast({ message: '업로드 실패' });\"}],\"id\":\"ZToA0HhnyHIpbA9NFpXR2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.info(\\\"upOnFail taskState:\\\" + JSON.stringify(taskStates[i]));\"}],\"id\":\"5eKGQyNetqaeKn77GIi_x\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"Tj8T9XVPhb3j8vaTpzLR7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" };\"}],\"id\":\"s9t_ajDj1-UZ27Wqk1daU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" uploadTask.on('fail', upFailCallback);\"}],\"id\":\"Q9e013WkfRVmH7vz_eIEf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } catch (err) {\"}],\"id\":\"ov8VVR3nLCzrLPoawgvFG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" console.info(\\\"uploadFile Error sending PUT request: \\\" + JSON.stringify(err));\"}],\"id\":\"t-p-m7PLJlU80lS6vJfdW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" promptAction.showToast({ message: \\\"uploadFile Error sending PUT request: \\\" + JSON.stringify(err) });\"}],\"id\":\"agXKBlQw_WbMGP8QX1sva\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"VXjwYLf-fbNoQSgTKWTkl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"7I2BDjjLHdvcSTXq5emnZ\",\"type\":\"code-line\"}],\"id\":\"wQKZ_2XwITbtrrgy43eMr\",\"language\":\"typescript\",\"type\":\"code-block\"},{\"type\":\"p\",\"children\":[{\"text\":\"\"}],\"id\":\"bLHKdMZochlhnDIhfjvCw\"}]"}},"73582":{"categoryId":436,"weight":58,"type":"page","extension":"","pid":33419,"id":73582,"lang":"ko","title":"Flutter 직접 업로드 사례","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2025-09-19 18:43:53","recentReleaseTime":"2025-09-19 18:43:53","content":{"title":"Flutter 직접 업로드 사례","body":"

소개

본 문서는 SDK에 의존하지 않고 간단한 코드로 Flutter에서 COS(Cloud Object Storage)의 버킷으로 파일을 직접 업로드하는 방법을 설명합니다.
주의:
본 문서의 내용은 XML 버전의 API를 기반으로 합니다.

전제 조건

1. COS 콘솔에 로그인하여 버킷을 생성하고 Bucket(버킷 이름)과 Region(리전 이름)을 획득하세요. 자세한 내용은 버킷 생성 문서를 참고하십시오.
2. CAM 콘솔에 로그인하여 프로젝트 SecretId와 SecretKey를 획득합니다.

작업 절차

전체 절차의 논리는 다음과 같습니다.
1. 클라이언트가 서버 인터페이스를 호출하여 파일 확장자를 전달하면, 서버는 확장자와 타임스탬프 등을 기반으로 cos key와 직접 업로드 url을 생성합니다.
2. 서버는 STS SDK를 통해 임시 키를 획득합니다.
3. 서버는 획득한 임시 키로 직접 업로드 url에 서명하고 url, 서명, 토큰 등의 정보를 반환합니다.
4. 클라이언트는 절차 3에서 획득한 정보를 바탕으로 직접 put 요청을 보내며, 서명과 토큰 등을 헤더에 포함하여 업로드합니다.
구체적인 코드는 Flutter 예제를 참고하십시오.

서버

주의:
정식 배포 시 서버에는 귀하의 웹사이트 자체 권한 검증 단계를 추가해야 합니다.
보안상의 이유로 서버드는 임시 키를 획득한 후 직접 업로드 url을 생성하고 즉시 서명해야 합니다. 자세한 내용은 서버 서명 사례을 참고하십시오.
구체적인 절차는 다음과 같습니다.
1. STS SDK를 통해 임시 키를 획득합니다.
2. 확장자에 따라 cos key와 직접 업로드 url을 생성합니다.
3. 임시 키를 사용하여 직접 업로드 url에 서명하고 직접 업로드 url, 서명, 토큰 등의 정보를 반환합니다.
서버 구성 절차:
1. 키, bucket 및 region을 구성합니다.
var config = {
// Tencent Cloud 키를 획득합니다. 제한된 권한을 가진 서브 사용자의 키 사용을 권장합니다. https://console.tencentcloud.com/cam/capi
secretId: process.env.COS_SECRET_ID,
secretKey: process.env.COS_SECRET_KEY,
// 키 유효 기간
durationSeconds: 1800,
// 여기에 버킷 및 리전을 입력합니다. 예: test-1250000000, ap-guangzhou
bucket: process.env.PERSIST_BUCKET,
region: process.env.PERSIST_BUCKET_REGION,
// 제한된 업로드 확장자
extWhiteList: ['jpg', 'jpeg', 'png', 'gif', 'bmp'],
};
2. 터미널 실행
npm install
3. 서비스 시작
node app.js
여기까지 서버가 성공적으로 시작되었으며, 클라이언트 프로세스를 시작할 수 있습니다.
다른 언어 또는 자체 구현이 필요한 경우 다음 프로세스를 참조할 수 있습니다.
1. 서버에서 임시 키를 획득합니다. 서버는 먼저 고정 키 SecretId, SecretKey를 사용하여 STS 서비스에서 임시 키를 획득하고, 임시 키 tmpSecretId, tmpSecretKey, sessionToken을 획득합니다. 자세한 내용은 임시 키 생성 및 사용 가이드 또는 cos-sts-sdk 문서를 참고하십시오.
2. 직접 업로드 url에 서명하여 authorization을 생성합니다.
3. 직접 업로드 url, authorization, sessionToken 등의 정보를 반환하며, 클라이언트가 파일을 업로드할 때 획득한 서명과 sessionToken을 각각 요청 헤더의 authorization 및 x-cos-security-token 필드에 넣습니다.

클라이언트(Flutter)

구체적인 코드는 Flutter 예제를 참고하십시오.

dio 네트워크 라이브러리 사용

1. 서버에서 직접 업로드 및 서명 정보를 요청합니다.
/// 직접 업로드 url 및 서명 등 획득
/// @param ext 파일 확장자. 직접 업로드 시 서버드에서 확장자에 따라 cos key 생성
/// @return 직접 업로드 url 및 서명 등
static Future<Map<String, dynamic>> getStsDirectSign(String ext) async {
Dio dio = Dio();
//직접 업로드 서명 비즈니스 서버 url(실제 환경에서는 정식 직접 업로드 서명 비즈니스 url로 교체해 주세요)
//직접 업로드 서명 비즈니스 서버 코드 예제는 https://github.com/tencentyun/cos-demo/blob/main/server/direct-sign/nodejs/app.js를 참고하십시오.
//10.91.22.16은 직접 업로드 서명 비즈니스 서버의 주소입니다. 예를 들어 위의 node 서비스와 같이, 직접 업로드 서명 비즈니스 서버에 접근할 수 있는 url이면 됩니다.
Response response = await dio.get('http://10.91.22.16:3000/sts-direct-sign',
queryParameters: {'ext': ext});
if (response.statusCode == 200) {
if (kDebugMode) {
print(response.data);
}
if (response.data['code'] == 0) {
return response.data['data'];
} else {
throw Exception(
'getStsDirectSign error code: ${response.data['code']}, error message: ${response.data['message']}');
}
} else {
throw Exception(
'getStsDirectSign HTTP error code: ${response.statusCode}');
}
}
2. 획득한 직접 업로드 및 서명 정보를 사용하여 파일 업로드를 시작합니다.
/// 파일 업로드
/// @param filePath 파일 경로
/// @param progressCallback 진행 상태 콜백
static Future<void> upload(String filePath, ProgressCallback progressCallback) async {
String ext = path.extension(filePath).substring(1);
Map<String, dynamic> directTransferData;
try {
directTransferData = await getStsDirectSign(ext);
} catch (err) {
if (kDebugMode) {
print(err);
}
throw Exception("getStsDirectSign fail");
}
String cosHost = directTransferData['cosHost'];
String cosKey = directTransferData['cosKey'];
String authorization = directTransferData['authorization'];
String securityToken = directTransferData['securityToken'];
String url = 'https://$cosHost/$cosKey';
File file = File(filePath);
Options options = Options(
method: 'PUT',
headers: {
'Content-Length': await file.length(),
'Content-Type': 'application/octet-stream',
'Authorization': authorization,
'x-cos-security-token': securityToken,
'Host': cosHost,
},
);
try {
Dio dio = Dio();
Response response = await dio.put(url,
data: file.openRead(),
options: options, onSendProgress: (int sent, int total) {
double progress = sent / total;
if (kDebugMode) {
print('Progress: ${progress.toStringAsFixed(2)}');
}
progressCallback(sent, total);
});
if (response.statusCode == 200) {
if (kDebugMode) {
print('업로드 성공');
}
} else {
throw Exception("업로드 실패 ${response.statusMessage}");
}
} catch (error) {
if (kDebugMode) {
print('Error: $error');
}
throw Exception("업로드 실패 ${error.toString()}");
}
}

네이티브 Http Client 네트워크 라이브러리 사용

1. 서버에서 직접 업로드 및 서명 정보를 요청합니다.
/// 직접 업로드 url 및 서명 등 획득
/// @param ext 파일 확장자. 직접 업로드 시 서버드에서 확장자에 따라 cos key 생성
/// @return 직접 업로드 url 및 서명 등
static Future<Map<String, dynamic>> _getStsDirectSign(String ext) async {
HttpClient httpClient = HttpClient();
//직접 업로드 서명 비즈니스 서버 url(정식 환경에서는 정식 직접 업로드 서명 비즈니스 url로 교체해 주세요)
//직접 업로드 서명 비즈니스 서버 코드 예제는 https://github.com/tencentyun/cos-demo/blob/main/server/direct-sign/nodejs/app.js를 참고하십시오.
//10.91.22.16은 직접 업로드 서명 비즈니스 서버의 주소입니다. 예를 들어 위의 node 서비스와 같이, 직접 업로드 서명 비즈니스 서버에 접근할 수 있는 url이면 됩니다.
HttpClientRequest request = await httpClient
.getUrl(Uri.parse("http://10.91.22.16:3000/sts-direct-sign?ext=$ext"));
HttpClientResponse response = await request.close();
String responseBody = await response.transform(utf8.decoder).join();
if (response.statusCode == 200) {
Map<String, dynamic> json = jsonDecode(responseBody);
if (kDebugMode) {
print(json);
}
httpClient.close();
if (json['code'] == 0) {
return json['data'];
} else {
throw Exception(
'getStsDirectSign error code: ${json['code']}, error message: ${json['message']}');
}
} else {
httpClient.close();
throw Exception(
'getStsDirectSign HTTP error code: ${response.statusCode}');
}
}
2. 획득한 직접 업로드 및 서명 정보를 사용하여 파일 업로드를 시작합니다.
/// 파일 업로드
/// @param filePath 파일 경로
/// @param progressCallback 진행 상태 콜백
static Future<void> upload(String filePath, ProgressCallback progressCallback) async {
// 직접 업로드 서명 등 정보 획득
String ext = path.extension(filePath).substring(1);
Map<String, dynamic> directTransferData;
try {
directTransferData = await _getStsDirectSign(ext);
} catch (err) {
if (kDebugMode) {
print(err);
}
throw Exception("getStsDirectSign fail");
}

String cosHost = directTransferData['cosHost'];
String cosKey = directTransferData['cosKey'];
String authorization = directTransferData['authorization'];
String securityToken = directTransferData['securityToken'];
String url = 'https://$cosHost/$cosKey';

File file = File(filePath);
int fileSize = await file.length();
HttpClient httpClient = HttpClient();
HttpClientRequest request = await httpClient.putUrl(Uri.parse(url));
request.headers.set('Content-Type', 'application/octet-stream');
request.headers.set('Content-Length', fileSize.toString());
request.headers.set('Authorization', authorization);
request.headers.set('x-cos-security-token', securityToken);
request.headers.set('Host', cosHost);
request.contentLength = fileSize;
Stream<List<int>> stream = file.openRead();
int bytesSent = 0;
stream.listen(
(List<int> chunk) {
bytesSent += chunk.length;
double progress = bytesSent / fileSize;
if (kDebugMode) {
print('Progress: ${progress.toStringAsFixed(2)}');
}
progressCallback(bytesSent, fileSize);
request.add(chunk);
},
onDone: () async {
HttpClientResponse response = await request.close();
if (response.statusCode == 200) {
if (kDebugMode) {
print('업로드 성공');
}
} else {
throw Exception("업로드 실패 $response");
}
},
onError: (error) {
if (kDebugMode) {
print('Error: $error');
}
throw Exception("업로드 실패 ${error.toString()}");
},
cancelOnError: true,
);
}

관련 문서

더 많은 인터페이스 호출 요구 사항이 있는 경우 Flutter SDK를 참고하십시오.
","recentReleaseTime":"2025-09-19 10:43:53","slate":"[{\"children\":[{\"text\":\"소개\"}],\"id\":\"_K05TiRDdGHONjR1ojs-v\",\"nodeId\":\".E7.AE.80.E4.BB.8B\",\"type\":\"h2\"},{\"children\":[{\"text\":\"본 문서는 SDK에 의존하지 않고 간단한 코드로 Flutter에서 COS(Cloud Object Storage)의 버킷으로 파일을 직접 업로드하는 방법을 설명합니다.\"}],\"id\":\"dUgWhD2wICgDFmCc5-J6M\",\"type\":\"p\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"주의:\"}],\"id\":\"4lfIOb7bn7-tQPIwHIKq8\",\"type\":\"p\"},{\"children\":[{\"text\":\"본 문서의 내용은 XML 버전의 \"},{\"children\":[{\"text\":\"API\"}],\"id\":\"DNa9VkNGuoB6PWD-7N660\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/7751\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/7751\"},\"type\":\"ref\"},{\"text\":\"를 기반으로 합니다.\"}],\"id\":\"THyyfB_9-UQrUSiJHFCpl\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"ItiT692pnOdKwp5Q792kG\",\"type\":\"hint\"},{\"children\":[{\"text\":\"전제 조건\"}],\"id\":\"kpdhRgftbuBFurl2gIcPK\",\"nodeId\":\".E5.89.8D.E6.8F.90.E6.9D.A1.E4.BB.B6\",\"type\":\"h2\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"COS 콘솔\"}],\"id\":\"Qpw0u_Jw0S0ckAEhm6UzD\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cos5\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos5\"},\"type\":\"ref\"},{\"text\":\"에 로그인하여 버킷을 생성하고 Bucket(버킷 이름)과 Region(리전 이름)을 획득하세요. 자세한 내용은 \"},{\"children\":[{\"text\":\"버킷 생성\"}],\"id\":\"YMgMm2gvLgMWI9L8kpjIH\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/14106\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14106\"},\"type\":\"ref\"},{\"text\":\" 문서를 참고하십시오.\"}],\"id\":\"dF00OdTwqlrMEqmq3ueZl\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"\"},{\"children\":[{\"text\":\"CAM 콘솔\"}],\"id\":\"DEq9vFgRt3b5f47mDantf\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://console.tencentcloud.com/cam/capi\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam/capi\"},\"type\":\"ref\"},{\"text\":\"에 로그인하여 프로젝트 SecretId와 SecretKey를 획득합니다.\"}],\"id\":\"aGnFlzWkwJoDu7sN3WjC1\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"작업 절차\"}],\"id\":\"l3gPF4EHsP0oRpcHgMKw5\",\"nodeId\":\".E5.AE.9E.E8.B7.B5.E6.AD.A5.E9.AA.A4\",\"type\":\"h2\"},{\"children\":[{\"text\":\"전체 절차의 논리는 다음과 같습니다.\"}],\"id\":\"VvFSmTIAA1xWPP5rIJ9o7\",\"type\":\"p\"},{\"children\":[{\"text\":\"클라이언트가 서버 인터페이스를 호출하여 파일 확장자를 전달하면, 서버는 확장자와 타임스탬프 등을 기반으로 cos key와 직접 업로드 url을 생성합니다.\"}],\"id\":\"t3LmKgCaHUsHzoueB4pv5\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"서버는 STS SDK를 통해 임시 키를 획득합니다.\"}],\"id\":\"VTfX-UWPOxG7zXd324_11\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"서버는 획득한 임시 키로 직접 업로드 url에 서명하고 url, 서명, 토큰 등의 정보를 반환합니다.\"}],\"id\":\"XxC5yo11uQVplFn8ADN1A\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"클라이언트는 절차 3에서 획득한 정보를 바탕으로 직접 put 요청을 보내며, 서명과 토큰 등을 헤더에 포함하여 업로드합니다.\"}],\"id\":\"o_qj6QlHZlTa_50cLJAsL\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"구체적인 코드는 \"},{\"children\":[{\"text\":\"Flutter 예제\"}],\"id\":\"_zQDq9izbSflmIijloG_L\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/TencentCloud/cos-sdk-flutter-plugin/tree/main/example_direct\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/TencentCloud/cos-sdk-flutter-plugin/tree/main/example_direct\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"O2Nftu1Y8eM7Oy4xs_RR1\",\"type\":\"p\"},{\"children\":[{\"text\":\"서버\"}],\"id\":\"QMAb_JoFL8u_1WKKGLbK7\",\"nodeId\":\".E9.85.8D.E7.BD.AE.E6.9C.8D.E5.8A.A1.E7.AB.AF.E5.AE.9E.E7.8E.B0.E7.AD.BE.E5.90.8D\",\"type\":\"h2\"},{\"children\":[{\"children\":[{\"b\":1,\"text\":\"주의:\"}],\"id\":\"zYlmUr-rWPhCdK8cBS-QQ\",\"type\":\"p\"},{\"children\":[{\"text\":\"정식 배포 시 서버에는 귀하의 웹사이트 자체 권한 검증 단계를 추가해야 합니다.\"}],\"id\":\"HmIbejJeDH2cZ9y7NVOkb\",\"type\":\"p\"}],\"hintType\":\"alert\",\"id\":\"dI2rfRvJZVs-dVI1FJjQK\",\"type\":\"hint\"},{\"children\":[{\"text\":\"보안상의 이유로 서버드는 임시 키를 획득한 후 직접 업로드 url을 생성하고 즉시 서명해야 합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"서버 서명 사례\"}],\"id\":\"fXBMvxkKrjicp0gPZYRvk\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/73580\"},\"type\":\"ref\"},{\"text\":\"을 참고하십시오.\"}],\"id\":\"X7NWJMoZb2vffoVEOWB9R\",\"type\":\"p\"},{\"children\":[{\"text\":\"구체적인 절차는 다음과 같습니다.\"}],\"id\":\"l78agX756U2MZCTMZ39Zo\",\"type\":\"p\"},{\"children\":[{\"text\":\"STS SDK를 통해 임시 키를 획득합니다.\"}],\"id\":\"Vu7YU39JBjVpIQxWueTvM\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"확장자에 따라 cos key와 직접 업로드 url을 생성합니다.\"}],\"id\":\"Ar2wBzUP-TFqLvcPMNE_S\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"임시 키를 사용하여 직접 업로드 url에 서명하고 직접 업로드 url, 서명, 토큰 등의 정보를 반환합니다.\"}],\"id\":\"CbmVZFZT5JTTXhjefjUlp\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"서버 구성 절차:\"}],\"id\":\"_4QutpLI62IuIBWiSIeia\",\"type\":\"p\"},{\"children\":[{\"text\":\"키, bucket 및 region을 구성합니다.\"}],\"id\":\"WxY23hvzwnN3b7UQ-4WPe\",\"start\":true,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"var config = {\"}],\"id\":\"2qKRChd3hVeq-wYpnjWES\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // Tencent Cloud 키를 획득합니다. 제한된 권한을 가진 서브 사용자의 키 사용을 권장합니다. https://console.tencentcloud.com/cam/capi\"}],\"id\":\"BwwaWLdOXih9gM_0YbHQX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" secretId: process.env.COS_SECRET_ID,\"}],\"id\":\"8q-yG1R0xsCjcc6zqQPUT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" secretKey: process.env.COS_SECRET_KEY,\"}],\"id\":\"t7ORCfjNrozvis4DsNrqo\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 키 유효 기간\"}],\"id\":\"uzGGw9oDQPbDwq18VYq8_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" durationSeconds: 1800,\"}],\"id\":\"3EDPVXaeT0dKgbYkWK58l\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 여기에 버킷 및 리전을 입력합니다. 예: test-1250000000, ap-guangzhou\"}],\"id\":\"LD0HGd88x8SpWCRpnXFFs\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" bucket: process.env.PERSIST_BUCKET,\"}],\"id\":\"E2vKQhKabVbUMQY-73DYK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" region: process.env.PERSIST_BUCKET_REGION,\"}],\"id\":\"wJsALkJXLgFzdgl-zQGM-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 제한된 업로드 확장자\"}],\"id\":\"XwJl9P_x-BwjQjlFeO0tx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" extWhiteList: ['jpg', 'jpeg', 'png', 'gif', 'bmp'],\"}],\"id\":\"1Df4oN1_OPy8AXShwE-RW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"};\"}],\"id\":\"9zy_bVkN2cH9gQ8R9YWqD\",\"type\":\"code-line\"}],\"id\":\"fOkK8HlzdGsveBiL6U70Z\",\"language\":\"javascript\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"터미널 실행\"}],\"id\":\"fyU9z14ySbkYAGsXev6KU\",\"start\":false,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"npm install\"}],\"id\":\"b9rXru47XXiXLX0_-VRgt\",\"type\":\"code-line\"}],\"id\":\"bFMvr1KAAWSlTCJT9PfDP\",\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"서비스 시작\"}],\"id\":\"ISQhdHH-RtYZ5RmdmQ_Fy\",\"start\":false,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"node app.js\"}],\"id\":\"J9P9-NIIq2J7wjFvs2ufb\",\"type\":\"code-line\"}],\"id\":\"V-YLELxqRgG6-_sgguo6d\",\"language\":\"bash\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"여기까지 서버가 성공적으로 시작되었으며, 클라이언트 프로세스를 시작할 수 있습니다.\"}],\"id\":\"mbmRKO7iRTpRalQNB5637\",\"type\":\"p\"},{\"children\":[{\"text\":\"다른 언어 또는 자체 구현이 필요한 경우 다음 프로세스를 참조할 수 있습니다.\"}],\"id\":\"xKfv7QhAeu1ogfLzIzuWW\",\"type\":\"p\"},{\"children\":[{\"text\":\"서버에서 임시 키를 획득합니다. 서버는 먼저 고정 키 SecretId, SecretKey를 사용하여 STS 서비스에서 임시 키를 획득하고, 임시 키 tmpSecretId, tmpSecretKey, sessionToken을 획득합니다. 자세한 내용은 \"},{\"children\":[{\"text\":\"임시 키 생성 및 사용 가이드\"}],\"id\":\"cba5hiAkSSDITmGBGCcRY\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/14048\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14048\"},\"type\":\"ref\"},{\"text\":\" 또는 \"},{\"children\":[{\"text\":\"cos-sts-sdk\"}],\"id\":\"JMpEeEAlsUyf3OKlWOPDn\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/tencentyun/qcloud-cos-sts-sdk\"},\"type\":\"ref\"},{\"text\":\" 문서를 참고하십시오.\"}],\"id\":\"L6D0Nq1rcVHTe58EPNigO\",\"start\":true,\"type\":\"oli\"},{\"children\":[{\"text\":\"직접 업로드 url에 서명하여 authorization을 생성합니다.\"}],\"id\":\"lOyMUjBWsccaveNvnOPFS\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"직접 업로드 url, authorization, sessionToken 등의 정보를 반환하며, 클라이언트가 파일을 업로드할 때 획득한 서명과 sessionToken을 각각 요청 헤더의 authorization 및 x-cos-security-token 필드에 넣습니다.\"}],\"id\":\"e9pEEjsicd2uhtZG_1MlH\",\"start\":false,\"type\":\"oli\"},{\"children\":[{\"text\":\"클라이언트(Flutter)\"}],\"id\":\"IkxWMZ2iTDW8Y78KCfuHi\",\"nodeId\":\"flutter-.E4.B8.8A.E4.BC.A0.E7.A4.BA.E4.BE.8B\",\"type\":\"h2\"},{\"children\":[{\"text\":\"구체적인 코드는 \"},{\"children\":[{\"text\":\"Flutter 예제\"}],\"id\":\"70_m06fdhOGTxu5ZOvicM\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://github.com/TencentCloud/cos-sdk-flutter-plugin/tree/main/example_direct\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/TencentCloud/cos-sdk-flutter-plugin/tree/main/example_direct\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"AicfdNdSs7NA1eNziFK-V\",\"type\":\"p\"},{\"children\":[{\"text\":\"dio 네트워크 라이브러리 사용\"}],\"id\":\"FmhqOqW7a9vojfqQMH_IO\",\"nodeId\":\".E4.BD.BF.E7.94.A8-dio-.E7.BD.91.E7.BB.9C.E5.BA.93\",\"type\":\"h4\"},{\"children\":[{\"text\":\"서버에서 직접 업로드 및 서명 정보를 요청합니다.\"}],\"id\":\"SHYYFp4IBHg-3uFjFJN2Y\",\"start\":true,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"/// 직접 업로드 url 및 서명 등 획득\"}],\"id\":\"qkWEq9P1-YmDa8nApK6Kp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"/// @param ext 파일 확장자. 직접 업로드 시 서버드에서 확장자에 따라 cos key 생성\"}],\"id\":\"gEtpWO_uXPvDqQHeUEsRf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"/// @return 직접 업로드 url 및 서명 등\"}],\"id\":\"kIn45qu86PNBCWtxTX6r-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"static Future> getStsDirectSign(String ext) async {\"}],\"id\":\"gaMXQ0tbMMIrx72dYMHyL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Dio dio = Dio();\"}],\"id\":\"Qg8roJsoDZOnT_4E3Qx8Q\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //직접 업로드 서명 비즈니스 서버 url(실제 환경에서는 정식 직접 업로드 서명 비즈니스 url로 교체해 주세요)\"}],\"id\":\"Bve-Vpr0YmB4ldgvQBe_t\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //직접 업로드 서명 비즈니스 서버 코드 예제는 https://github.com/tencentyun/cos-demo/blob/main/server/direct-sign/nodejs/app.js를 참고하십시오.\"}],\"id\":\"drl7p_Puw-VoeNb6Aar6d\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //10.91.22.16은 직접 업로드 서명 비즈니스 서버의 주소입니다. 예를 들어 위의 node 서비스와 같이, 직접 업로드 서명 비즈니스 서버에 접근할 수 있는 url이면 됩니다.\"}],\"id\":\"vuGE1CzoVhHD9VnQkS4q4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Response response = await dio.get('http://10.91.22.16:3000/sts-direct-sign',\"}],\"id\":\"1kFOxE13bQXIXKOKtNSO5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" queryParameters: {'ext': ext});\"}],\"id\":\"SRYZFUbr5hv2hcOGeQefr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (response.statusCode == 200) {\"}],\"id\":\"BmgmYl8BIxGNNO_jhD7pw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (kDebugMode) {\"}],\"id\":\"nHRsr0ZTe-XHk3K00e1J9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print(response.data);\"}],\"id\":\"gfHVnHK-35GIIpnmgMR0G\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"Wf0tTHeVU-kG4WQUEiOxi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (response.data['code'] == 0) {\"}],\"id\":\"9fk4VgGii3GT-m6w0NIth\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return response.data['data'];\"}],\"id\":\"tk9PK_yfRliur8r23G2J5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } else {\"}],\"id\":\"LeyjBQtTkqJuw1bZKI8_a\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw Exception(\"}],\"id\":\"I1ygnhTPIhPjabaL8XKVe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'getStsDirectSign error code: ${response.data['code']}, error message: ${response.data['message']}');\"}],\"id\":\"XLtp6rl1tVT-nCan_tl1f\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"0MfCP-nVf67VBZS2rGQJj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } else {\"}],\"id\":\"scMnunX4j1nwosqyjrbEt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw Exception(\"}],\"id\":\"bZZc_1Ixtdn5ogNO5OChC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'getStsDirectSign HTTP error code: ${response.statusCode}');\"}],\"id\":\"dpziFpU6eUNTfcujRQg_E\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"21CKTSBHiRQW7m-phgF2r\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"Q4PMUOh13gjVWRZFHSQ2D\",\"type\":\"code-line\"}],\"id\":\"itNKzqihLlDzXLF9IioDR\",\"language\":\"java\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"획득한 직접 업로드 및 서명 정보를 사용하여 파일 업로드를 시작합니다.\"}],\"id\":\"nOVj79ZgOO9IFqXpb0I33\",\"start\":false,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"/// 파일 업로드\"}],\"id\":\"SSNbc-65nIjZPETdMIkQL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"/// @param filePath 파일 경로\"}],\"id\":\"Ts9r8OgLIPC3saRsAnjC5\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"/// @param progressCallback 진행 상태 콜백\"}],\"id\":\"QLBndYxcZfogn4Gsc1sFw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"static Future upload(String filePath, ProgressCallback progressCallback) async {\"}],\"id\":\"9STWa5OPRIDLt1OfuHgw0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String ext = path.extension(filePath).substring(1);\"}],\"id\":\"oT7QZfmjl_A_2Inmhb5ZB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Map directTransferData;\"}],\"id\":\"mUHRJZ0HyCeV1rgD7eDqj\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" try {\"}],\"id\":\"L0wUAr2mO3MnHzghbHHhW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" directTransferData = await getStsDirectSign(ext);\"}],\"id\":\"cWSfbwbBYUOyxBD0BzPQm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } catch (err) {\"}],\"id\":\"D5LIitmzWPZmkWxG6zKI8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (kDebugMode) {\"}],\"id\":\"AO772WkLd5x4akeFKEBrv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print(err);\"}],\"id\":\"qiH1NCUPvlNaFojSsPnHf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"rBPxBl0fnxLZPM-uG1WRn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw Exception(\\\"getStsDirectSign fail\\\");\"}],\"id\":\"v_x1m1Lh1ZwhXwhNGLkVC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"ANO-6kFX6y8KWcKRUBz2i\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String cosHost = directTransferData['cosHost'];\"}],\"id\":\"y8bCrkegLudGKOMAscLm0\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String cosKey = directTransferData['cosKey'];\"}],\"id\":\"nKu4u_ph7cR9H9MnZlBQw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String authorization = directTransferData['authorization'];\"}],\"id\":\"TmiKuD_kuKBh8FPxrtYtt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String securityToken = directTransferData['securityToken'];\"}],\"id\":\"kfW2UjQHv3MTORieQESYD\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String url = 'https://$cosHost/$cosKey';\"}],\"id\":\"FkDhycRrHFdOMFOkWX8T7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" File file = File(filePath);\"}],\"id\":\"oEoe7wCetoqMeOYCvysPG\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Options options = Options(\"}],\"id\":\"J7xPxHLrlv6m-mHGRcd82\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" method: 'PUT',\"}],\"id\":\"0_y5YARXlTmGYPcxLXTdk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" headers: {\"}],\"id\":\"xbymvhS62AZ3dfLpy6qYB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Content-Length': await file.length(),\"}],\"id\":\"vEsMarv803qc0jGD_Yj_y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Content-Type': 'application/octet-stream',\"}],\"id\":\"1klrUP7uqMELktwB8QwNn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Authorization': authorization,\"}],\"id\":\"UAjX18jZcXVMZazF08H6X\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'x-cos-security-token': securityToken,\"}],\"id\":\"YteDmX3x-WYlT9omGnuyt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'Host': cosHost,\"}],\"id\":\"hDFslSZn5lYsaLZ16oOF-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"O503Pi7VxRkWr1NS8PplQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" );\"}],\"id\":\"4USrnx5MLuxyeIXxtNt3Y\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" try {\"}],\"id\":\"0ldx3b9jj5xGx6sQpnHKt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Dio dio = Dio();\"}],\"id\":\"OwqFyvIIK572i1EhMEZjI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Response response = await dio.put(url,\"}],\"id\":\"9DDLAj0GL-pG6-cvG3EV6\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" data: file.openRead(),\"}],\"id\":\"TbyOaH9XqysF8WqBEfKqe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" options: options, onSendProgress: (int sent, int total) {\"}],\"id\":\"uxLuNp3uGbYR_BQN1g44m\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" double progress = sent / total;\"}],\"id\":\"llPOKr2OTnPTYCerPMpn4\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (kDebugMode) {\"}],\"id\":\"JtqKhGbzFqM6udLaJRVqW\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print('Progress: ${progress.toStringAsFixed(2)}');\"}],\"id\":\"whpjkHV_LIgEp2lqBHxFq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"h32Fc_jEelPsmQWY-pSZ7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" progressCallback(sent, total);\"}],\"id\":\"_qUOOFi_cwVaWbrVRGoFL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" });\"}],\"id\":\"9VpOiDZNZKE6wusNz3IBp\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (response.statusCode == 200) {\"}],\"id\":\"geGBr4m5mC0Kc5-xeVefu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (kDebugMode) {\"}],\"id\":\"25Xw2bP-2zL8gi27iK3gh\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print('업로드 성공');\"}],\"id\":\"LnvjJi-pOmIbW-AXOluBU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"wCcR8o3rdphFXLnyCb-WN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } else {\"}],\"id\":\"q9dKcAtmLiVNKVUHi1Tqu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw Exception(\\\"업로드 실패 ${response.statusMessage}\\\");\"}],\"id\":\"c_gmceN2BKGkG_eyaW_3j\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"Oxe01Hhiz6Crl09VIX14n\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } catch (error) {\"}],\"id\":\"yFmsDuAPY-qw1VOHuuVhQ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (kDebugMode) {\"}],\"id\":\"QWKgsciH1vYHtAdmI30NU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print('Error: $error');\"}],\"id\":\"P-o59r10vc3yd_OVbBJIR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"MMJoDFuH8htYTc9krXkud\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw Exception(\\\"업로드 실패 ${error.toString()}\\\");\"}],\"id\":\"3XAdNS05aCBRAvmAkkS4G\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"KIDP49BY36RTkzv2Kns9g\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"P8WhBKFttiJXpq0zAPyhi\",\"type\":\"code-line\"}],\"id\":\"1bfW0Uo4OsRfdDNRPUXFw\",\"language\":\"java\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"네이티브 Http Client 네트워크 라이브러리 사용\"}],\"id\":\"Z0MxSayPapiyLROzuoJvQ\",\"nodeId\":\".E4.BD.BF.E7.94.A8.E5.8E.9F.E7.94.9F-http-client-.E7.BD.91.E7.BB.9C.E5.BA.93\",\"type\":\"h4\"},{\"children\":[{\"text\":\"서버에서 직접 업로드 및 서명 정보를 요청합니다.\"}],\"id\":\"mnPQ5RMzq-HqoJnOi2G2Q\",\"start\":true,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"/// 직접 업로드 url 및 서명 등 획득\"}],\"id\":\"SwszKzaUFsy1UzaHFC0xM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"/// @param ext 파일 확장자. 직접 업로드 시 서버드에서 확장자에 따라 cos key 생성\"}],\"id\":\"X13Ean1PVjSm-Mr2HzJdn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"/// @return 직접 업로드 url 및 서명 등\"}],\"id\":\"VCC5_vAkm5nen2XKyDl8r\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"static Future> _getStsDirectSign(String ext) async {\"}],\"id\":\"gTzaMmPK1dTxCqe_HQ15O\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" HttpClient httpClient = HttpClient();\"}],\"id\":\"sW9fTetDdVGpQgUr4Vp00\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //직접 업로드 서명 비즈니스 서버 url(정식 환경에서는 정식 직접 업로드 서명 비즈니스 url로 교체해 주세요)\"}],\"id\":\"ttXAhkI-jitDj6fpMK7mr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //직접 업로드 서명 비즈니스 서버 코드 예제는 https://github.com/tencentyun/cos-demo/blob/main/server/direct-sign/nodejs/app.js를 참고하십시오.\"}],\"id\":\"fw_LDCv6hnEyd2GaIiwX7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" //10.91.22.16은 직접 업로드 서명 비즈니스 서버의 주소입니다. 예를 들어 위의 node 서비스와 같이, 직접 업로드 서명 비즈니스 서버에 접근할 수 있는 url이면 됩니다.\"}],\"id\":\"lY73KbZ-oqxv0TMAkdHQT\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" HttpClientRequest request = await httpClient\"}],\"id\":\"_DLesdhRo0uILATXAmuO-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" .getUrl(Uri.parse(\\\"http://10.91.22.16:3000/sts-direct-sign?ext=$ext\\\"));\"}],\"id\":\"6H5ovFtdKBe_6Mk8ZyslE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" HttpClientResponse response = await request.close();\"}],\"id\":\"Jv4X11Zs7zZIn169JZxpA\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String responseBody = await response.transform(utf8.decoder).join();\"}],\"id\":\"zqWA7rULoV8hmsQZle9j-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (response.statusCode == 200) {\"}],\"id\":\"fF0qRWX_vh-LHlM1eZK7L\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Map json = jsonDecode(responseBody);\"}],\"id\":\"bryI7RguT3VqPkJKoX6lK\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (kDebugMode) {\"}],\"id\":\"8DI7JCf8inC-VoUm0Oq0N\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print(json);\"}],\"id\":\"zeJ4-fZsKzRLY2EaaRoQx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"FgOUX5RKZO1IOwAx10WU8\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" httpClient.close();\"}],\"id\":\"dMiyx9bzWSduAGwV1ymYX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (json['code'] == 0) {\"}],\"id\":\"dWp_b38iJB0NWoKZ4OgRg\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" return json['data'];\"}],\"id\":\"D8ccGwpJCZM494MAOUTaL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } else {\"}],\"id\":\"sUP7UF0dXNoO4-kywY8EF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw Exception(\"}],\"id\":\"g7t20fyqvWEK84I1NQACR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'getStsDirectSign error code: ${json['code']}, error message: ${json['message']}');\"}],\"id\":\"yV6H5fRXRsC7xDcX_XgUu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"tAi8P9jqLY-C-hDhO-0RL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } else {\"}],\"id\":\"VVVIxNR9yvZkGZGqGHoc1\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" httpClient.close();\"}],\"id\":\"jUq2MKJIm_SPpCwBLQXTm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw Exception(\"}],\"id\":\"AYPNX5f2qORlrD_c3c-PR\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" 'getStsDirectSign HTTP error code: ${response.statusCode}');\"}],\"id\":\"aqUSGNeKCmfTq_NkoI6fX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"5v7sx_galbAplUfHw083_\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"B1PDGPtn6H0UzcjIrRgtj\",\"type\":\"code-line\"}],\"id\":\"t6ixBXIdMVCrnQD6WTcKT\",\"language\":\"java\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"획득한 직접 업로드 및 서명 정보를 사용하여 파일 업로드를 시작합니다.\"}],\"id\":\"dgraieMjWkVmr0mAuMkGm\",\"start\":false,\"type\":\"oli\"},{\"autoWrap\":false,\"children\":[{\"children\":[{\"text\":\"/// 파일 업로드\"}],\"id\":\"C3zX7rwURx9VZU9LTLCq-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"/// @param filePath 파일 경로\"}],\"id\":\"Gke9uqFaX2afoYKFuocQm\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"/// @param progressCallback 진행 상태 콜백\"}],\"id\":\"_BmbAxBOimffdPCAGWWra\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"static Future upload(String filePath, ProgressCallback progressCallback) async {\"}],\"id\":\"zU67BXHjVenu9i1H-fjWq\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" // 직접 업로드 서명 등 정보 획득\"}],\"id\":\"uzomn3JdyrNLb1RAngQu7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String ext = path.extension(filePath).substring(1);\"}],\"id\":\"zYpzvZ-oDx8lI5NymYRbl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Map directTransferData;\"}],\"id\":\"SmHdbZLdmFetOnHIwzS6c\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" try {\"}],\"id\":\"MbyMxGWmzyjb5yrxPFpWv\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" directTransferData = await _getStsDirectSign(ext);\"}],\"id\":\"0dOCkcw4lhNcUAwF5QDdf\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } catch (err) {\"}],\"id\":\"tGqniTYR097Un0wB9YPim\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (kDebugMode) {\"}],\"id\":\"eUX4v1V1f3JhHBEcMDktJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print(err);\"}],\"id\":\"OIS7rWADbqidr4j8QD9BE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"cpm9z5BCUC3vr-tYu30Ym\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw Exception(\\\"getStsDirectSign fail\\\");\"}],\"id\":\"4NH6_5dNZB1W0EFDrggBZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"6_i4N8K_0f74jfyqShJ7a\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"99I9wgKihfUPilb30QYWb\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String cosHost = directTransferData['cosHost'];\"}],\"id\":\"OvRyzmu78EQaiQuOvRumL\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String cosKey = directTransferData['cosKey'];\"}],\"id\":\"dN1aQPQ3ND-l1h1hNLzNX\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String authorization = directTransferData['authorization'];\"}],\"id\":\"KDM6N4Q2IpFaft-pq0Q--\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String securityToken = directTransferData['securityToken'];\"}],\"id\":\"8EPkkHv2FS280ERO80gti\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" String url = 'https://$cosHost/$cosKey';\"}],\"id\":\"_PSNv_j6DmSBhl71MVEYC\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"\"}],\"id\":\"aTjfCe7t-Dg-e-VSEOxbB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" File file = File(filePath);\"}],\"id\":\"tsGuNDvcM3a3o7yOufqfU\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" int fileSize = await file.length();\"}],\"id\":\"5Wa8-vhcTQS65yYVBH-nZ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" HttpClient httpClient = HttpClient();\"}],\"id\":\"gFsgrIR5lL6jTJaXmVu2k\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" HttpClientRequest request = await httpClient.putUrl(Uri.parse(url));\"}],\"id\":\"AHCBv4bjf76i3h020vlHB\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" request.headers.set('Content-Type', 'application/octet-stream');\"}],\"id\":\"PV85HvkaoOnaegBSbASDF\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" request.headers.set('Content-Length', fileSize.toString());\"}],\"id\":\"dyXU0TkOjz_MbQxima2Cr\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" request.headers.set('Authorization', authorization);\"}],\"id\":\"9Cs_OB9Sd80ET4tJf83qn\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" request.headers.set('x-cos-security-token', securityToken);\"}],\"id\":\"mjHkwo2faFnYmeEYLqkSN\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" request.headers.set('Host', cosHost);\"}],\"id\":\"wW7pQI8G8A8kHX66VgOmO\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" request.contentLength = fileSize;\"}],\"id\":\"jrEyPHw5fbClPkpIBoKQu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" Stream> stream = file.openRead();\"}],\"id\":\"RoS67uRW6BLf369jrVxx-\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" int bytesSent = 0;\"}],\"id\":\"X_-s6jRcDLvU68qHlaOz7\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" stream.listen(\"}],\"id\":\"PZyq2jJvTwWodMPzjT7wk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" (List chunk) {\"}],\"id\":\"1r6v2URsgE2kO5PXsRolt\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" bytesSent += chunk.length;\"}],\"id\":\"rqwR3cOhlnKUep2t09H5r\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" double progress = bytesSent / fileSize;\"}],\"id\":\"NpNZV2L5-kTBHA_yc_qtw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (kDebugMode) {\"}],\"id\":\"kVNxYS6h4_6HrZYGG4nZS\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print('Progress: ${progress.toStringAsFixed(2)}');\"}],\"id\":\"9PF_0aYIYflJMr0TcmCqk\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"HBo-JnMevW8S0n5XuVqUE\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" progressCallback(bytesSent, fileSize);\"}],\"id\":\"2MaK0bVzy9Jr63su8ysLi\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" request.add(chunk);\"}],\"id\":\"HsM5yIqxLOD5YTntiaHyx\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"GaChhEtpnLo9SI0xEfob9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" onDone: () async {\"}],\"id\":\"E8aSPSF4gZxIHpFyH8XCd\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" HttpClientResponse response = await request.close();\"}],\"id\":\"wbheHcvbaF-sq7QsInQ5S\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (response.statusCode == 200) {\"}],\"id\":\"7Dqq13o4jl0CmNAvuCuyJ\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (kDebugMode) {\"}],\"id\":\"nVMSMNjvvxSS2IUex5FG9\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print('업로드 성공');\"}],\"id\":\"SbjT_cuPoq92vbsOjJJEu\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"xGuUO70xQiyQ6W9ZxGnDM\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" } else {\"}],\"id\":\"03bZoig7Nfxi0lVMnu8Ml\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw Exception(\\\"업로드 실패 $response\\\");\"}],\"id\":\"D_9U50_kz5mKn1qymMr4I\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"Fo8yCa2MThDY7jpG0puHe\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"TmblYDhTZRC44BBEvN6yl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" onError: (error) {\"}],\"id\":\"mUEvVociWIS4bm_Yd1R45\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" if (kDebugMode) {\"}],\"id\":\"ctWeNhnU-xws55gvGV5Kw\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" print('Error: $error');\"}],\"id\":\"PuiwHyZcXTkPLl3rmaQkI\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" }\"}],\"id\":\"_HojV2zotxbJpkv7_Xfy2\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" throw Exception(\\\"업로드 실패 ${error.toString()}\\\");\"}],\"id\":\"XSeKBCFjBboGXzcyq40Vl\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" },\"}],\"id\":\"X53X-XxSPaKzk1Glfq6Wc\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" cancelOnError: true,\"}],\"id\":\"GHwGWlGW5GZmldZIhdUAz\",\"type\":\"code-line\"},{\"children\":[{\"text\":\" );\"}],\"id\":\"EdVyOPpeAenDg37eH-X8b\",\"type\":\"code-line\"},{\"children\":[{\"text\":\"}\"}],\"id\":\"atnnsOZ9rzxN-KwB4--g0\",\"type\":\"code-line\"}],\"id\":\"a4q7qfMj3yGByZicotNtV\",\"language\":\"java\",\"type\":\"code-block\"},{\"children\":[{\"text\":\"관련 문서\"}],\"id\":\"rV-nnhylzL0B_QzLjDQJL\",\"nodeId\":\".E7.9B.B8.E5.85.B3.E6.96.87.E6.A1.A3\",\"type\":\"h2\"},{\"children\":[{\"text\":\"더 많은 인터페이스 호출 요구 사항이 있는 경우 \"},{\"children\":[{\"text\":\"Flutter SDK\"}],\"id\":\"4kqZFO5APx5jLn__2TR2y\",\"linkTarget\":\"blank\",\"linkTitle\":\"https://www.tencentcloud.com/document/product/436/53959\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/53959\"},\"type\":\"ref\"},{\"text\":\"를 참고하십시오.\"}],\"id\":\"ez9EUf2HMBr-iJeaoD7Zd\",\"type\":\"p\"}]"}},"74925":{"categoryId":436,"weight":2,"type":"page","extension":"","pid":32967,"id":74925,"lang":"ko","title":"사용자 정의 SCF 함수로 COS 버킷 암호화 구성 점검 구성 사례","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2026-01-14 22:12:36","recentReleaseTime":"2026-01-14 22:12:36","content":{"title":"사용자 정의 SCF 함수로 COS 버킷 암호화 구성 점검 구성 사례","body":"

소개

사용자 정의 SCF 함수를 사용하여 COS 버킷 암호화 구성 점검을 구성할 수 있습니다. 구성이 성공하면 버킷은 감사 및 거버넌스를 수행할 수 있습니다. 자세한 내용은 Config를 참고하십시오.

사전 준비

작업 단계

단계 1: SCF(Serverless Cloud Function) 생성

1. SCF 콘솔에 로그인한 후 왼쪽 네비게이션 바에서 함수 서비스를 클릭하여 함수 목록 페이지로 이동합니다.
2. SCF를 생성합니다. 신규 생성을 클릭하여 SCF를 생성합니다. 생성에는 다음 옵션들을 구성해야 합니다.
템플릿 선택: 템플릿 유형에 처음부터 시작을 선택합니다.
기본 구성:
함수 유형:이벤트 함수를 선택합니다.
함수 이름: 기본 함수 이름을 사용하거나 사용자 정의 함수 이름을 사용할 수 있습니다.
리전: 버킷이 위치한 리전을 선택합니다. 다음은 광저우를 예로 들어 설명합니다.
실행 환경: Go 1을 선택합니다.
시간대: 기본 설정 UTC를 사용합니다.
\"\"

함수 코드:
제출 방법: 로컬 zip 패키지 업로드를 선택하여 준비 작업 중 다운로드한 zip 패키지를 업로드합니다.
실행 방법: 기본 설정 main을 사용합니다.
\"\"

로그 구성: 설정 필요가 없습니다.

고급 구성: 고급 구성 옵션을 클릭하여 구성 세부 정보를 펼칩니다. 권한 구성에서 활성화 를 클릭하여 실행 역할을 활성화합니다.
\"\"

3. 권한 부여 동의하고 제출합니다.
\"\"

4. 새 실행 역할 생성를 클릭합니다.

\"\"



단계 2: 새 사용자 정의 역할 생성

1. CAM 콘솔에 로그인하여 역할>새 역할 생성>Tencent Cloud 제품 서비스를 클릭합니다. 새 사용자 정의 역할 페이지에서 제품 서비스를 검색하고 Serverless Cloud Function(SCF)를 선택한 후 다음 단계를 클릭합니다.
\"\"

2. 정책 목록에서 QcloudCOSBucketConfigRead 정책과 QcloudConfigFullAccess 정책을 검색하여 선택합니다. 완료 후 다음 단계를 클릭합니다.
\"\"

3. 실제 상황에 따라 역할 태그 구성 여부를 선택할 수 있습니다. 이 단계는 필수가 아닙니다. 완료 후 다음 단계를 클릭합니다.
4. 검토 페이지에서 역할 이름을 설정하고 완료를 클릭합니다. 이로써 새 사용자 정의 역할 생성의 모든 작업이 완료되었습니다.
\"\"

5. SCF 생성 페이지로 돌아갑니다. 권한 구성에서 실행 역할을 새로고침합니다. 그다음 새로 생성한 역할을 선택합니다.
\"\"

6. 서비스 약관에 동의합니다. 위 구성을 완료한 후 약관 동의를 체크하고, 완료를 클릭하면 SCF 생성이 완료됩니다.

\"\"



단계 3: 새 사용자 정의 규칙 생성

1. Config 콘솔에서 규칙 페이지를 엽니다. 새 규칙 생성>새 사용자 정의 규칙을 선택하여 규칙 구성 페이지로 들어갑니다.
\"\"

2. 사용자 정의 규칙 구성의 기본 속성 페이지에서, 기본 정보를 구성하고 방금 배포한 SCF를 선택한 후 다음 단계를 클릭합니다.
\"\"

3. 연결 리소스 페이지에서 리소스 유형에 따라 COS를 선택합니다.
\"\"

태그별. 지정 태그의 버킷을 점검해야 하는 경우, COS 콘솔의 버킷 목록 페이지에서 점검이 필요한 버킷에 태그를 설정할 수 있습니다.
버킷 목록 페이지로 이동합니다.
\"\"

버킷의 태그를 설정합니다.
해당 태그를 선택하여 작업을 완료합니다.
\"\"

리전별. 특정 리전의 버킷을 점검해야 하는 경우 이 필드를 구성할 수 있습니다. 예: 광저우 리전의 버킷을 점검해야 하는 경우, 리전별 드롭다운 메뉴에서 광저우를 선택할 수 있습니다.
\"\"

4. 이전 단계 구성을 완료한 후 다음 단계를 클릭하여 트리거 메커니즘으로 들어갑니다.
규칙 트리거 메커니즘: 주기적 실행을 선택합니다.
규칙 트리거 조건: 실제 상황에 따라 선택할 수 있으며, 최소 선택 가능한 시간은 1시간입니다.
\"\"

5. 매개변수 설정: 구성이 필요 없으며 건너뛸 수 있습니다.
6. 미리보기 및 저장: 구성이 필요 없습니다. 직접 확인을 클릭하십시오. 이로써 사용자 정의 규칙 생성을 완료했습니다.

단계 5: 전송 서비스 설정

1. Config 콘솔에서 설정 > 전송 서비스를 클릭합니다. 활성화한 후 구성 점검 결과가 CLS에 전송됩니다.
주의:
Config 서비스를 아직 활성화하지 않았다면, 안내에 따라 서비스를 활성화하면 됩니다.
현재 점검 결과는 매일 새벽 0시 15분에 정기 전송만 지원합니다.
2. 자세한 구성은 다음과 같습니다.
전송 유형 선택: 로그 서비스 CLS를 선택합니다.
전송 서비스 이름: 사용자 정의 가능합니다.
전송 내용: 구성 변경 이력을 선택합니다.
로그 주제: 기존 사용 또는 새로 생성 모두 가능합니다. 아래에서는 기존 사용을 예로 설명합니다.
리전: 로그 주제가 위치한 리전을 선택합니다.
로그 주제 이름: 필요에 따라 로그 주제의 이름을 구성합니다.
\"\"

이로써 모든 구성을 완료했습니다.
3. Config 콘솔에서 규칙을 클릭하면 실행 결과를 확인할 수 있습니다.
","recentReleaseTime":"2026-01-14 14:12:36","slate":"[{\"type\":\"h2\",\"children\":[{\"text\":\"소개\"}],\"id\":\"JMgRl5G0zc7lDL2obMEUU\",\"nodeId\":\"51fe44dd-4724-4b5a-835e-4c79d0e422c4\"},{\"type\":\"p\",\"id\":\"O92mPpEefmFT2v5UtXPEq\",\"children\":[{\"text\":\"사용자 정의 SCF 함수를 사용하여 COS 버킷 암호화 구성 점검을 구성할 수 있습니다. 구성이 성공하면 버킷은 감사 및 거버넌스를 수행할 수 있습니다. 자세한 내용은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/1164/51542\"},\"children\":[{\"text\":\"Config\"}],\"id\":\"_s8Acr8Txw9dawaZLOKte\"},{\"text\":\"를 참고하십시오.\"}]},{\"type\":\"h2\",\"id\":\"4B3f6JejJETBWtqsqtfxs\",\"children\":[{\"text\":\"사전 준비\"}],\"nodeId\":\"95e6d4f5-2cdf-42db-ab5c-c916230198b4\"},{\"type\":\"p\",\"children\":[{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://cosbrowser-1253960454.cos.ap-shanghai.myqcloud.com/software/Inspecting-cos-bucket-encryption/Inspecting-cos-bucket-encryption.zip\"},\"children\":[{\"text\":\"Inspecting-cos-bucket-encryption.zip 압축 파일\"}],\"id\":\"VO6_vOy8YetAt5pdAMflM\"},{\"text\":\"을 다운로드하십시오.\"}],\"id\":\"XlfFJRP3JpTI9-9sW23JU\"},{\"type\":\"h2\",\"id\":\"9JNQjxhd05CvPxfUiTy-9\",\"children\":[{\"text\":\"작업 단계\"}],\"nodeId\":\"5b50e982-c79e-4eb6-ac12-448610d3e36a\"},{\"type\":\"h3\",\"id\":\"tM_xMejfdcrhOpwESkDtr\",\"nodeId\":\"23cc731c-601d-4a88-9f78-e3b36b681815\",\"children\":[{\"text\":\"단계 1: SCF(Serverless Cloud Function) 생성\"}]},{\"type\":\"oli\",\"children\":[{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/scf/list?rid=1&ns=default \"},\"children\":[{\"text\":\"SCF 콘솔\"}],\"id\":\"4M6IF6Qo7HlglEsY4GZcj\"},{\"text\":\"에 로그인한 후 왼쪽 네비게이션 바에서 \"},{\"text\":\"함수 서비스\",\"b\":1},{\"text\":\"를 클릭하여 함수 목록 페이지로 이동합니다.\"}],\"id\":\"RqQNexKbak5MzzW85qy0v\"},{\"type\":\"oli\",\"children\":[{\"text\":\"SCF를 생성합니다. \"},{\"text\":\"신규 생성\",\"b\":1},{\"text\":\"을 클릭하여 SCF를 생성합니다. 생성에는 다음 옵션들을 구성해야 합니다.\"}],\"id\":\"Fa8C5X51Pf3RaARZTlbQ-\"},{\"type\":\"uli\",\"id\":\"84oI1U6nD6xJI21XYSF83\",\"children\":[{\"text\":\"템플릿 선택: 템플릿 유형에 \"},{\"text\":\"처음부터 시작\",\"b\":1},{\"text\":\"을 선택합니다.\"}],\"indent\":1},{\"type\":\"uli\",\"id\":\"-HbNqxy4XrEJho_Mvo-aZ\",\"children\":[{\"text\":\"기본 구성:\"}],\"indent\":1},{\"type\":\"uli\",\"children\":[{\"text\":\"함수 유형:\"},{\"text\":\"이벤트 함수\",\"b\":1},{\"text\":\"를 선택합니다.\"}],\"id\":\"E3UiEtDZ2Z00fAMH2xyu1\",\"indent\":2},{\"type\":\"uli\",\"id\":\"Q9izHVjJkG9couz4_QmVr\",\"children\":[{\"text\":\"함수 이름: 기본 함수 이름을 사용하거나 사용자 정의 함수 이름을 사용할 수 있습니다.\"}],\"indent\":2},{\"type\":\"uli\",\"id\":\"9ZkfptvsjL0QmbyzE6w70\",\"children\":[{\"text\":\"리전: \"},{\"text\":\"버킷이 위치한 리전\",\"b\":1},{\"text\":\"을 선택합니다. 다음은 \"},{\"text\":\"광저우\",\"b\":1},{\"text\":\"를 예로 들어 설명합니다.\"}],\"indent\":2},{\"type\":\"uli\",\"id\":\"1_Ht1lKKxMi8EXujnq8gg\",\"children\":[{\"text\":\"실행 환경: \"},{\"text\":\"Go 1\",\"b\":1},{\"text\":\"을 선택합니다.\"}],\"indent\":2},{\"type\":\"uli\",\"id\":\"4A1qfzTPTICFkbZVf8J_f\",\"children\":[{\"text\":\"시간대: 기본 설정 \"},{\"text\":\"UTC\",\"b\":1},{\"text\":\"를 사용합니다.\"}],\"indent\":2},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/626f7267ef9211f0a6f452540097cba1.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"V7z8ITacmeiptRNGzccSI\",\"naturalSize\":[908,522],\"size\":[791,454.7378854625551],\"indent\":2},{\"type\":\"uli\",\"id\":\"K18iV1ZnkqPtWVSfc8kjJ\",\"children\":[{\"text\":\"함수 코드:\"}],\"indent\":1},{\"type\":\"uli\",\"children\":[{\"text\":\"제출 방법: \"},{\"text\":\"로컬 zip 패키지 업로드\",\"b\":1},{\"text\":\"를 선택하여 준비 작업 중 다운로드한 zip 패키지를 업로드합니다.\"}],\"id\":\"gndygH6Avhxebfm5f_Jqa\",\"indent\":2},{\"type\":\"uli\",\"children\":[{\"text\":\"실행 방법: 기본 설정 \"},{\"text\":\"main\",\"b\":1},{\"text\":\"을 사용합니다.\"}],\"id\":\"VHJWrBtQvZ7JsnKS7B2Ot\",\"indent\":2},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/656f6a3cef9211f09d46525400a31896.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"WloxLfyh5gNyf1a6VZTGV\",\"naturalSize\":[821,238],\"size\":[556,161.17904993909866],\"indent\":2},{\"type\":\"uli\",\"children\":[{\"text\":\"로그 구성: 설정 필요가 없습니다.\"}],\"id\":\"K4P4bhwCsQVz418iOUYoc\",\"indent\":1},{\"type\":\"p\",\"children\":[{\"text\":\"\"},{\"text\":\"\"}],\"id\":\"5iGtGZ7-JSOBeSo3tyux2\",\"indent\":2},{\"type\":\"uli\",\"id\":\"4Iv5W8OnuqZ-wXrMzssI7\",\"children\":[{\"text\":\" 고급 구성: \"},{\"text\":\"고급 구성\",\"b\":1},{\"text\":\" 옵션을 클릭하여 구성 세부 정보를 펼칩니다. \"},{\"text\":\"권한 구성\",\"b\":1},{\"text\":\"에서 \"},{\"text\":\"활성화\",\"b\":1},{\"text\":\" 를 클릭하여 실행 역할을 활성화합니다.\"}],\"indent\":1},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/6ead5ba0ef9211f0bfd65254001d6acc.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"4ccmIuInCG6DALtHHfWrG\",\"naturalSize\":[239,87],\"size\":[298,108.47698744769876],\"indent\":2},{\"type\":\"oli\",\"id\":\"YqTu_lIDm-S1dqvB8sjuU\",\"children\":[{\"text\":\"권한 부여 동의하고 \"},{\"text\":\"제출\",\"b\":1},{\"text\":\"합니다.\"}]},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/716cbf9aef9211f0bfd65254001d6acc.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"0tYeggpZ0bC6lEWOdMSsq\",\"naturalSize\":[681,334],\"size\":[675,331.057268722467],\"indent\":1},{\"type\":\"oli\",\"id\":\"jatLnfa8s1WDhx-WIfJMb\",\"children\":[{\"text\":\"새 실행 역할 생성\",\"b\":1},{\"text\":\"를 클릭합니다.\"}]},{\"type\":\"p\",\"id\":\"bp_xJ6FKMEF18UF5NDPcr\",\"children\":[{\"text\":\"\"},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/74cc2989ef9211f0bdf6525400074c32.png\",\"alt\":\"\",\"inline\":true,\"children\":[{\"text\":\"\"}],\"id\":\"3cS9Nkz29dhVteG_zDh1B\",\"naturalSize\":[501,128],\"size\":[819,209.24550898203591]},{\"text\":\"\"}],\"indent\":1},{\"type\":\"h3\",\"id\":\"qK-Xpg6uDd5NyPAkeELHR\",\"children\":[{\"text\":\"단계 2: \"},{\"text\":\"새 사용자 정의 역할 생성\",\"b\":1}],\"nodeId\":\"30cdbfe6-d96a-4c3e-b553-7179d465ffc8\"},{\"type\":\"oli\",\"id\":\"horRfALvLZlv9DqCgTh-z\",\"children\":[{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cam\"},\"children\":[{\"text\":\"CAM 콘솔\"}],\"id\":\"m2RNIU8P-I5F0_BdWn552\"},{\"text\":\"에 로그인하여 \"},{\"text\":\"역할\",\"b\":1},{\"text\":\">\"},{\"b\":1,\"text\":\"새 역할 생성\"},{\"text\":\">\"},{\"b\":1,\"text\":\"Tencent Cloud 제품 서비스\"},{\"text\":\"를 클릭합니다. \"},{\"text\":\"새 사용자 정의 역할\",\"b\":1},{\"text\":\" 페이지에서 제품 서비스를 검색하고 \"},{\"text\":\"Serverless Cloud Function(SCF)\",\"b\":1},{\"text\":\"를 선택한 후 \"},{\"text\":\"다음 단계\",\"b\":1},{\"text\":\"를 클릭합니다.\"}]},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/77f3b4faef9211f09d46525400a31896.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"31J_Q563Ky50OkYMmh-Yl\",\"naturalSize\":[1302,114],\"size\":[840,73.54838709677419],\"indent\":1},{\"type\":\"oli\",\"children\":[{\"text\":\"정책 목록에서 \"},{\"text\":\"QcloudCOSBucketConfigRead\",\"b\":1},{\"text\":\" 정책과 \"},{\"text\":\"QcloudConfigFullAccess\",\"b\":1},{\"text\":\" 정책을 검색하여 선택합니다. 완료 후 \"},{\"text\":\"다음 단계\",\"b\":1},{\"text\":\"를 클릭합니다.\"}],\"id\":\"7ev7jztNid2qNMGcwU33d\"},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7aeddfbbef9211f0bdf6525400074c32.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"sbwVCnZCN3LJPy_HdAz6A\",\"naturalSize\":[1285,246],\"size\":[840,160.8093385214008],\"indent\":1},{\"type\":\"oli\",\"children\":[{\"text\":\"실제 상황에 따라 역할 태그 구성 여부를 선택할 수 있습니다. 이 단계는 필수가 아닙니다. 완료 후 \"},{\"text\":\"다음 단계\",\"b\":1},{\"text\":\"를 클릭합니다.\"}],\"id\":\"R588y4iJmtiV5eopOeVfT\"},{\"type\":\"oli\",\"id\":\"zrjZrQg5gz_kJtB26SyRH\",\"children\":[{\"text\":\"검토\",\"b\":1},{\"text\":\" 페이지에서 역할 이름을 설정하고 \"},{\"text\":\"완료\",\"b\":1},{\"text\":\"를 클릭합니다. 이로써 새 사용자 정의 역할 생성의 모든 작업이 완료되었습니다.\"}]},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7de9faa6ef9211f0bfd65254001d6acc.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"37GdzV1xQfHEnvldjULUq\",\"naturalSize\":[889,488],\"size\":[841,461.6512935883014],\"indent\":1},{\"type\":\"oli\",\"id\":\"dacbxdZPlqXzdW2lkiPBk\",\"children\":[{\"text\":\"SCF 생성 페이지로 돌아갑니다. 권한 구성에서 실행 역할을 새로고침합니다. 그다음 새로 생성한 역할을 선택합니다.\"}]},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/827b2ad3ef9211f09d46525400a31896.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"PvwtqkWwvja0k2bl5t1J9\",\"naturalSize\":[500,246],\"size\":[802,394.584],\"indent\":1},{\"type\":\"oli\",\"id\":\"NUIYN5i6sXJwoWYBh3NkC\",\"children\":[{\"text\":\"서비스 약관에 동의합니다. 위 구성을 완료한 후 약관 동의를 체크하고, \"},{\"text\":\"완료\",\"b\":1},{\"text\":\"를 클릭하면 SCF 생성이 완료됩니다.\"}]},{\"type\":\"p\",\"children\":[{\"text\":\"\"},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/857ae1b7ef9211f0bdf6525400074c32.png\",\"alt\":\"\",\"inline\":true,\"children\":[{\"text\":\"\"}],\"id\":\"CaOfYED2i5QcfuC9-Asq7\",\"naturalSize\":[974,329],\"size\":[781,263.80800821355234]},{\"text\":\"\"}],\"id\":\"nkrziksUbDYOFtjhGulQp\",\"align\":\"left\",\"indent\":1},{\"type\":\"h3\",\"children\":[{\"text\":\"단계 3: 새 사용자 정의 규칙 생성\"}],\"id\":\"uDmCCKle8NCz95L1bgvNp\",\"nodeId\":\"8002b2c2-f966-4de0-9a67-f8d9d684115f\"},{\"type\":\"oli\",\"id\":\"Ca21SrrIBkLRMUldoMxHP\",\"children\":[{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cfa/\"},\"children\":[{\"text\":\"Config\"}],\"id\":\"AFDa8oBokX_-0ZPB3LnXn\"},{\"text\":\" 콘솔에서 \"},{\"text\":\"규칙\",\"b\":1},{\"text\":\" 페이지를 엽니다. \"},{\"text\":\"새 규칙 생성\",\"b\":1},{\"text\":\">\"},{\"b\":1,\"text\":\"새 사용자 정의 규칙\"},{\"text\":\"을 선택하여 규칙 구성 페이지로 들어갑니다.\"}],\"align\":\"left\"},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/883f22f5ef9211f0b306525400380f7d.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"1e_D4ykeefnBI2D3j68ZM\",\"naturalSize\":[422,185],\"size\":[506,221.824644549763],\"indent\":1},{\"type\":\"oli\",\"children\":[{\"text\":\"사용자 정의 규칙 구성의 \"},{\"text\":\"기본 속성\",\"b\":1},{\"text\":\" 페이지에서\"},{\"b\":1,\"text\":\",\"},{\"text\":\" 기본 정보를 구성하고 방금 배포한 SCF를 선택한 후 \"},{\"text\":\"다음 단계\",\"b\":1},{\"text\":\"를 클릭합니다.\"}],\"id\":\"bjLN0W4QFA76ehbPHZwn0\"},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/8b4b722bef9211f09d62525400ecee81.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"dCaMtYWmwQrCh0dah-65r\",\"naturalSize\":[720,486],\"size\":[882,595.35],\"indent\":1},{\"type\":\"oli\",\"children\":[{\"text\":\"연결 리소스\",\"b\":1},{\"text\":\" 페이지에서 리소스 유형에 따라 \"},{\"text\":\"COS\",\"b\":1},{\"text\":\"를 선택합니다.\"}],\"id\":\"odJzCEqxIyQM5fO30H8-b\"},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/8e327b78ef9211f0bdf6525400074c32.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"8-_tRZzdXyRePoqNr_CbM\",\"naturalSize\":[845,398],\"size\":[839,395.1739644970414],\"indent\":1},{\"type\":\"uli\",\"children\":[{\"text\":\"태그별\",\"b\":1},{\"text\":\". 지정 태그의 버킷을 점검해야 하는 경우, COS 콘솔의 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cos/bucket\"},\"children\":[{\"text\":\"버킷 목록 페이지\"}],\"id\":\"L0BUD7tAN7ENVS_ePJdJ3\"},{\"text\":\"에서 점검이 필요한 버킷에 태그를 설정할 수 있습니다.\"}],\"id\":\"AduKcU_hiUOEKoKlmd-3S\",\"indent\":1},{\"type\":\"uli\",\"id\":\"Y4-QcIaFZiaCfTNEiac0B\",\"children\":[{\"text\":\" 버킷 목록 페이지로 이동합니다.\"}],\"indent\":2},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/921d5e9aef9211f09965525400370dda.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"RXohuZaUvCuTFSpOn68dd\",\"naturalSize\":[1364,105],\"size\":[877.6,67.55718475073314],\"indent\":3},{\"type\":\"uli\",\"children\":[{\"text\":\"버킷의 태그를 설정합니다.\"}],\"id\":\"OPDEGzA-Nsl75VmZL2m_q\",\"at\":[50],\"indent\":2},{\"type\":\"uli\",\"children\":[{\"text\":\"해당 태그를 선택하여 작업을 완료합니다.\"}],\"id\":\"72vDKGZWShJCH-_eDD_Dz\",\"indent\":2},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/9bae88e1ef9211f0bfd65254001d6acc.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"qu4vqDFM_KpNxrY9NcZUO\",\"naturalSize\":[563,240],\"size\":[877.6,374.1101243339254],\"indent\":3},{\"type\":\"uli\",\"id\":\"NBzUqvqESLpLDykovZAku\",\"children\":[{\"text\":\"리전별\",\"b\":1},{\"text\":\". 특정 리전의 버킷을 점검해야 하는 경우 이 필드를 구성할 수 있습니다. 예: 광저우 리전의 버킷을 점검해야 하는 경우, \"},{\"text\":\"리전별\",\"b\":1},{\"text\":\" 드롭다운 메뉴에서 광저우를 선택할 수 있습니다.\"}],\"indent\":1},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/9ef77277ef9211f09965525400370dda.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"8qvheM1ggB33aFxyVMOBX\",\"naturalSize\":[594,453],\"size\":[814,620.7777777777778],\"indent\":2},{\"type\":\"oli\",\"children\":[{\"text\":\"이전 단계 구성을 완료한 후 \"},{\"text\":\"다음 단계\",\"b\":1},{\"text\":\"를 클릭하여 \"},{\"b\":1,\"text\":\"트리거 메커니즘\"},{\"text\":\"으로 들어갑니다.\"}],\"id\":\"rif2fI-NYzEtkSwS3LDWL\"},{\"type\":\"uli\",\"id\":\"D1VOmbe8jweVCHfiZi7VQ\",\"children\":[{\"text\":\"규칙 트리거 메커니즘\",\"b\":1},{\"text\":\": \"},{\"text\":\"주기적 실행\",\"b\":1},{\"text\":\"을 선택합니다.\"}],\"indent\":1},{\"type\":\"uli\",\"id\":\"5Pn3SJF6uf4Ag6kQ5xBcN\",\"children\":[{\"text\":\"규칙 트리거 조건\",\"b\":1},{\"text\":\": 실제 상황에 따라 선택할 수 있으며, 최소 선택 가능한 시간은 \"},{\"text\":\"1시간\",\"b\":1},{\"text\":\"입니다.\"}],\"indent\":1},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/a38f2bfeef9211f0bdf6525400074c32.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"l2k917r_Tb2IAZxuQ8Hud\",\"naturalSize\":[607,410],\"size\":[800,540.3624382207578],\"indent\":1},{\"type\":\"oli\",\"children\":[{\"text\":\"매개변수 설정\",\"b\":1},{\"text\":\": 구성이 필요 없으며 건너뛸 수 있습니다.\"}],\"id\":\"OsoObrLuFhyb-Ikn6gdE5\"},{\"type\":\"oli\",\"id\":\"WTafehgFP05-O-S4HuMD6\",\"children\":[{\"text\":\"미리보기 및 저장\",\"b\":1},{\"text\":\": 구성이 필요 없습니다. 직접 확인을 클릭하십시오. 이로써 사용자 정의 규칙 생성을 완료했습니다.\"}]},{\"type\":\"h3\",\"children\":[{\"text\":\"단계 5: 전송 서비스 설정\"}],\"id\":\"b2ceXRMFAf1UuZJylMsBJ\",\"nodeId\":\"a6eeaf82-b6f8-4afd-aa2b-471bfe01e947\"},{\"type\":\"oli\",\"id\":\"cxJwEUfVNc6OFB_XyY9t1\",\"children\":[{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/cfa\"},\"children\":[{\"text\":\"Config\"}],\"id\":\"xbbl7_82ZGcg-Yl5DtAfi\"},{\"text\":\" 콘솔에서 \"},{\"text\":\"설정\",\"b\":1},{\"text\":\" > \"},{\"text\":\"전송 서비스\",\"b\":1},{\"text\":\"를 클릭합니다. 활성화한 후 구성 점검 결과가 CLS에 전송됩니다.\"}]},{\"type\":\"hint\",\"hintType\":\"alert\",\"children\":[{\"type\":\"p\",\"children\":[{\"b\":1,\"text\":\"주의:\",\"color\":\"#04C8DC\"}],\"id\":\"Xb4WSk-S7snVz1HnsFzpz\"},{\"type\":\"uli\",\"id\":\"OTjga6Zks4qzpom4AOEiQ\",\"children\":[{\"text\":\"Config 서비스를 아직 활성화하지 않았다면, 안내에 따라 서비스를 활성화하면 됩니다.\"}],\"at\":[65,1]},{\"type\":\"uli\",\"id\":\"fFoTeNIcaRqnhYo5Use4c\",\"at\":[65,1],\"children\":[{\"text\":\"현재 점검 결과는 매일 새벽 0시 15분에 정기 전송만 지원합니다.\"}]}],\"id\":\"a1yjGvCurwZMJOeSNskp8\",\"indent\":1},{\"type\":\"oli\",\"id\":\"tewGJcbusJp9AWSm5j_Df\",\"children\":[{\"text\":\"자세한 구성은 다음과 같습니다.\"}]},{\"type\":\"uli\",\"id\":\"H5VyGLqZMt4sB7uAi42Y8\",\"children\":[{\"text\":\"전송 유형 선택\",\"b\":1},{\"text\":\": \"},{\"text\":\"로그 서비스 CLS\",\"b\":1},{\"text\":\"를 선택합니다.\"}],\"indent\":1},{\"type\":\"uli\",\"id\":\"Und6WOwERuyVuhiGPHpmD\",\"children\":[{\"text\":\"전송 서비스 이름\",\"b\":1},{\"text\":\": 사용자 정의 가능합니다.\"}],\"indent\":1},{\"type\":\"uli\",\"id\":\"6zSpjrryYocLnMLB3aZ6q\",\"indent\":1,\"children\":[{\"text\":\"전송 내용:\",\"b\":1},{\"text\":\" \"},{\"text\":\"구성 변경 이력\",\"b\":1},{\"text\":\"을 선택합니다.\"}]},{\"type\":\"uli\",\"id\":\"5Izznq5h7pPmYkLN4QgBL\",\"children\":[{\"text\":\"로그 주제\",\"b\":1},{\"text\":\": \"},{\"text\":\"기존 사용\",\"b\":1},{\"text\":\" 또는 새로 생성 모두 가능합니다. 아래에서는 기존 사용을 예로 설명합니다.\"}],\"indent\":1},{\"type\":\"uli\",\"id\":\"oOOU4Lat69nmN4W4DGIF1\",\"children\":[{\"text\":\"리전\",\"b\":1},{\"text\":\": 로그 주제가 위치한 리전을 선택합니다.\"}],\"indent\":1},{\"type\":\"uli\",\"id\":\"dOwtAkbPaScKrtLJ622Qf\",\"children\":[{\"text\":\"로그 주제 이름\",\"b\":1},{\"text\":\": 필요에 따라 로그 주제의 이름을 구성합니다.\"}],\"indent\":1},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/a6cca4acef9211f09d62525400ecee81.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"AUywHswfx2CFwZec47E4S\",\"naturalSize\":[589,379],\"size\":[624,401.52122241086585],\"indent\":1},{\"type\":\"p\",\"id\":\"q8PqM2FQqyxxgX5aKwVZj\",\"children\":[{\"text\":\"이로써 모든 구성을 완료했습니다.\"}]},{\"type\":\"oli\",\"id\":\"u5CcXt5QOfRdaPUjqIQTW\",\"children\":[{\"text\":\"Config\",\"diff\":{\"type\":\"insert\"}},{\"text\":\" 콘솔에서 \"},{\"text\":\"규칙\",\"diff\":{\"type\":\"insert\"}},{\"text\":\"을 클릭하면 실행 결과를 확인할 수 있습니다.\"}],\"at\":[75]}]"}},"74927":{"categoryId":436,"weight":1,"type":"page","extension":"","pid":34079,"id":74927,"lang":"ko","title":"Django + COS를 활용한 웹 애플리케이션 클라우드 스토리지 솔루션","pdfUrl":"","docType":"default","children":[],"firstReleaseTime":"2025-12-24 19:02:07","recentReleaseTime":"2025-12-24 19:02:07","content":{"title":"Django + COS를 활용한 웹 애플리케이션 클라우드 스토리지 솔루션","body":"

소개

Django는 Python 기반의 오픈소스 웹 애플리케이션 프레임워크로, 웹 애플리케이션 개발 과정을 크게 간소화하였습니다. 현대 웹 애플리케이션의 요구를 보다 잘 충족시키기 위해 Django는 클라우드 스토리지를 포함한 다양한 확장 기능을 제공하고 있습니다.
본 문서에서는 COS 플러그인을 사용하여 원격 첨부 파일 기능을 구현하고 Django 애플리케이션의 데이터를 Tencent Cloud 의 COS(Cloud Object Storage)에 저장하는 방법을 주로 소개합니다.

전제 조건

이미 COS 버킷을 갖추고 있어야 합니다. 버킷이 없으면 버킷 생성 작업 가이드를 참조하시기 바랍니다.
이미 서버(예: Cloud Virtual Machine(CVM))를 생성된 상태이어야 합니다. 관련 가이드는 CVM 제품 문서를 참고하십시오.

환경 종속성

Python 버전: 3.8 버전 이상. 본 문서에서는 Python 3.12.0 버전을 예시로 설명합니다.
COS Python 버전: 1.9.31 버전 이상. 설치 방법은 COS Python SDK 시작하기을 참고하십시오. 본 문서에서는 COS Python 1.9.31 버전을 예시로 설명합니다.
Django 버전: 2.2 버전 이상, 3.3 버전 미만. 본 문서에서는 3.2.18 버전을 예시로 설명합니다.

작업 절차

COS 버킷 생성

1. 공개 읽기/비공개 쓰기 접근 권한을 가진 버킷을 생성합니다. 버킷의 리전은 Django가 실행되는 CVM과 같은 리전을 권장합니다. 생성에 대한 자세한 내용은 버킷 생성 문서를 참고하십시오.
2. 버킷 목록에서 방금 생성한 버킷을 찾아 버킷 이름(예: examplebucket-1250000000)을 가져옵니다.

Django 생성

1. PyCharm 홈페이지로 이동하여 사용 중인 CVM 시스템에 해당하는 PyCharm 버전을 선택합니다.
2. CVM에 PyCharm을 설치 후 PyCharm을 열고 NEW project 또는 create project를 클릭한 다음 아래의 Django를 선택합니다.
\"\"

3. 생성 후, 사용자의 디렉터리에서 setting.py 파일을 찾아 엽니다.

\"\"


4. 그다음 아래 코드를 복사하여 붙여넣고 매개변수 설명에 따라 COS 서비스를 구성합니다.
DEFAULT_FILE_STORAGE = "django_cos_storage.TencentCOSStorage"

TENCENTCOS_STORAGE = {
"BUCKET": "xxx",
"CONFIG": {
"Region": "ap-guangzhou",
"SecretId": "xxxx",
"SecretKey": "xxxx",
}
}
매개변수 설명은 다음과 같습니다.
구성 항목
구성 값
Bucket
버킷 생성 시 사용자 정의한 이름, 예: examplebucket-1250000000.
Region
버킷 생성 시 선택한 리전.
SecretId
액세스 키(Access Key) 정보, API 키에서 생성 및 가져올 수 있습니다. 서브 계정 키를 사용하여 최소 권한 원칙에 따른 권한 부여로 사용 위험을 줄이는것을 권장합니다. 상세한 내용은 서브 계정 액세스 키 관리를 참고하십시오.
SecretKey
액세스 키(Access Key) 정보, API 키에서 생성 및 가져올 수 있습니다. 서브 계정 키를 사용하여 최소 권한 원칙에 따른 권한 부여로 사용 위험을 줄이는것을 권장합니다. 상세한 내용은 서브 계정 액세스 키 관리를 참고하십시오.

COS 플러그인 다운로드 및 구성

1. Github로 이동하여 COS 플러그인을 다운로드합니다. 다운로드 후 django_cos_storage 디렉터리를 django 프로젝트 디렉터리 안에 압축 해제합니다.
설명:
플러그인 정보를 확인하려면 terminal을 열고 pip freeze를 입력하면 해당 모듈 정보를 확인할 수 있습니다.
2. django_cos_storage 디렉터리 아래에 py 파일을 생성합니다. 예: COSStorage.py

\"\"


아래 코드를 복사하여 붙여넣습니다.
from .storage import TencentCOSStorage
from functools import wraps

def decorator(cls):

instance = None
@wraps(cls)
def inner(*args,**kwargs):
nonlocal instance
if not instance:
instance = cls(*args,**kwargs)
return instance
return inner

@decorator
class QFStorage:
def __init__(self):
pass
self.storage =TencentCOSStorage()
self.bucket =self.storage.bucket
self.client =self.storage.client

#객체 업로드
def upload_file(self, Key, LocalFilePath, PartSize=1, MAXThread=5, EnableMD5=False):
try:
response =self.client.upload_file(
Bucket=self.bucket,
Key=Key,
LocalFilePath=LocalFilePath,
PartSize=PartSize,
MAXThread=MAXThread,
EnableMD5=EnableMD5
)
return response
except Exception as e:
print('객체 업로드 실패, error:', e)
return None
3. app_cos 디렉터리의 views.py를 엽니다.

\"\"


아래 코드를 복사하여 붙여넣습니다.
from django.shortcuts import render,redirect
from django.http import HttpResponse
from django_cos_storage.COSStorage import QFStorage
from django.conf import settings


#객체 업로드

def upload_file_view(request):
response = QFStorage().upload_file(
Key='1.png',
LocalFilePath=settings.BASE_DIR / 'cessu/1.png'
)

if response:
return HttpResponse('파일 업로드 성공!')
return HttpResponse('파일 업로드 실패')
주의:
예시에서 cessu/1.png는 업로드할 로컬 파일 1.png가 프로젝트 디렉터리의 cessu 폴더에 위치함을 의미합니다. 업로드 성공 후, COS 버킷의 cessu 폴더에서 이미지 1.png를 찾을 수 있습니다.
4. djangoProject2 디렉터리에서 urls.py를 찾아 엽니다.
\"\"

아래 코드를 복사하여 붙여넣습니다.
from django.contrib import admin
from django.urls import path
from app_cos.views import *

urlpatterns = [
path('admin/', admin.site.urls),

path('upload_file/', upload_file_view),
]
5. terminal에서 python manage.py migrate를 입력한 후 실행합니다.
6. terminal에서 python manage.py createsuperuser를 입력하고, 안내에 따라 계정과 비밀번호를 입력하면 됩니다.
주의:
python manage.py createsuperuser 실행 시 pkg_resources가 없다는 오류가 발생한다면, pip install setuptools 설치 명령어를 실행하여 해결할 수 있습니다.

\"\"


7. 그 다음 terminal에서 python .\\manage.py runserver를 입력하여 실행합니다.
\"\"

8. http://127.0.0.1:8000/admin/ 사이트를 열고 방금 설정한 계정과 비밀번호를 입력하면 로그인을 완료할 수 있습니다.

\"\"


주의:
웹사이트를 열었을 때 다음과 같은 오류 발생 시:\n
\"\"

\npycharm으로 돌아가서 terminal을 다시 열고 다음을 순서대로 입력합니다.
python manage.py makemigrations
python manage.py migrate

마지막으로 terminal에서 python .\\manage.py runserver를 입력하여 실행하고 http://127.0.0.1:8000/admin/을 열면 됩니다.

Django 첨부 파일이 COS에 저장됐는지 확인

1. http://127.0.0.1:8000/upload_file에 접속하여 파일 업로드 작업을 완료합니다. 다음 그림과 같은 메시지가 표시되었다면 업로드가 성공한 것입니다.

\"\"


2. COS 콘솔에 로그인하여 이전에 생성한 버킷을 선택한후 cessu 경로에서 업로드된 이미지를 확인할 수 있습니다.
","recentReleaseTime":"2025-12-24 11:02:07","slate":"[{\"id\":\"X85JRdPhWcwf64Md4bN_U\",\"children\":[{\"text\":\"소개\"}],\"nodeId\":\".E7.AE.80.E4.BB.8B\",\"type\":\"h2\"},{\"id\":\"5t4XMIWsLKSpqNrjxotkw\",\"children\":[{\"id\":\"LBHl6JP_17UOGxGDu2rtz\",\"children\":[{\"text\":\"Django\"}],\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.djangoproject.com/\"},\"linkTarget\":\"blank\"},{\"text\":\"는 Python 기반의 오픈소스 웹 애플리케이션 프레임워크로, 웹 애플리케이션 개발 과정을 크게 간소화하였습니다. 현대 웹 애플리케이션의 요구를 보다 잘 충족시키기 위해 Django는 클라우드 스토리지를 포함한 다양한 확장 기능을 제공하고 있습니다.\"}],\"type\":\"p\"},{\"id\":\"jMCOyVyFB_knG1XrTDkoH\",\"children\":[{\"text\":\"본 문서에서는 COS 플러그인을 사용하여 원격 첨부 파일 기능을 구현하고 Django 애플리케이션의 데이터를 Tencent Cloud 의 \"},{\"id\":\"L__ME3cWs1raYcGxGmyJG\",\"children\":[{\"text\":\"COS(Cloud Object Storage)\"}],\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://cloud.tencent.com/product/cos\"},\"linkTarget\":\"blank\"},{\"text\":\"에 저장하는 방법을 주로 소개합니다.\"}],\"type\":\"p\"},{\"id\":\"2KwqwpBvwsUR6l21ogd1n\",\"children\":[{\"text\":\"전제 조건\"}],\"nodeId\":\".E5.89.8D.E6.8F.90.E6.9D.A1.E4.BB.B6\",\"type\":\"h2\"},{\"id\":\"nt1U5zR3tUiqfNLI1yx1L\",\"children\":[{\"text\":\"이미 COS 버킷을 갖추고 있어야 합니다. 버킷이 없으면 \"},{\"id\":\"aCBr2wwWogOAv3vhli-zu\",\"children\":[{\"text\":\"버킷 생성\"}],\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14106\"},\"linkTarget\":\"blank\"},{\"text\":\" 작업 가이드를 참조하시기 바랍니다.\"}],\"type\":\"uli\",\"start\":true},{\"id\":\"-Jcm8TeyX74bVLD7z8OaG\",\"children\":[{\"text\":\"이미 서버(예: Cloud Virtual Machine(CVM))를 생성된 상태이어야 합니다. 관련 가이드는 \"},{\"id\":\"AAwYRYuWZ8lRSGwAK2_9F\",\"children\":[{\"text\":\"CVM 제품 문서\"}],\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://cloud.tencent.com/document/product/213\"},\"linkTarget\":\"blank\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"uli\",\"start\":false},{\"id\":\"e8O3GDFZnvkLC6MmLfBJU\",\"children\":[{\"text\":\"환경 종속성\"}],\"nodeId\":\".E7.8E.AF.E5.A2.83.E4.BE.9D.E8.B5.96\",\"type\":\"h2\"},{\"id\":\"eusBK9qjVXPGKPg5xoaeR\",\"children\":[{\"text\":\"Python 버전: 3.8 버전 이상. 본 문서에서는 Python 3.12.0 버전을 예시로 설명합니다.\"}],\"type\":\"uli\",\"start\":false},{\"id\":\"xfpCUA9KZK5aeeisD6BhW\",\"type\":\"uli\",\"start\":false,\"children\":[{\"text\":\"COS Python 버전: 1.9.31 버전 이상. 설치 방법은 \"},{\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/12269\"},\"children\":[{\"text\":\"COS Python SDK 시작하기\"}],\"id\":\"EXCDcYZifKH09QeSDGOhp\"},{\"text\":\"을 참고하십시오. 본 문서에서는 COS Python 1.9.31 버전을 예시로 설명합니다.\"}]},{\"id\":\"_iCcD1rldxYGuXb092XnM\",\"children\":[{\"text\":\"Django 버전: 2.2 버전 이상, 3.3 버전 미만. 본 문서에서는 3.2.18 버전을 예시로 설명합니다.\"}],\"type\":\"uli\",\"start\":false},{\"id\":\"NrSivAofVEkhKLXCtb_SM\",\"children\":[{\"text\":\"작업 절차\"}],\"nodeId\":\".E5.AE.9E.E8.B7.B5.E6.AD.A5.E9.AA.A4\",\"type\":\"h2\"},{\"id\":\"UkPIoyeZvhm841xc0jO6A\",\"children\":[{\"text\":\"COS 버킷 생성\"}],\"nodeId\":\".E5.88.9B.E5.BB.BA-cos-.E5.AD.98.E5.82.A8.E6.A1.B6\",\"type\":\"h3\"},{\"id\":\"vA5cDyxygJs39jWcAyIkT\",\"children\":[{\"text\":\"공개 읽기/비공개 쓰기\",\"b\":1},{\"text\":\" 접근 권한을 가진 버킷을 생성합니다. 버킷의 리전은 Django가 실행되는 CVM과 같은 리전을 권장합니다. 생성에 대한 자세한 내용은 \"},{\"id\":\"wDEwp6SqkZ1C0Go_OViI1\",\"children\":[{\"text\":\"버킷 생성\"}],\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/436/14106\"},\"linkTarget\":\"blank\"},{\"text\":\" 문서를 참고하십시오.\"}],\"type\":\"oli\",\"start\":true},{\"id\":\"8gWNL5W_w6GRTdlaSDthz\",\"children\":[{\"text\":\"버킷 목록에서 방금 생성한 버킷을 찾아 버킷 이름(예: examplebucket-1250000000)을 가져옵니다.\"}],\"type\":\"oli\",\"start\":false},{\"id\":\"kXC0KVOfM5zL_vMotzxUn\",\"children\":[{\"text\":\"Django 생성\"}],\"nodeId\":\".E5.88.9B.E5.BB.BA-django\",\"type\":\"h3\"},{\"id\":\"KtPzit0UBLZeB6Onknr-f\",\"children\":[{\"id\":\"TT1W3cDBdQG_8qsio6z1M\",\"children\":[{\"text\":\"PyCharm 홈페이지\"}],\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.jetbrains.com.cn/en-us/pycharm/download/#section=windows\"},\"linkTarget\":\"blank\"},{\"text\":\"로 이동하여 사용 중인 CVM 시스템에 해당하는 PyCharm 버전을 선택합니다.\"}],\"type\":\"oli\",\"start\":true},{\"id\":\"M160HHtTAtGodtSvkoBFn\",\"children\":[{\"text\":\"CVM에 PyCharm을 설치 후 PyCharm을 열고 NEW project 또는 create project를 클릭한 다음 아래의 Django를 선택합니다.\"}],\"type\":\"oli\",\"start\":false},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/d5eff7cedb1a11f0b31e5254007c27c5.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"xqpsjTBkZGZOnXqj64bJl\",\"naturalSize\":[817,542],\"size\":[974,646.1542227662179]},{\"id\":\"LBRHXHTQC2w5CYrDzxLmA\",\"children\":[{\"text\":\"생성 후, 사용자의 디렉터리에서 setting.py 파일을 찾아 엽니다.\"}],\"type\":\"oli\",\"start\":false},{\"id\":\"WN0TgsjhBWkUay7XpW3nJ\",\"type\":\"p\",\"children\":[{\"text\":\"\"},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/5e909ff82c6511eeaca7525400c56988.png\",\"alt\":\"\",\"inline\":true,\"children\":[{\"text\":\"\"}],\"id\":\"ZhVEOm9sN8_xAeeyDAp7e\",\"naturalSize\":[1128,600],\"size\":[972,517]},{\"text\":\"\"}]},{\"id\":\"VqqPEnB27s9G-2ZJVdile\",\"type\":\"oli\",\"start\":false,\"children\":[{\"text\":\"그다음 아래 코드를 복사하여 붙여넣고 매개변수 설명에 따라 COS 서비스를 구성합니다.\"}]},{\"id\":\"_y5_b1gTGVrJhbxGXiUfO\",\"children\":[{\"id\":\"KpNaWSVu26nEkWNKZC3Lw\",\"children\":[{\"text\":\"DEFAULT_FILE_STORAGE = \\\"django_cos_storage.TencentCOSStorage\\\"\"}],\"type\":\"code-line\"},{\"id\":\"gzKU7-jhVzOy0_DRxb_FC\",\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"id\":\"HmElLlV3osN3P1UQuKZ5f\",\"children\":[{\"text\":\"TENCENTCOS_STORAGE = {\"}],\"type\":\"code-line\"},{\"id\":\"7LkuIZXPo6O6iUX_N6sO7\",\"children\":[{\"text\":\" \\\"BUCKET\\\": \\\"xxx\\\",\"}],\"type\":\"code-line\"},{\"id\":\"jDbYoBkTRMf_13XdU10vw\",\"children\":[{\"text\":\" \\\"CONFIG\\\": {\"}],\"type\":\"code-line\"},{\"id\":\"9zBgjMSO_z4m_7qOgwu1t\",\"children\":[{\"text\":\" \\\"Region\\\": \\\"ap-guangzhou\\\",\"}],\"type\":\"code-line\"},{\"id\":\"w-vhQ_UihThNgxgwkJ9GE\",\"children\":[{\"text\":\" \\\"SecretId\\\": \\\"xxxx\\\",\"}],\"type\":\"code-line\"},{\"id\":\"6OHudE-BD0VUdGAMzS1Br\",\"children\":[{\"text\":\" \\\"SecretKey\\\": \\\"xxxx\\\",\"}],\"type\":\"code-line\"},{\"id\":\"nXDYRSxSHDR4obQYCFKJM\",\"children\":[{\"text\":\" }\"}],\"type\":\"code-line\"},{\"id\":\"0A3xcFPG7ADu_wo9jSkmV\",\"children\":[{\"text\":\"}\"}],\"type\":\"code-line\"}],\"type\":\"code-block\",\"language\":\"json\",\"autoWrap\":false},{\"id\":\"GPrvB3AOSdl8ozaumEDH0\",\"children\":[{\"text\":\"매개변수 설명은 다음과 같습니다.\"}],\"type\":\"p\"},{\"id\":\"akleVJO_ZbYo6KBEKRbt3\",\"children\":[{\"id\":\"3fDsnsmBIJslrVGqMZMRI\",\"children\":[{\"id\":\"TqMZrDw5g3bpnGQPADOoz\",\"children\":[{\"id\":\"64qOrH-0pUIosw8_luKQz\",\"children\":[{\"text\":\"구성 항목 \"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"id\":\"evuaViY-7eoWy0CdzV313\",\"children\":[{\"id\":\"vj2HXoX_EB3kR73Yc0Wiz\",\"children\":[{\"text\":\"구성 값\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"id\":\"bPipZyq1UhWpiFfM8XPxz\",\"children\":[{\"id\":\"t9ac_90VcAGZFxxXSF6gf\",\"children\":[{\"id\":\"2uAxvIoxV6FiGhnTyx4cn\",\"children\":[{\"text\":\"Bucket\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"id\":\"sK4jIKGLkCYww_RvXOzj6\",\"children\":[{\"id\":\"GVkzTSMA6WfIdV9Ds90mc\",\"children\":[{\"text\":\"버킷 생성 시 사용자 정의한 이름, 예: examplebucket-1250000000.\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"id\":\"wBCbUH1gncmn6ex14FcJv\",\"children\":[{\"id\":\"1AWphv55j5nDQ6Sm2k8vV\",\"children\":[{\"id\":\"aMeNIVR7PW9gxoyVwqL4I\",\"children\":[{\"text\":\"Region\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"id\":\"rWJ7v2d_OCEuPr-HOpLhS\",\"children\":[{\"id\":\"_v4bSUJ784c-f4e97rWB6\",\"children\":[{\"text\":\"버킷 생성 시 선택한 리전.\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"id\":\"V87xQ_kqOFlFmpalMk3Qu\",\"children\":[{\"id\":\"H2nyOrIaqjqSx2BvwZ57i\",\"children\":[{\"id\":\"0ma_BAzm07Nm1_PZp0EIR\",\"children\":[{\"text\":\"SecretId\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"id\":\"wMAhGl12hf5Rq-zSjUeeN\",\"children\":[{\"id\":\"iFb3mP-CpKLGKdVS-JjL1\",\"children\":[{\"text\":\"액세스 키(Access Key) 정보, \"},{\"id\":\"XWUTBaM4nbqDkoh6bnmlL\",\"children\":[{\"text\":\"API 키\"}],\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/capi\"},\"linkTarget\":\"blank\"},{\"text\":\"에서 생성 및 가져올 수 있습니다. 서브 계정 키를 사용하여 최소 권한 원칙에 따른 권한 부여로 사용 위험을 줄이는것을 권장합니다. 상세한 내용은 \"},{\"id\":\"C75nCyj96GCECswC-6Hsd\",\"children\":[{\"text\":\"서브 계정 액세스 키 관리\"}],\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/598/32675\"},\"linkTarget\":\"blank\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"},{\"id\":\"vAWdzwQwfnZJ7SoM2CfUE\",\"children\":[{\"id\":\"nPnr460FN73UZhBjZxyeB\",\"children\":[{\"id\":\"LKVzUqEKlf1e3Dq-lZExJ\",\"children\":[{\"text\":\"SecretKey\"}],\"type\":\"p\"}],\"type\":\"cell\"},{\"id\":\"f99OjJtmALTqIruunwIxe\",\"children\":[{\"id\":\"Yg1DRKIQ5Ob7SUu6DDszk\",\"children\":[{\"text\":\"액세스 키(Access Key) 정보, \"},{\"id\":\"R7DlMwMFpqxr3uysnSqbG\",\"children\":[{\"text\":\"API 키\"}],\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://console.tencentcloud.com/capi\"},\"linkTarget\":\"blank\"},{\"text\":\"에서 생성 및 가져올 수 있습니다. 서브 계정 키를 사용하여 최소 권한 원칙에 따른 권한 부여로 사용 위험을 줄이는것을 권장합니다. 상세한 내용은 \"},{\"id\":\"k5lcri2TLwgkuFluTjKuO\",\"children\":[{\"text\":\"서브 계정 액세스 키 관리\"}],\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://www.tencentcloud.com/document/product/598/32675\"},\"linkTarget\":\"blank\"},{\"text\":\"를 참고하십시오.\"}],\"type\":\"p\"}],\"type\":\"cell\"}],\"type\":\"row\"}],\"type\":\"table\",\"rowHeader\":true,\"widths\":[25,75],\"widthMode\":\"percentage\"},{\"id\":\"JBJ3RXl0TRvaA4CnPbaqo\",\"children\":[{\"text\":\"COS 플러그인 다운로드 및 구성\"}],\"nodeId\":\".E4.B8.8B.E8.BD.BD.E5.92.8C.E9.85.8D.E7.BD.AE-cos-.E6.8F.92.E4.BB.B6\",\"type\":\"h3\"},{\"id\":\"53u5-cabaKb64b0Vl8lzB\",\"children\":[{\"id\":\"coZlmhMk4qjJokewnuZnk\",\"children\":[{\"text\":\"Github\"}],\"type\":\"ref\",\"props\":{\"type\":\"link\",\"url\":\"https://github.com/Tencent-Cloud-Plugins/tencentcloud-django-plugin-cos/archive/refs/heads/master.zip\"},\"linkTarget\":\"blank\"},{\"text\":\"로 이동하여 COS 플러그인을 다운로드합니다. 다운로드 후 django_cos_storage 디렉터리를 django 프로젝트 디렉터리 안에 압축 해제합니다.\"}],\"type\":\"oli\",\"start\":true},{\"id\":\"vUuApZ3lAuVAdOKLgLWGC\",\"children\":[{\"id\":\"3s-c5ZlZuh5CSDHWxHW7v\",\"children\":[{\"text\":\"설명:\",\"type\":\"text\",\"b\":1,\"color\":\"inherit\"}],\"type\":\"p\"},{\"id\":\"moN-ny52xU-LNpFYlTdmk\",\"children\":[{\"text\":\"플러그인 정보를 확인하려면 terminal을 열고 \"},{\"text\":\"pip freeze\",\"code\":1},{\"text\":\"를 입력하면 해당 모듈 정보를 확인할 수 있습니다.\"}],\"type\":\"p\"}],\"type\":\"hint\",\"hintType\":\"info\"},{\"id\":\"ovHY6yZjsNSQKEi1LrGxy\",\"children\":[{\"text\":\"django_cos_storage 디렉터리 아래에 py 파일을 생성합니다. 예: COSStorage.py\"}],\"type\":\"oli\",\"start\":false},{\"id\":\"jPL6ruqjjBN0i8WbKnIkG\",\"type\":\"p\",\"start\":false,\"children\":[{\"text\":\"\"},{\"id\":\"vLfOlfAJJRQHZNWyTP8IE\",\"children\":[{\"text\":\"\"}],\"type\":\"image\",\"inline\":true,\"alt\":\"\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/80657db9162c11ee9225525400088f3a.png\",\"naturalSize\":[847,521],\"size\":[973,598]},{\"text\":\"\"}]},{\"id\":\"uuJrT_JUHNUy4vRw9s7Rk\",\"type\":\"p\",\"start\":false,\"children\":[{\"text\":\"아래 코드를 복사하여 붙여넣습니다.\"}]},{\"id\":\"t0ydR7BRQ4_e2sc_pFgbD\",\"children\":[{\"id\":\"kfdx3WHFT_XNzXw-PYIpL\",\"children\":[{\"text\":\"from .storage import TencentCOSStorage\"}],\"type\":\"code-line\"},{\"id\":\"CIOiDeJ3ieL1TRTbFCHQI\",\"type\":\"code-line\",\"children\":[{\"text\":\"from functools import wraps\"}]},{\"id\":\"ibSUVa1eFtgbjPtxjJW74\",\"type\":\"code-line\",\"children\":[{\"text\":\"\"}]},{\"id\":\"mTii_CWFAiKD_bohqeJys\",\"type\":\"code-line\",\"children\":[{\"text\":\"def decorator(cls):\"}]},{\"id\":\"0_fN5o71m4bjDuUIZJNr0\",\"type\":\"code-line\",\"children\":[{\"text\":\"\"}]},{\"id\":\"4A74E9wKHOZbD_ngWI3iO\",\"type\":\"code-line\",\"children\":[{\"text\":\" instance = None\"}]},{\"id\":\"yVd04lB7tboMYioA6t5yr\",\"type\":\"code-line\",\"children\":[{\"text\":\" @wraps(cls)\"}]},{\"id\":\"TsmshHWyAV1PqdMy5dE5O\",\"type\":\"code-line\",\"children\":[{\"text\":\" def inner(*args,**kwargs):\"}]},{\"id\":\"ZDTNYwbYf1anK0AhG-J6v\",\"type\":\"code-line\",\"children\":[{\"text\":\" nonlocal instance\"}]},{\"id\":\"eqoVZbGCiCsqLLkFod7ZW\",\"type\":\"code-line\",\"children\":[{\"text\":\" if not instance:\"}]},{\"id\":\"zsI_Dhs7RIPrlfNfNxOwr\",\"type\":\"code-line\",\"children\":[{\"text\":\" instance = cls(*args,**kwargs)\"}]},{\"id\":\"ETmvog_0u3g4PpJ678_nf\",\"type\":\"code-line\",\"children\":[{\"text\":\" return instance\"}]},{\"id\":\"PwdYIqob3m-ej8KXjRPlj\",\"type\":\"code-line\",\"children\":[{\"text\":\" return inner\"}]},{\"id\":\"aHcSlljjuGsF-PFefz2Y9\",\"type\":\"code-line\",\"children\":[{\"text\":\"\"}]},{\"id\":\"YkbhNryj-jfo5ELUJgc3H\",\"type\":\"code-line\",\"children\":[{\"text\":\"@decorator\"}]},{\"id\":\"NUE7gF9FXvUs_ZEA6DBDc\",\"type\":\"code-line\",\"children\":[{\"text\":\"class QFStorage:\"}]},{\"id\":\"wTxGUwdTr76PGyiRBBMsi\",\"type\":\"code-line\",\"children\":[{\"text\":\" def __init__(self):\"}]},{\"id\":\"4uHfK1vtbIbWnMjiW-VX7\",\"type\":\"code-line\",\"children\":[{\"text\":\" pass\"}]},{\"id\":\"3MBtstcsHtiAZu4EkF6tg\",\"type\":\"code-line\",\"children\":[{\"text\":\" self.storage =TencentCOSStorage()\"}]},{\"id\":\"XGcWc69gI51w_ldvaUJRW\",\"type\":\"code-line\",\"children\":[{\"text\":\" self.bucket =self.storage.bucket\"}]},{\"id\":\"04wMzXYYcpZyEzEfTHz3j\",\"type\":\"code-line\",\"children\":[{\"text\":\" self.client =self.storage.client\"}]},{\"id\":\"cEwdjzoJ3SjxbDLEqgnHb\",\"type\":\"code-line\",\"children\":[{\"text\":\"\"}]},{\"id\":\"PgUZSCgQXDeYICDpk7q0G\",\"type\":\"code-line\",\"children\":[{\"text\":\" #객체 업로드\"}]},{\"id\":\"5cikypBxXnaAVF0Yn4to2\",\"type\":\"code-line\",\"children\":[{\"text\":\" def upload_file(self, Key, LocalFilePath, PartSize=1, MAXThread=5, EnableMD5=False):\"}]},{\"id\":\"_49uzxKTK_8jOAE72mvjl\",\"type\":\"code-line\",\"children\":[{\"text\":\" try:\"}]},{\"id\":\"PipPEvoPcuCSnybih49AA\",\"type\":\"code-line\",\"children\":[{\"text\":\" response =self.client.upload_file(\"}]},{\"id\":\"Q-QCpBckpKbACJy0TONFP\",\"type\":\"code-line\",\"children\":[{\"text\":\" Bucket=self.bucket,\"}]},{\"id\":\"0-Sgzm4K-Q-TKnMwbGQ9r\",\"type\":\"code-line\",\"children\":[{\"text\":\" Key=Key,\"}]},{\"id\":\"VRlgEflpCkKbu-PSPWdHX\",\"type\":\"code-line\",\"children\":[{\"text\":\" LocalFilePath=LocalFilePath,\"}]},{\"id\":\"nbS6vjTVIXA3W6RmlmHrt\",\"type\":\"code-line\",\"children\":[{\"text\":\" PartSize=PartSize,\"}]},{\"id\":\"lx1tEYx40i1cat8iijjyn\",\"type\":\"code-line\",\"children\":[{\"text\":\" MAXThread=MAXThread,\"}]},{\"id\":\"RqfbpPucDmOcZj0t6RgQz\",\"type\":\"code-line\",\"children\":[{\"text\":\" EnableMD5=EnableMD5\"}]},{\"id\":\"OgLyom-ZY1VI0cuAsu8oB\",\"type\":\"code-line\",\"children\":[{\"text\":\" )\"}]},{\"id\":\"MHoGKBbAbubiFAqrxfBt5\",\"type\":\"code-line\",\"children\":[{\"text\":\" return response\"}]},{\"id\":\"V_7FsWtYwqqYcMn5c_4MB\",\"type\":\"code-line\",\"children\":[{\"text\":\" except Exception as e:\"}]},{\"id\":\"naeegrzZhyFsD8R5U4Q-C\",\"type\":\"code-line\",\"children\":[{\"text\":\" print('객체 업로드 실패, error:', e)\"}]},{\"id\":\"9CgP_C5iIUx0MZVVi4PbK\",\"type\":\"code-line\",\"children\":[{\"text\":\" return None\"}]}],\"type\":\"code-block\",\"language\":\"python\",\"autoWrap\":false},{\"id\":\"kSVA9QyS8CYw__kJqnfG-\",\"children\":[{\"text\":\"app_cos 디렉터리의 views.py를 엽니다.\"}],\"type\":\"oli\",\"start\":false},{\"id\":\"MXPRWbKiAYbr5PECf_WH_\",\"type\":\"p\",\"children\":[{\"text\":\"\"},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/7ae2c02a2c6511ee9b13525400cea498.png\",\"alt\":\"\",\"inline\":true,\"children\":[{\"text\":\"\"}],\"id\":\"zKRMDfzHy1Kps0ISGt3Mt\",\"naturalSize\":[1255,307],\"size\":[974,238]},{\"text\":\"\"}]},{\"id\":\"bG4wfNLl0cohR1p5yWFkU\",\"type\":\"p\",\"start\":false,\"children\":[{\"text\":\"아래 코드를 복사하여 붙여넣습니다.\"}]},{\"id\":\"CpFkYDEueIlg0y_nEee57\",\"children\":[{\"id\":\"bM0urIm3GZwIY3povcfWl\",\"children\":[{\"text\":\"from django.shortcuts import render,redirect\"}],\"type\":\"code-line\"},{\"id\":\"CrGXSwjI-kzHj1HYsg6ps\",\"children\":[{\"text\":\"from django.http import HttpResponse\"}],\"type\":\"code-line\"},{\"id\":\"AI7JD5jRrlrgHD6g8suqH\",\"children\":[{\"text\":\"from django_cos_storage.COSStorage import QFStorage\"}],\"type\":\"code-line\"},{\"id\":\"fxF3t4LQiTV9__KpK65zs\",\"children\":[{\"text\":\"from django.conf import settings\"}],\"type\":\"code-line\"},{\"id\":\"qFtOWbYbztfNUjB3yFrmo\",\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"id\":\"m7V7fljuBB-ehGY2iUpwH\",\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"id\":\"A0tGEJFIQVmuc6CImAjTB\",\"children\":[{\"text\":\"#객체 업로드\"}],\"type\":\"code-line\"},{\"id\":\"CUeNf7_yhmQxk_zPGTQ6_\",\"children\":[{\"text\":\"\"}],\"type\":\"code-line\"},{\"id\":\"n-Tb7NS-X7LbPRhycejDS\",\"children\":[{\"text\":\"def upload_file_view(request):\"}],\"type\":\"code-line\"},{\"id\":\"wknEp0yNZAmHl0Bi0g4Na\",\"type\":\"code-line\",\"children\":[{\"text\":\" response = QFStorage().upload_file(\"}]},{\"id\":\"UeifnL3JfFyFIbrXdcnOW\",\"type\":\"code-line\",\"children\":[{\"text\":\" Key='1.png',\"}]},{\"id\":\"jEKoe_6KewUwZgWwnt8sv\",\"type\":\"code-line\",\"children\":[{\"text\":\" LocalFilePath=settings.BASE_DIR / 'cessu/1.png'\"}]},{\"id\":\"1nDdea35A3SEcbsAyy-Qd\",\"type\":\"code-line\",\"children\":[{\"text\":\" )\"}]},{\"id\":\"EdGQvxGBpkGBa_yldQOHu\",\"type\":\"code-line\",\"children\":[{\"text\":\"\"}]},{\"id\":\"-dGxWmOJofG5FOcsz2krD\",\"type\":\"code-line\",\"children\":[{\"text\":\" if response:\"}]},{\"id\":\"RLvYKd9Ti2kGi7eaNL663\",\"type\":\"code-line\",\"children\":[{\"text\":\" return HttpResponse('파일 업로드 성공!')\"}]},{\"id\":\"tplA_YS26FLSG2hjlKCJe\",\"type\":\"code-line\",\"children\":[{\"text\":\" return HttpResponse('파일 업로드 실패')\"}]}],\"type\":\"code-block\",\"language\":\"python\",\"autoWrap\":false},{\"id\":\"tkypCctd-hRhcQ1yNtD19\",\"children\":[{\"id\":\"XnSS3peSClpra77vbG-Yu\",\"children\":[{\"text\":\"주의:\",\"type\":\"text\",\"b\":1,\"color\":\"#04C8DC\"}],\"type\":\"p\"},{\"id\":\"C2_SqIzsNVTe_ZxbONNA4\",\"children\":[{\"text\":\"예시에서 \"},{\"text\":\"cessu/1.png\",\"code\":1},{\"text\":\"는 업로드할 로컬 파일 \"},{\"text\":\"1.png\",\"code\":1},{\"text\":\"가 프로젝트 디렉터리의 \"},{\"text\":\"cessu\",\"code\":1},{\"text\":\" 폴더에 위치함을 의미합니다. 업로드 성공 후, COS 버킷의 cessu 폴더에서 이미지 1.png를 찾을 수 있습니다.\"}],\"type\":\"p\"}],\"type\":\"hint\",\"hintType\":\"alert\"},{\"id\":\"iIFTyik80vTUypqRvHJqu\",\"children\":[{\"text\":\"djangoProject2 디렉터리에서 urls.py를 찾아 엽니다.\"}],\"type\":\"oli\",\"start\":false},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/a1a1165c2c6511ee9b13525400cea498.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"DESJWG6PpXiIuFAxfJuw_\",\"naturalSize\":[1254,602],\"size\":[974,467]},{\"id\":\"Bss3M4shEplNKNlxVCILk\",\"type\":\"p\",\"start\":false,\"children\":[{\"text\":\"아래 코드를 복사하여 붙여넣습니다.\"}]},{\"id\":\"v0YEkrIoCK8wiyV7mlbk0\",\"children\":[{\"id\":\"iiePyEG8r1W6s3cbK42n3\",\"children\":[{\"text\":\"from django.contrib import admin\"}],\"type\":\"code-line\"},{\"id\":\"qWiDDp65-MXVjxeuL0Fdt\",\"type\":\"code-line\",\"children\":[{\"text\":\"from django.urls import path\"}]},{\"id\":\"Mwoh-N_jwMcRB9y5ba-ku\",\"type\":\"code-line\",\"children\":[{\"text\":\"from app_cos.views import *\"}]},{\"id\":\"ZsC7cpvMpKxxvFscFMHLY\",\"type\":\"code-line\",\"children\":[{\"text\":\"\"}]},{\"id\":\"N9s66W6D2B1zNft5Ay10f\",\"type\":\"code-line\",\"children\":[{\"text\":\"urlpatterns = [\"}]},{\"id\":\"bAQdAnZlLw0K9tKJI5JQJ\",\"type\":\"code-line\",\"children\":[{\"text\":\" path('admin/', admin.site.urls),\"}]},{\"id\":\"JJGWRUUwjKzqKc5g0m8sr\",\"type\":\"code-line\",\"children\":[{\"text\":\"\"}]},{\"id\":\"h9x3ggB2_NhmaYYHOTTym\",\"type\":\"code-line\",\"children\":[{\"text\":\" path('upload_file/', upload_file_view),\"}]},{\"id\":\"gWD26x82medfWUFyRjjib\",\"type\":\"code-line\",\"children\":[{\"text\":\"]\"}]}],\"type\":\"code-block\",\"language\":\"python\",\"autoWrap\":false},{\"type\":\"oli\",\"children\":[{\"text\":\"terminal에서 \"},{\"text\":\"python manage.py migrate\",\"code\":1},{\"text\":\"를 입력한 후 실행합니다.\"}],\"id\":\"ZeQulhfgW6xJC4At1khqd\",\"at\":[35],\"start\":false},{\"id\":\"kyCocIsZ_mS3tX0LKdaUa\",\"type\":\"oli\",\"children\":[{\"text\":\"terminal에서 \"},{\"text\":\"python manage.py createsuperuser\",\"code\":1},{\"text\":\"를 입력하고, 안내에 따라 계정과 비밀번호를 입력하면 됩니다.\"}]},{\"type\":\"hint\",\"hintType\":\"alert\",\"children\":[{\"type\":\"p\",\"children\":[{\"b\":1,\"text\":\"주의:\",\"color\":\"#04C8DC\"}],\"id\":\"C0jYCtSzGs-UjxKMxuwqs\"},{\"type\":\"p\",\"children\":[{\"text\":\"python manage.py createsuperuser\",\"code\":1},{\"text\":\" 실행 시 pkg_resources가 없다는 오류가 발생한다면, \"},{\"text\":\"pip install setuptools\",\"code\":1},{\"text\":\" 설치 명령어를 실행하여 해결할 수 있습니다.\"}],\"id\":\"vKjrw81hfUvtO6ULrXeZh\"}],\"id\":\"z9wyBizrK48gCCtG0CZ2a\"},{\"id\":\"i7QodpHcafpUIFh8axROc\",\"type\":\"p\",\"children\":[{\"text\":\"\"},{\"id\":\"VpM4oVjVog9J-qZRitC9j\",\"children\":[{\"text\":\"\"}],\"type\":\"image\",\"inline\":true,\"alt\":\"\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/de99e721db1a11f0809c525400454e06.png\",\"naturalSize\":[1191,432],\"size\":[974,353.2896725440806]},{\"text\":\"\"}]},{\"id\":\"R6D0w5oa-ixV0ky7C2fqH\",\"children\":[{\"text\":\"그 다음 terminal에서 \"},{\"text\":\"python .\\\\manage.py runserver\",\"code\":1},{\"text\":\"를 입력하여 실행합니다.\"}],\"type\":\"oli\",\"start\":false},{\"type\":\"image\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/65d1d719533e11f0bf84525400454e06.png\",\"alt\":\"\",\"inline\":false,\"children\":[{\"text\":\"\"}],\"id\":\"bXyq84rStZ5GdXqRnDgCC\",\"naturalSize\":[940,384],\"size\":[974,397]},{\"id\":\"wqLlN7p1xzw-D8TI5qMyd\",\"children\":[{\"text\":\"http://127.0.0.1:8000/admin/\",\"code\":1},{\"text\":\" 사이트를 열고 방금 설정한 계정과 비밀번호를 입력하면 로그인을 완료할 수 있습니다.\"}],\"type\":\"oli\",\"start\":false},{\"id\":\"ufA-kUjbL7XhEsb9QSrxb\",\"type\":\"p\",\"start\":false,\"children\":[{\"text\":\"\"},{\"id\":\"PF0qRpuRFJm0ocpE0ySnZ\",\"children\":[{\"text\":\"\"}],\"type\":\"image\",\"inline\":true,\"alt\":\"\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/80ea341c162c11ee9225525400088f3a.png\",\"naturalSize\":[1440,486],\"size\":[970,327]},{\"text\":\"\"}]},{\"id\":\"XXhF77-BtWOJjWArRLROI\",\"children\":[{\"id\":\"okF-NqBCR_Xzgj7vbKrm0\",\"children\":[{\"text\":\"주의:\",\"type\":\"text\",\"b\":1,\"color\":\"#04C8DC\"}],\"type\":\"p\"},{\"id\":\"iPGZSZK434hSa-2TdKYCj\",\"children\":[{\"text\":\"웹사이트를 열었을 때 다음과 같은 오류 발생 시:\\n\"},{\"id\":\"GUIiKoVQhJrsaZdfpABG2\",\"children\":[{\"text\":\"\"}],\"type\":\"image\",\"inline\":true,\"alt\":\"\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/8101631c162c11ee9225525400088f3a.png\",\"naturalSize\":[1011,351],\"size\":[723,251]},{\"text\":\"\\npycharm으로 돌아가서 terminal을 다시 열고 다음을 순서대로 입력합니다.\"}],\"type\":\"p\"},{\"type\":\"code-block\",\"language\":\"python\",\"children\":[{\"type\":\"code-line\",\"children\":[{\"text\":\"python manage.py makemigrations\"}],\"id\":\"63Z4G_rsWDgGKuTqOnBWj\"},{\"type\":\"code-line\",\"id\":\"z0fDRoMQ2_rKtItQiCPPW\",\"children\":[{\"text\":\"python manage.py migrate\"}]}],\"id\":\"PqyoTksJpeIUXIZYAcyzA\",\"autoWrap\":false},{\"type\":\"p\",\"children\":[{\"text\":\"\"}],\"id\":\"nh2riyk7NHVkUunV1LX6Y\"},{\"type\":\"p\",\"id\":\"tW3O-4n690zbCzTJB8D0X\",\"children\":[{\"text\":\"마지막으로 terminal에서 \"},{\"text\":\"python .\\\\manage.py runserver\",\"code\":1},{\"text\":\"를 입력하여 실행하고 \"},{\"text\":\"http://127.0.0.1:8000/admin/\",\"code\":1},{\"text\":\"을 열면 됩니다.\"}]}],\"type\":\"hint\",\"hintType\":\"alert\"},{\"id\":\"525Vb8HJ_Z49rFngu5qj3\",\"children\":[{\"text\":\"Django 첨부 파일이 COS에 저장됐는지 확인\"}],\"nodeId\":\".E9.AA.8C.E8.AF.81-django-.E9.99.84.E4.BB.B6.E5.AD.98.E5.82.A8.E5.88.B0-cos\",\"type\":\"h3\"},{\"id\":\"3sM2ceHZzG6BfDAN1k0lQ\",\"children\":[{\"text\":\"http://127.0.0.1:8000/upload_file\",\"code\":1},{\"text\":\"에 접속하여 파일 업로드 작업을 완료합니다. 다음 그림과 같은 메시지가 표시되었다면 업로드가 성공한 것입니다.\"}],\"type\":\"oli\",\"start\":true},{\"id\":\"x0_QXhmJ_VQXJtVXJ1QQK\",\"type\":\"p\",\"children\":[{\"text\":\"\"},{\"id\":\"j5OamZs2GZJbmdDv-7wF4\",\"children\":[{\"text\":\"\"}],\"type\":\"image\",\"inline\":true,\"alt\":\"\",\"url\":\"https://cloudcache.intl.tencent-cloud.com/cms/backend-cms/e25974d9db1a11f09c08525400bf7822.png\",\"naturalSize\":[743,282],\"size\":[710,269.4751009421265]},{\"text\":\"\"}]},{\"id\":\"YNXMLTgJ2sHXO88lmwZi6\",\"children\":[{\"text\":\"COS 콘솔에 로그인하여 이전에 생성한 버킷을 선택한후 cessu 경로에서 업로드된 이미지를 확인할 수 있습니다.\"}],\"type\":\"oli\",\"start\":false}]"}}} document.addEventListener('DOMContentLoaded', () => { function hasImages(data) { for (const node of data) { if (node.type === 'image') { return true; } if (node.children && node.children.length && hasImages(node.children)) { return true; } } return false; } function pollSlateRenderStatus(articleId, pollInterval = 100, timeout = 30000) { return new Promise((resolve) => { const startTime = Date.now(); let pollTimer; function checkAllImages() { const imgs = document.querySelectorAll(`#article-body-root-${articleId} .tea-editable .image[data-slate-node="element"]`); if (!imgs.length) { return false; } for (const img of imgs) { const { offsetWidth, offsetParent } = img; if (!offsetWidth) { return false; } if (offsetParent) { const styles = window.getComputedStyle(offsetParent); const validWidth = offsetParent.clientWidth - parseFloat(styles.paddingLeft) - parseFloat(styles.paddingRight); if (offsetWidth > validWidth) { return false; } } } return true; } function performCheck() { const result = checkAllImages(); if (result) { resolve({ success: true, }); return; } const elapsed = Date.now() - startTime; if (elapsed < timeout) { pollTimer = setTimeout(performCheck, pollInterval); } else { resolve({ success: false, reason: 'timeout', }); } } pollTimer = setTimeout(performCheck, pollInterval); }) } async function renderArticle(articleId, articleData) { return new Promise((resolve) => { try { window.TeaSlateSDK.render(`article-body-root-${articleId}`, articleData, { mode: 'print', link: { baseUrl: '/document/product/', defaultTarget: 'blank', }, locale: window.__LANG__, }); } catch(err) { console.log(`slate article[${articleId}] render failed: ${err}`); resolve(); return; } pollSlateRenderStatus(articleId, 100, 30000).then(result => { if (result.success) { console.log(`slate article[${articleId}] render success`); } else { console.log(`slate article[${articleId}] render failed: ${reason}`); } }).catch(error=> { console.error( error); }).finally(()=> { resolve() }) })} async function batchRenderArticles(items) { return Promise.all(items.map(item => { return renderArticle(item.articleId, item.articleData ) })) } const articleRoots = document.querySelectorAll(".article-body-root"); const batches = []; const articleMap = window.__SLATE_MAP__ || {}; for (const articleRoot of articleRoots){ const rootId = articleRoot.dataset.articleId; const articleData = articleMap[rootId]; const slateData = articleData && articleData.content && articleData.content.slate ? JSON.parse(articleData.content.slate) : null; if (!rootId || !slateData) { continue; } if (hasImages(slateData)) { const item = { articleId: rootId, articleData: slateData } //render tree articles in a batch if (!batches.length || batches[batches.length - 1].length >= 3) { batches.push([item]) } else { batches[batches.length - 1].push(item); } } } if (!batches.length) { window.__PAGE_RENDERED__ = true; return; } async function renderAll() { try { for (const batch of batches) { await batchRenderArticles(batch); } } catch (err) { console.error(err); } finally { window.__PAGE_RENDERED__ = true; console.log("slate render finished"); } } renderAll(); })