๋ฐฐํฌ๋œ ์—์ด์ „ํŠธ์˜ ์•ก์„ธ์Šค ๊ด€๋ฆฌ

์•ก์„ธ์Šค ๋ชจ๋“œ์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ ๋ฐฉ๋ฒ• ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€ ์ธ์ฆ ๋ฐฉ๋ฒ• ์ด ์ธ์ฆ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด
์—์ด์ „ํŠธ ๋‚ด์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ณ„์ • ๋ฐฐํฌ๋œ ์—์ด์ „ํŠธ๋Š” ์„œ๋น„์Šค ๊ณ„์ •์— ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—์ด์ „ํŠธ ๋‚ด์—์„œ API ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”๋“œํฌ์ธํŠธ๋กœ ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. API ํ‚ค ์ด ์ธ์ฆ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉํ•˜๋ ค๋Š” API์—์„œ API ํ‚ค๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
์—์ด์ „ํŠธ์˜ ์ตœ์ข… ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์‚ฌ์šฉ์ž ๊ณ„์ •, ๋“ฑ๋ก, ๋กœ๊ทธ์ธ ๋˜๋Š” ์Šน์ธ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. OAuth ํด๋ผ์ด์–ธํŠธ ID ์—์ด์ „ํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋™์˜๋ฅผ ์š”์ฒญํ•˜๊ณ  ์ˆ˜๋ฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ญํ• 

Vertex AI Agent Engine์— ๋ฐฐํฌํ•˜๋Š” ์—์ด์ „ํŠธ๋Š” service-PROJECT_NUMBER@gcp-sa-aiplatform-re.iam.gserviceaccount.com์™€ ์ผ์น˜ํ•˜๋Š” AI Platform Reasoning Engine ์„œ๋น„์Šค ์—์ด์ „ํŠธ ์„œ๋น„์Šค ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ณ„์ •์—๋Š” ๋ฐฐํฌ๋œ ์—์ด์ „ํŠธ์— ํ•„์š”ํ•œ ๊ธฐ๋ณธ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” Vertex AI Reasoning Engine ์„œ๋น„์Šค ์—์ด์ „ํŠธ ์—ญํ• (roles/aiplatform.reasoningEngineServiceAgent)์ด ์žˆ์Šต๋‹ˆ๋‹ค. IAM ๋ฌธ์„œ์—์„œ ๊ธฐ๋ณธ ๊ถŒํ•œ์˜ ์ „์ฒด ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐํฌ๋œ ์—์ด์ „ํŠธ์˜ ์—ญํ•  ๋‚˜์—ด

์ฝ˜์†”

  1. IAM ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ 'Google ์ œ๊ณต ์—ญํ•  ๋ถ€์—ฌ ํฌํ•จ' ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    IAM์œผ๋กœ ์ด๋™

  2. Google Cloud ํ”„๋กœ์ ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  3. service-PROJECT_NUMBER@gcp-sa-aiplatform-re.iam.gserviceaccount.com์™€ ์ผ์น˜ํ•˜๋Š” ์ฃผ ๊ตฌ์„ฑ์›์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

  4. ๋ฐฐํฌ๋œ ์—์ด์ „ํŠธ์˜ ์—ญํ• ์€ ์—ญํ•  ์—ด์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud

๋จผ์ € gcloud CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud projects get-iam-policy PROJECT_ID_OR_NUMBER \
  --flatten="bindings[].members" \
  --filter="bindings.members:serviceAccount:PRINCIPAL" \
  --format="value(bindings.role)"

๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • PROJECT_ID_OR_NUMBER: ํ”„๋กœ์ ํŠธ์˜ ID ๋˜๋Š” ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.
  • PRINCIPAL: ์—์ด์ „ํŠธ๊ฐ€ Vertex AI Agent Engine์— ๋ฐฐํฌ๋  ๋•Œ ์ƒ์„ฑ๋œ ์„œ๋น„์Šค ๊ณ„์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM ๋ฌธ์„œ ๋ฐ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Python

๋จผ์ € ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

pip install google-api-python-client

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ธ์ฆํ•˜๊ณ  ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฐฐํฌ๋œ ์—์ด์ „ํŠธ์˜ ์—ญํ• ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

from google.cloud import resourcemanager_v3
from google.iam.v1 import iam_policy_pb2

project_id = "PROJECT_ID"
principal = "PRINCIPAL"

crm_service = resourcemanager_v3.ProjectsClient()
policy = crm_service.get_iam_policy(iam_policy_pb2.GetIamPolicyRequest(
    resource=f"projects/{project_id}"
))
for binding in policy.bindings:
    for member in binding.members:
        if principal in member:
            print(binding.role)

์—ฌ๊ธฐ์„œ PRINCIPAL์€ ์—์ด์ „ํŠธ๊ฐ€ Vertex AI Agent Engine์— ๋ฐฐํฌ๋  ๋•Œ ์ƒ์„ฑ๋œ ์„œ๋น„์Šค ๊ณ„์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐํฌ๋œ ์—์ด์ „ํŠธ ์—ญํ•  ๋ถ€์—ฌ

  1. IAM ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ 'Google ์ œ๊ณต ์—ญํ•  ๋ถ€์—ฌ ํฌํ•จ' ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    IAM์œผ๋กœ ์ด๋™

  2. Google Cloud ํ”„๋กœ์ ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  3. service-PROJECT_NUMBER@gcp-sa-aiplatform-re.iam.gserviceaccount.com์™€ ์ผ์น˜ํ•˜๋Š” ์ฃผ ๊ตฌ์„ฑ์›์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

  4. ์ˆ˜์ • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์ฃผ ๊ตฌ์„ฑ์›์— ํ•„์š”ํ•œ ์—ญํ• ์„ ์ถ”๊ฐ€ํ•œ ํ›„ ์ €์žฅ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋จผ์ € gcloud CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud projects add-iam-policy-binding PROJECT_ID --member=PRINCIPAL --role=ROLE_NAME

๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • PRINCIPAL: ์—์ด์ „ํŠธ๊ฐ€ Vertex AI Agent Engine์— ๋ฐฐํฌ๋  ๋•Œ ์ƒ์„ฑ๋œ ์„œ๋น„์Šค ๊ณ„์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ROLE_NAME: ๋ถ€์—ฌํ•  ์—ญํ• ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์˜ ๋ชฉ๋ก์€ ์—ญํ•  ์ดํ•ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM ๋ฌธ์„œ ๋ฐ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Python

๋ฐฐํฌ๋œ ์—์ด์ „ํŠธ์˜ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๊ฑฐ๋‚˜ ์ทจ์†Œํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฒด Python ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ผํšŒ์„ฑ ์ž‘์—…์—๋Š” Google Cloud ์ฝ˜์†” ๋˜๋Š” gcloud๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  IAM ์•ก์„ธ์Šค ์ œ์–ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด Terraform์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Python์—์„œ ์„œ๋ช…ํ•˜๋ ค๊ณ  ํ•˜๊ฑฐ๋‚˜ ์„œ๋ช…ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ IAM ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋ฐฐํฌ๋œ ์—์ด์ „ํŠธ์˜ ์—ญํ•  ์ทจ์†Œ

  1. IAM ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ 'Google ์ œ๊ณต ์—ญํ•  ๋ถ€์—ฌ ํฌํ•จ' ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    IAM์œผ๋กœ ์ด๋™

  2. Google Cloud ํ”„๋กœ์ ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  3. service-PROJECT_NUMBER@gcp-sa-aiplatform-re.iam.gserviceaccount.com์™€ ์ผ์น˜ํ•˜๋Š” ์ฃผ ๊ตฌ์„ฑ์›์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

  4. ์ˆ˜์ • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์ฃผ ๊ตฌ์„ฑ์›์—์„œ ์—ญํ• ์„ ์ทจ์†Œํ•˜๊ณ  ํ•ด๋‹น ์—ญํ• ์„ ์‚ญ์ œํ•œ ๋‹ค์Œ ์ €์žฅ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋จผ์ € gcloud CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud projects remove-iam-policy-binding PROJECT_ID --member=PRINCIPAL --role=ROLE_NAME

๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • PRINCIPAL: ์—์ด์ „ํŠธ๊ฐ€ Vertex AI Agent Engine์— ๋ฐฐํฌ๋  ๋•Œ ์ƒ์„ฑ๋œ ์„œ๋น„์Šค ๊ณ„์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ROLE_NAME: ์ทจ์†Œํ•  ์—ญํ• ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์˜ ๋ชฉ๋ก์€ ์—ญํ•  ์ดํ•ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM ๋ฌธ์„œ ๋ฐ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Python

๋ฐฐํฌ๋œ ์—์ด์ „ํŠธ์˜ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๊ฑฐ๋‚˜ ์ทจ์†Œํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฒด Python ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ผํšŒ์„ฑ ์ž‘์—…์—๋Š” Google Cloud ์ฝ˜์†” ๋˜๋Š” gcloud๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  IAM ์•ก์„ธ์Šค ์ œ์–ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด Terraform์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Python์—์„œ ์„œ๋ช…ํ•˜๋ ค๊ณ  ํ•˜๊ฑฐ๋‚˜ ์„œ๋ช…ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ IAM ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋ณด์•ˆ ๋น„๋ฐ€

๋ณด์•ˆ ๋น„๋ฐ€์—๋Š” ๋ผ๋ฒจ ๋ฐ ๋ณต์ œ ์ •๋ณด์™€ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์ด ํ•œ ๊ฐœ ์ด์ƒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋น„๋ฐ€์˜ ์‹ค์ œ ํŽ˜์ด๋กœ๋“œ๋Š” ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋น„๋ฐ€์€ ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€์—์„œ Secret Manager๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜๋ฉฐ ๋ฐฐํฌ๋œ ์—ฌ๋Ÿฌ ์—์ด์ „ํŠธ ๊ฐ„์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Secret Manager์—์„œ ์—์ด์ „ํŠธ์— ์ƒ์‘ํ•˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋‚˜์—ดํ•˜๋ ค๋ฉด ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ํ•„ํ„ฐ๋ง์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด์•ˆ ๋น„๋ฐ€ ๋งŒ๋“ค๊ธฐ

์ฝ˜์†”

  1. Secret Manager ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Secret Manager๋กœ ์ด๋™

  2. Secret Manager ํŽ˜์ด์ง€์—์„œ ๋ณด์•ˆ ๋น„๋ฐ€ ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ์ด๋ฆ„ ํ•„๋“œ์— ๋ณด์•ˆ ๋น„๋ฐ€์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: my-secret).

  4. ์„ ํƒ์‚ฌํ•ญ: ์ดˆ๊ธฐ ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋งŒ๋“ค ๋•Œ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „๋„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋ณด์•ˆ ๋น„๋ฐ€ ๊ฐ’ ํ•„๋“œ์— ๋ณด์•ˆ ๋น„๋ฐ€์˜ ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: abcd1234).

  5. ๋ผ๋ฒจ๋กœ ์ด๋™ํ•œ ๋‹ค์Œ ๋ผ๋ฒจ ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  6. ํ‚ค์™€ ํ•ด๋‹น ๊ฐ’์„ ์ž…๋ ฅํ•˜์—ฌ ๋ผ๋ฒจ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  7. ๋ณด์•ˆ ๋น„๋ฐ€ ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋จผ์ € gcloud CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets create SECRET_ID --replication-policy="automatic"
gcloud secrets versions add SECRET_ID --data-file="FILE_PATH"

๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • SECRET_ID: ๋ณด์•ˆ ๋น„๋ฐ€์˜ ID ๋˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์˜ ์ •๊ทœํ™”๋œ ์‹๋ณ„์ž
  • FILE_PATH: ๋ฒ„์ „ ์„ธ๋ถ€์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์˜ ์ „์ฒด ๊ฒฝ๋กœ(ํŒŒ์ผ ์ด๋ฆ„ ํฌํ•จ)

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฐ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ Secret Manager ๋ฌธ์„œ ๋˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฐ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Python

๋จผ์ € ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

pip install google-cloud-secret-manager

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ธ์ฆํ•˜๊ณ  ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

from google.cloud import secretmanager
import google_crc32c

client = secretmanager.SecretManagerServiceClient()
secret = client.create_secret(request={
    "parent": "projects/PROJECT_ID",
    "secret_id": "SECRET_ID",
    "secret": {  # google.cloud.secretmanager_v1.types.Secret
        # Required. The replication policy cannot be changed after the Secret has been created.
        "replication": {"automatic": {}},
        # Optional. Labels to associate with the secret.
        "labels": {"type": "api_key", "provider": "anthropic"},
        # Optional. The secret's time-to-live in seconds with format (e.g.,
        # "900s" for 15 minutes). If specified, the secret versions will be
        # automatically deleted upon reaching the end of the TTL period.
        "ttl": "TTL",
    },
})

anthropic_api_key = "API_KEY"  # The secret to be stored.
payload_bytes = anthropic_api_key.encode("UTF-8")
# Optional. Calculate payload checksum.
crc32c = google_crc32c.Checksum()
crc32c.update(payload_bytes)

version = client.add_secret_version(request={
    "parent": secret.name,
    "payload": {
        "data": payload_bytes,
        "data_crc32c": int(crc32c.hexdigest(), 16),  # Optional.
    },
})
print(f"Added secret version: {version.name}")

๋ณด์•ˆ ๋น„๋ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ

์ฝ˜์†”

  1. Secret Manager ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Secret Manager๋กœ ์ด๋™

  2. Secret Manager ํŽ˜์ด์ง€์—์„œ ์„ค๋ช…ํ•  ๋ณด์•ˆ ๋น„๋ฐ€์˜ ์ด๋ฆ„์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ณด์•ˆ ๋น„๋ฐ€ ์„ธ๋ถ€์ •๋ณด ํŽ˜์ด์ง€์— ๋ณด์•ˆ ๋น„๋ฐ€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

gcloud

๋จผ์ € gcloud CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets versions describe VERSION_ID --secret=SECRET_ID

๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • VERSION_ID: ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์˜ ID
  • SECRET_ID: ๋ณด์•ˆ ๋น„๋ฐ€์˜ ID ๋˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์˜ ์ •๊ทœํ™”๋œ ์‹๋ณ„์ž

์ž์„ธํ•œ ๋‚ด์šฉ์€ Secret Manager ๋ฌธ์„œ ๋˜๋Š” CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Python

๋จผ์ € ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

pip install google-cloud-secret-manager

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ธ์ฆํ•˜๊ณ  ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

from google.cloud import secretmanager

client = secretmanager.SecretManagerServiceClient()
name = client.secret_path("PROJECT_ID", "SECRET_ID")
response = client.get_secret(request={"name": name})

๋ณด์•ˆ ๋น„๋ฐ€ ๋‚˜์—ด

์ฝ˜์†”

  1. Secret Manager ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Secret Manager๋กœ ์ด๋™

  2. ๋ณด์•ˆ ๋น„๋ฐ€ ํ…Œ์ด๋ธ”์—์„œ ํ•„ํ„ฐ ํ•„๋“œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ํ•„ํ„ฐ ์†์„ฑ๊ณผ ํ•ด๋‹น ๊ฐ’(์˜ˆ: Location:asia-east1)์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  4. ํ…Œ์ด๋ธ”์ด ์ž…๋ ฅ๋œ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ž๋™์œผ๋กœ ํ•„ํ„ฐ๋ง๋ฉ๋‹ˆ๋‹ค.

  5. (์„ ํƒ์‚ฌํ•ญ) ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ํ•„ํ„ฐ๋งํ•˜๋ ค๋ฉด ๋ฒ„์ „์— ์•ก์„ธ์Šคํ•  ๋ณด์•ˆ ๋น„๋ฐ€์„ ์„ ํƒํ•œ ํ›„ ๋ฒ„์ „ ํ‘œ์—์„œ ํ•„ํ„ฐ ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋จผ์ € gcloud CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋‚˜์—ดํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets list --filter="FILTER"

์—ฌ๊ธฐ์„œ FILTER๋Š” ๋ฌธ์ž์—ด(์˜ˆ: name:asecret OR name:bsecret) ๋˜๋Š” ์ •๊ทœ ํ‘œํ˜„์‹(์˜ˆ: name ~ "secret_ab.*")์ž…๋‹ˆ๋‹ค.

๋ณด์•ˆ ๋น„๋ฐ€์˜ ๋ชจ๋“  ๋ฒ„์ „์„ ๋‚˜์—ดํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets versions list SECRET_ID

์—ฌ๊ธฐ์„œ SECRET_ID๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์˜ ID ๋˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์˜ ์ •๊ทœํ™”๋œ ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณด์•ˆ ๋น„๋ฐ€ ํ•„ํ„ฐ๋ง ๋ฐ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „ ๋‚˜์—ด์— ๊ด€ํ•œ Secret Manager ๋ฌธ์„œ ๋˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฐ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ๊ฐ๊ฐ ๋‚˜์—ดํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Python

๋จผ์ € ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

pip install google-cloud-secret-manager

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ธ์ฆํ•˜๊ณ  ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

from google.cloud import secretmanager
client = secretmanager.SecretManagerServiceClient()
for secret in client.list_secrets(request={
    "parent": "projects/PROJECT_ID",
    "filter": "FILTER", # e.g. "labels.provider=anthropic"
}):
    print(f"Found secret: {secret.name}")

๋ณด์•ˆ ๋น„๋ฐ€ ์—…๋ฐ์ดํŠธ

์ฝ˜์†”

  1. Secret Manager ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Secret Manager๋กœ ์ด๋™

  2. Secret Manager ํŽ˜์ด์ง€์—์„œ ๋ณด์•ˆ ๋น„๋ฐ€ ์ด๋ฆ„ ์˜†์— ์žˆ๋Š” ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ์ •๋ณด ํŒจ๋„์ด ๋‹ซํ˜€ ์žˆ์œผ๋ฉด ์ •๋ณด ํŒจ๋„ ํ‘œ์‹œ๋ฅผ ํด๋ฆญํ•˜์—ฌ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

  4. ์ •๋ณด ํŒจ๋„์—์„œ ๋ผ๋ฒจ ํƒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  5. ๋ผ๋ฒจ ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•˜๊ณ  ๋ผ๋ฒจ์˜ ํ‚ค์™€ ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  6. ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋จผ์ € gcloud CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets update SECRET_ID --update-labels=KEY=VALUE

๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • SECRET_ID: ๋ณด์•ˆ ๋น„๋ฐ€์˜ ID ๋˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์˜ ์ •๊ทœํ™”๋œ ์‹๋ณ„์ž
  • KEY: ๋ผ๋ฒจ ํ‚ค
  • VALUE: ๋ผ๋ฒจ์˜ ํ•ด๋‹นํ•˜๋Š” ๊ฐ’

์ž์„ธํ•œ ๋‚ด์šฉ์€ Secret Manager ๋ฌธ์„œ ๋˜๋Š” CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Python

๋จผ์ € ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

pip install google-cloud-secret-manager

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ธ์ฆํ•˜๊ณ  ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

from google.cloud import secretmanager
client = secretmanager.SecretManagerServiceClient()
name = client.secret_path("PROJECT_ID", "SECRET_ID")
response = client.update_secret(request={
    "secret": {
        "name": name,
        "labels": {"type": "api_key", "provider": "anthropic"}, # updated labels
    },
    "update_mask": {"paths": ["labels"]},
})
print(f"Updated secret: {response.name}")

๋ณด์•ˆ ๋น„๋ฐ€ ์‚ญ์ œ

์ฝ˜์†”

  1. Secret Manager ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Secret Manager๋กœ ์ด๋™

  2. Secret Manager ํŽ˜์ด์ง€์˜ ๋ณด์•ˆ ๋น„๋ฐ€ ์ž‘์—… ์—ด์—์„œ ๋”๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ฉ”๋‰ด์—์„œ ์‚ญ์ œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ณด์•ˆ ๋น„๋ฐ€ ์‚ญ์ œ ๋Œ€ํ™”์ƒ์ž์— ๋ณด์•ˆ ๋น„๋ฐ€ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  5. ๋ณด์•ˆ ๋น„๋ฐ€ ์‚ญ์ œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋จผ์ € gcloud CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets versions destroy VERSION_ID --secret=SECRET_ID

๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • VERSION_ID: ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„
  • SECRET_ID: ๋ณด์•ˆ ๋น„๋ฐ€์˜ ID ๋˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์˜ ์ •๊ทœํ™”๋œ ์‹๋ณ„์ž

๋ณด์•ˆ ๋น„๋ฐ€ ๋ฐ ๋ชจ๋“  ๋ฒ„์ „์„ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets delete SECRET_ID

์—ฌ๊ธฐ์„œ SECRET_ID๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์˜ ID ๋˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์˜ ์ •๊ทœํ™”๋œ ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณด์•ˆ ๋น„๋ฐ€ ์‚ญ์ œ ๋ฐ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „ ํ๊ธฐ์— ๊ด€ํ•œ Secret Manager ๋ฌธ์„œ ๋˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€ ์‚ญ์ œ ๋ฐ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „ ํ๊ธฐ์— ๊ด€ํ•œ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Python

๋จผ์ € ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

pip install google-cloud-secret-manager

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ธ์ฆํ•˜๊ณ  ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

from google.cloud import secretmanager
client = secretmanager.SecretManagerServiceClient()
name = client.secret_path("PROJECT_ID", "SECRET_ID")
client.delete_secret(request={"name": name})

OAuth ํด๋ผ์ด์–ธํŠธ ๋ฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

ํด๋ผ์ด์–ธํŠธ ID๋Š” Google OAuth ์„œ๋ฒ„์—์„œ ๋‹จ์ผ ์—์ด์ „ํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ๊ฐ๊ฐ ์ž์ฒด ํด๋ผ์ด์–ธํŠธ ID๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋žต์ ์œผ๋กœ OAuth ๊ธฐ๋ฐ˜ ์—์ด์ „ํŠธ๋ฅผ ํ†ตํ•ฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. OAuth ํด๋ผ์ด์–ธํŠธ ๋ฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  2. Secret Manager์— ํด๋ผ์ด์–ธํŠธ ID์™€ ๋ณด์•ˆ ๋น„๋ฐ€์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. (๋ณด์•ˆ ๋น„๋ฐ€ ๋งŒ๋“ค๊ธฐ ์ฐธ๊ณ )

  3. ๊ฐœ๋ฐœ ์ค‘์— ์—์ด์ „ํŠธ์˜ ๋ณด์•ˆ ๋น„๋ฐ€์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

OAuth ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋งŒ๋“ค๊ธฐ

  1. Google Cloud ์ฝ˜์†”์—์„œ Google Auth Platform > Clients ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Google Auth Platform > ํด๋ผ์ด์–ธํŠธ๋กœ ์ด๋™

  2. (ํ•„์š”ํ•œ ๊ฒฝ์šฐ) ํ™”๋ฉด์— 'Google ์ธ์ฆ ํ”Œ๋žซํผ์ด ์•„์ง ๊ตฌ์„ฑ๋˜์ง€ ์•Š์Œ'์ด๋ผ๊ณ  ํ‘œ์‹œ๋˜๋ฉด ์‹œ์ž‘ํ•˜๊ธฐ๋ฅผ ํด๋ฆญํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. (๋‚˜์ค‘์— ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ํ”„๋กœ๋•์…˜ ์ค€๋น„ ์ƒํƒœ์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ OAuth 2.0 ์ •์ฑ… ์ค€์ˆ˜๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

  3. ํด๋ผ์ด์–ธํŠธ ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์œ ํ˜•์„ Web application์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. OAuth ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋ฆ„์„ OAUTH_CLIENT_DISPLAY_NAME์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. ์Šน์ธ๋œ ๋ฆฌ๋””๋ ‰์…˜ URI์—์„œ REDIRECT_URI์˜ URI๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  7. ํด๋ผ์ด์–ธํŠธ ๋ณด์•ˆ ๋น„๋ฐ€๋ฒˆํ˜ธ์—์„œ 'JSON ๋‹ค์šด๋กœ๋“œ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ˜ํ…์ธ ๊ฐ€ ํฌํ•จ๋œ client_secret.json ํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

{'web': {
    'client_id': "CLIENT_ID",
    'client_secret': "CLIENT_SECRET",
    'project_id': "PROJECT_ID",
    'redirect_uris': [REDIRECT_URIs],
    'auth_uri': 'https://accounts.google.com/o/oauth2/auth',
    'token_uri': 'https://www.googleapis.com/oauth2/v3/token',
    'auth_provider_x509_cert_url': 'https://www.googleapis.com/oauth2/v1/certs',
    'javascript_origins': "JAVASCRIPT_ORIGINS",  # Optional.
}}
  1. Secret Manager์— ํด๋ผ์ด์–ธํŠธ ID์™€ ๋ณด์•ˆ ๋น„๋ฐ€์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
from google.cloud import secretmanager
import google_crc32c
import json

client = secretmanager.SecretManagerServiceClient()
secret = client.create_secret(request={
    "parent": "projects/PROJECT_ID",
    "secret_id": "OAUTH_SECRET_ID", # e.g. "oauth-client-demo"
    "secret": {
        "labels": {"type": "oauth_client"},
        "replication": {"automatic": {}},
    },
})

payload_bytes = json.dumps(cred).encode("UTF-8")
crc32c = google_crc32c.Checksum()
crc32c.update(payload_bytes)

client.add_secret_version(request={
    "parent": secret.name,
    "payload": {
        "data": payload_bytes,
        "data_crc32c": int(crc32c.hexdigest(), 16),
    },
})

OAuth ํด๋ผ์ด์–ธํŠธ ํ‘œ์‹œ

  1. Google Cloud ์ฝ˜์†”์—์„œ Google Auth Platform > Clients ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Google Auth Platform > ํด๋ผ์ด์–ธํŠธ๋กœ ์ด๋™

  2. ๋ณด์œ ํ•œ OAuth ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

OAuth ํด๋ผ์ด์–ธํŠธ ์‚ญ์ œ

  1. Google Cloud ์ฝ˜์†”์—์„œ Google Auth Platform > Clients ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Google Auth Platform > ํด๋ผ์ด์–ธํŠธ๋กœ ์ด๋™

  2. ์‚ญ์ œํ•  OAuth ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ ํƒํ•˜๊ณ  ์‚ญ์ œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.