์ง์› ID ์ œํœด๋ฅผ ์œ„ํ•œ ๋‹จ๊ธฐ ํ† ํฐ ๊ฐ€์ ธ์˜ค๊ธฐ

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ์ง์› ID ํ’€ ๋ฐ ์ง์› ID ํ’€ ๊ณต๊ธ‰์—…์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ ํ† ํฐ ์„œ๋น„์Šค์—์„œ ๋‹จ๊ธฐ ํ† ํฐ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋œ ์ง์› ID ์ œํœด๋ฅผ ์ง€์›ํ•˜๋Š” Google Cloud ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ—ค๋“œ๋ฆฌ์Šค ๋จธ์‹ ์—์„œ ์ด ๊ฐ€์ด๋“œ์— ์„ค๋ช…๋œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์˜ ๋’ท๋ถ€๋ถ„์—์„œ ์ž์„ธํžˆ ์„ค๋ช…๋œ ๋‹ค์Œ์˜ ๋Œ€๋žต์ ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ๊ธฐ ํ† ํฐ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ID ๊ณต๊ธ‰์—…์ฒด์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  2. ๋ณด์•ˆ ํ† ํฐ ์„œ๋น„์Šค์˜ ํ† ํฐ์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

  1. ์ง์› ID ์ œํœด๋ฅผ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ IdP ๊ด€๋ จ ์•ˆ๋‚ด๋Š” ๋‹ค์Œ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ์ง์› ID ํ’€ ID์™€ ์ง์› ID ํ’€ ์ œ๊ณต์—…์ฒด ID๋ฅผ ๊ธฐ๋กํ•ด ๋‘ก๋‹ˆ๋‹ค.

  2. Identity and Access Management(IAM) ๊ถŒํ•œ serviceusage.services.use๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ถŒํ•œ์ด ํฌํ•จ๋œ ์ตœ์†Œ ๊ถŒํ•œ ์—ญํ• ์€ ์„œ๋น„์Šค ์‚ฌ์šฉ๋Ÿ‰ ์†Œ๋น„์ž(roles/serviceusage.serviceUsageConsumer)์ž…๋‹ˆ๋‹ค.

  3. Enable the IAM and Security Token Service APIs.

    Enable the APIs

  4. Google Cloud CLI๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Google Cloud CLI๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

    gcloud init

    ์™ธ๋ถ€ ID ๊ณต๊ธ‰์—…์ฒด(IdP)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋จผ์ € ์ œํœด ID๋กœ gcloud CLI์— ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™ธ๋ถ€ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ Google Cloud ์•ก์„ธ์Šค ํ† ํฐ์œผ๋กœ ๊ตํ™˜

์ด ์„น์…˜์—์„œ๋Š” ๋ณด์•ˆ ํ† ํฐ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผGoogle Cloud์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ์•ก์„ธ์Šค ํ† ํฐ์œผ๋กœ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์˜ ๋’ท๋ถ€๋ถ„์— ์„ค๋ช…๋œ ๊ฒƒ์ฒ˜๋Ÿผ gcloud CLI, REST API, Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ๊ธฐ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋ฉด ํ•ด๋‹น ๋จธ์‹ ์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ณ„์† ์ƒˆ๋กœ๊ณ ์นจํ•˜๋„๋ก ์žฅ๊ธฐ ์‹คํ–‰ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud CLI๋ฅผ ์‚ฌ์šฉํ•œ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ

์ด ์„น์…˜์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ๊ณผ์ •์„ ์‚ฌ์šฉํ•˜๋„๋ก gcloud CLI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋กœ๊ทธ์ธ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋งŒ๋“  ๋‹ค์Œ gcloud auth login ํ˜ธ์ถœ์—์„œ ํ•ด๋‹น ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋„๋ก ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ ๊ตฌ์„ฑ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

๋กœ๊ทธ์ธ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ --activate ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ gcloud CLI์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํŒŒ์ผ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ตฌ์„ฑ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋งค๋ฒˆ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ๋„ gcloud auth login์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud iam workforce-pools create-login-config \
    locations/global/workforcePools/WORKFORCE_POOL_ID/providers/PROVIDER_ID \
    --output-file=LOGIN_CONFIG_FILE_PATH

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • WORKFORCE_POOL_ID: ์ง์› ํ’€ ID์ž…๋‹ˆ๋‹ค.
  • PROVIDER_ID: ๊ณต๊ธ‰์—…์ฒด ID
  • LOGIN_CONFIG_FILE_PATH: ์ง€์ •ํ•˜๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค(์˜ˆ: login.json).

ํŒŒ์ผ์—๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ์ธ์ฆ ํ๋ฆ„์„ ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ณ  ์ž ์žฌ๊ณ ๊ฐ์„ ์ง์› ID ํ’€ ์ œ๊ณต์—…์ฒด์— ๊ตฌ์„ฑ๋œ IdP๋กœ ์„ค์ •ํ•˜๋„๋ก gcloud CLI์—์„œ ์‚ฌ์šฉํ•œ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์—๋Š” ๊ธฐ๋ฐ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

{
  "type": "external_account_authorized_user_login_config",
  "audience": "//iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID",
  "auth_url": "https://auth.cloud.google/authorize",
  "token_url": "https://sts.googleapis.com/v1/oauthtoken",
  "token_info_url": "https://sts.googleapis.com/v1/introspect",
}

gcloud auth login์—์„œ ์ด ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด gcloud config unset auth/login_config_file์„ ์‹คํ–‰ํ•˜์—ฌ ์„ค์ • ํ•ด์ œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ

๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ --activate ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ gcloud config set auth/login_config_file๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ํ™œ์„ฑํ™”ํ•œ ๊ฒฝ์šฐ gcloud CLI์—์„œ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    gcloud auth login
  • ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋กœ๊ทธ์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    gcloud auth login --login-config=LOGIN_CONFIG_FILE_PATH
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋ ค๋ฉด CLOUDSDK_AUTH_LOGIN_CONFIG_FILE์„ ๊ตฌ์„ฑ ๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ ์ค‘์ง€

๋กœ๊ทธ์ธ ๊ตฌ์„ฑ ํŒŒ์ผ ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ --activate ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ฑฐ๋‚˜ gcloud config set auth/login_config_file๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ํ™œ์„ฑํ™”ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์„ค์ •์„ ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    gcloud config unset auth/login_config_file
  • CLOUDSDK_AUTH_LOGIN_CONFIG_FILE ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ์ง€์›๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ์— ๊ตฌ์„ฑ ํŒŒ์ผ ์‚ฌ์šฉ

์ด ์„น์…˜์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ์„ ๋Œ€์‹ ํ•˜์—ฌ ์ธ์ฆ๋œGoogle Cloud ์ž‘์—…์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์„ค์ •ํ•  ๋•Œ๋Š” gcloud CLI์— ๋กœ๊ทธ์ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ํŒŒ์ผ ์„ค์ • ๋ฐฉ๋ฒ•์€ IdP์—์„œ OIDC๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋˜๋Š” SAML์„ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

OIDC

๋‹ค์Œ ์†Œ์Šค์—์„œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

ํŒŒ์ผ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ† ํฐ์ด ํŒŒ์ผ์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด์ „ ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „์— ์ƒˆ OIDC ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํŒŒ์ผ์„ ์ƒˆ๋กœ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ† ํฐ ์ˆ˜๋ช…์ด 1์‹œ๊ฐ„์ด๋ฉด ํŒŒ์ผ์„ 1์‹œ๊ฐ„ ์ „์— ์ƒˆ๋กœ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud iam workforce-pools create-cred-config \
    locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID \
    --subject-token-type=urn:ietf:params:oauth:token-type:id_token \
    --credential-source-file=PATH_TO_OIDC_ID_TOKEN \
    --workforce-pool-user-project=WORKFORCE_POOL_USER_PROJECT \
    --output-file=config.json

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • WORKFORCE_POOL_ID: ์ง์› ID ํ’€ ID์ž…๋‹ˆ๋‹ค.
  • WORKFORCE_PROVIDER_ID: ์ง์› ID ํ’€ ์ œ๊ณต์—…์ฒด ID
  • PATH_TO_OIDC_TOKEN: OIDC IdP ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
  • WORKFORCE_POOL_USER_PROJECT: ์ž‘์—…์ž ํ’€ ์‚ฌ์šฉ์ž ํ”„๋กœ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ ๋˜๋Š” ID

์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ serviceusage.services.use ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ OIDC IdP ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{
  "type": "external_account",
  "audience": "//iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID",
  "subject_token_type": "urn:ietf:params:oauth:token-type:id_token",
  "token_url": "https://sts.googleapis.com/v1/token",
  "workforce_pool_user_project": "WORKFORCE_POOL_USER_PROJECT",
  "credential_source": {
    "file": "PATH_TO_OIDC_CREDENTIALS_FILE"
  }
}

URL ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

URL ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ† ํฐ์€ HTTP GET ์š”์ฒญ์— ์‘๋‹ตํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ์„œ๋ฒ„์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์€ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋˜๋Š” JSON ํ˜•์‹์˜ OIDC ID ํ† ํฐ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

URL ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud iam workforce-pools create-cred-config \
    locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID \
    --subject-token-type=urn:ietf:params:oauth:token-type:id_token \
    --credential-source-url=URL_TO_RETURN_OIDC_ID_TOKEN \
    --workforce-pool-user-project=WORKFORCE_POOL_USER_PROJECT \
    --output-file=config.json

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • WORKFORCE_POOL_ID: ์ง์› ID ํ’€ ID
  • WORKFORCE_PROVIDER_ID: ์ง์› ID ํ’€ ์ œ๊ณต์—…์ฒด ID
  • URL_TO_RETURN_OIDC_ID_TOKEN: OIDC ID ํ† ํฐ๊ณผ ๊ฐ™์€ OIDC ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•  URL(์˜ˆ: http://localhost:5000/token)
  • WORKFORCE_POOL_USER_PROJECT: ํ• ๋‹น๋Ÿ‰ ๋ฐ ๊ฒฐ์ œ์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ. ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ๋Š” ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ serviceusage.services.use permission์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ OIDC IdP ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{
  "type": "external_account",
  "audience": "//iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID",
  "subject_token_type": "urn:ietf:params:oauth:token-type:id_token",
  "token_url": "https://sts.googleapis.com/v1/token",
  "workforce_pool_user_project": "WORKFORCE_POOL_USER_PROJECT",
  "credential_source": {
    "url": "URL_TO_RETURN_OIDC_ID_TOKEN"
  }
}

๋น„๋Œ€ํ™”ํ˜• ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

๋น„๋Œ€ํ™”ํ˜• ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ† ํฐ์ด ๋กœ์ปฌ ์‹คํ–‰ ํŒŒ์ผ์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ํŒŒ์ผ์€ ์œ ํšจํ•˜๊ณ  ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์€ OIDC ID ํ† ํฐ์„ JSON ํ˜•์‹์œผ๋กœ stdout์— ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

{
  "version": 1,
  "success": true,
  "token_type": "urn:ietf:params:oauth:token-type:id_token",
  "id_token": "HEADER.PAYLOAD.SIGNATURE",
  "expiration_time": 1620499962
}

์„ฑ๊ณต์ ์ธ ์‘๋‹ต์„ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ํ•„๋“œ๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค(expiration_time ์ œ์™ธ). expiration_time ํ•„๋“œ๋Š” ์ถœ๋ ฅ ํŒŒ์ผ์ด ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ์— ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ํŒŒ์ผ์€ stdout์— ๋‹ค์Œ JSON ํ˜•์‹์˜ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

{
  "version": 1,
  "success": false,
  "code": "401",
  "message": "Caller not authorized."
}

์ด ํ•„๋“œ๋Š” ๋ชจ๋‘ ์˜ค๋ฅ˜ ์‘๋‹ต์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ฐ ๋ฉ”์‹œ์ง€ ํ•„๋“œ๋Š” ์ ์ ˆํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๋•Œ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • version: JSON ์ถœ๋ ฅ์˜ ๋ฒ„์ „. ๋ฒ„์ „ 1๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
  • success: ์‘๋‹ต ์ƒํƒœ. ์ƒํƒœ๊ฐ€ true์ด๋ฉด ์‹คํ–‰ ํŒŒ์ผ์€ ์ข…๋ฃŒ ์ฝ”๋“œ 0์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•˜๋ฉฐ ์‘๋‹ต์—๋Š” ๋‹ค์Œ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • token_type: id_token
    • ์ถœ๋ ฅ ํŒŒ์ผ์ด ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ์— ์ง€์ •๋œ ๊ฒฝ์šฐ expiration_time ํ•„๋“œ

    ์ƒํƒœ๊ฐ€ false์ด๋ฉด ์‹คํ–‰ ํŒŒ์ผ์€ 0์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•˜๋ฉฐ ์‘๋‹ต์—๋Š” ๋‹ค์Œ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • code
    • message
  • token_type: ์„œ๋“œ ํŒŒํ‹ฐ ์ œ๋ชฉ ํ† ํฐ ์œ ํ˜•(urn:ietf:params:oauth:token-type:id_token์ด์–ด์•ผ ํ•จ)

  • id_token: ์„œ๋“œ ํŒŒํ‹ฐ OIDC ํ† ํฐ

  • expiration_time: ์„œ๋“œ ํŒŒํ‹ฐ OIDC ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„(์ดˆ)(์œ ๋‹‰์Šค ์‹œ๊ฐ„)

  • code: ์˜ค๋ฅ˜ ์ฝ”๋“œ ๋ฌธ์ž์—ด

  • message: ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€

์‹คํ–‰ ํŒŒ์ผ์ด ์‹คํ–‰๋  ๋•Œ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE: ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ์˜ ์ž ์žฌ๊ณ ๊ฐ ํ•„๋“œ. ์ด ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE: ์˜ˆ์ƒ๋˜๋Š” ์ œ๋ชฉ ํ† ํฐ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE: ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ์˜ ์ถœ๋ ฅ ํŒŒ์ผ ์œ„์น˜. ์ด ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ์— ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ํŒŒ์ผ์—์„œ ์ด๋Ÿฌํ•œ ๊ฐ’์„ ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ 1๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud iam workforce-pools create-cred-config \
    locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID \
    --subject-token-type=urn:ietf:params:oauth:token-type:id_token  \
    --executable-command=EXECUTABLE_COMMAND \
    --executable-timeout-millis=EXECUTABLE_TIMEOUT \
    --executable-output-file=EXECUTABLE_OUTPUT_FILE \
    --workforce-pool-user-project=WORKFORCE_POOL_USER_PROJECT \
    --output-file /path/to/generated/config.json

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • WORKFORCE_POOL_ID: ์ง์› ID ํ’€ ID
  • WORKFORCE_PROVIDER_ID: ์ง์› ID ํ’€ ์ œ๊ณต์—…์ฒด ID
  • EXECUTABLE_COMMAND: OIDC ID ํ† ํฐ๊ณผ ๊ฐ™์€ ์ œ๋ชฉ ํ† ํฐ์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ํ•  ์ธ์ˆ˜๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ๋ช…๋ น์–ด(--executable-command="/path/to/command --foo=bar" ํ˜•์‹)
  • EXECUTABLE_TIMEOUT: ์„ ํƒ์‚ฌํ•ญ. ์‹คํ–‰ ํŒŒ์ผ์ด ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ๊ธฐ๊ฐ„(๋‹จ์œ„: ๋ฐ€๋ฆฌ์ดˆ, ๊ธฐ๋ณธ๊ฐ’: 30์ดˆ)
  • EXECUTABLE_OUTPUT_FILE: ์„ ํƒ์‚ฌํ•ญ. ์‹คํ–‰ ํŒŒ์ผ์ด ์ƒ์„ฑํ•œ ์„œ๋“œ ํŒŒํ‹ฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์— ๋Œ€ํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ. ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋จผ์ € ์ด ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • WORKFORCE_POOL_USER_PROJECT: ํ• ๋‹น๋Ÿ‰ ๋ฐ ๊ฒฐ์ œ์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ ๋˜๋Š” ID. ์ฃผ ๊ตฌ์„ฑ์›์€ ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์„ค์ •๋œ serviceusage.services.use ๊ถŒํ•œ ์„ธํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ OIDC IdP ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{
  "type": "external_account",
  "audience": "//iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID",
  "subject_token_type": "urn:ietf:params:oauth:token-type:id_token",
  "token_url": "https://sts.googleapis.com/v1/token",
  "workforce_pool_user_project": "WORKFORCE_POOL_USER_PROJECT",
  "credential_source": {
    "executable": {
      "command": "EXECUTABLE_COMMAND",
      "timeout_millis": "EXECUTABLE_TIMEOUT",
      "output_file": "EXECUTABLE_OUTPUT_FILE"
    }
  }
}

๋Œ€ํ™”ํ˜• ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

๋Œ€ํ™”ํ˜• ์‹คํ–‰ ํŒŒ์ผ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด stdin ๋ฐ stdout์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋ฉด ์‹คํ–‰ ํŒŒ์ผ์—์„œ ์œ ํšจํ•˜๊ณ  ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์ง€์ •๋œ ํŒŒ์ผ์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • --executable-output-file: ์‹คํ–‰ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํŒŒ์ผ
  • --exeutable-interactive-timeout-millis: ๋Œ€ํ™”ํ˜• ๋ชจ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์ œํ•œ ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜๋Š” 0์ด ์•„๋‹Œ ๊ฐ’(์˜ˆ: ์ œํ•œ ์‹œ๊ฐ„์ด 60์ดˆ์ธ ๊ฒฝ์šฐ์—๋Š” 6000)

์„ฑ๊ณต์ ์ธ ์‘๋‹ต์„ ์œ„ํ•ด ๋‹ค์Œ ํ•„๋“œ๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค(expiration_time ์ œ์™ธ).

{
  "version": 1,
  "success": true,
  "token_type": "urn:ietf:params:oauth:token-type:id_token",
  "id_token": "HEADER.PAYLOAD.SIGNATURE",
  "expiration_time": 1620499962
}

์‹คํ–‰ ํŒŒ์ผ์€ --executable-output-file์— ์ง€์ •๋œ ํŒŒ์ผ์— ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋Š” ๋‹ค์Œ ํ•„๋“œ๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

{
  "version": 1,
  "success": false,
  "code": "401",
  "message": "Caller not authorized."
}

code ๋ฐ message ํ•„๋“œ๋Š” ์ ์ ˆํ•œ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•„๋“œ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๋•Œ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด ๋Œ€ํ™”ํ˜• ๋ฐ ๋น„๋Œ€ํ™”ํ˜• ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์— ๋Œ€ํ•ด ๋™์ผํ•œ ํ•„๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ๋Œ€ํ™”ํ˜• ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์™€ ๋น„๋Œ€ํ™”ํ˜• ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ™”ํ˜• ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด --executable-interactive-timeout-millis ๋ฐ --executable-output-file ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

gcloud iam workforce-pools create-cred-config \
    locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID \
    --subject-token-type=urn:ietf:params:oauth:token-type:id_token  \
    --executable-command=EXECUTABLE_COMMAND \
    --executable-interactive-timeout-millis=EXECUTABLE_INTERACTIVE_TIMEOUT \
    --executable-output-file=EXECUTABLE_OUTPUT_FILE \
    --workforce-pool-user-project=WORKFORCE_POOL_USER_PROJECT \
    --output-file /path/to/generated/config.json

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • WORKFORCE_POOL_ID: ์ง์› ID ํ’€ ID
  • WORKFORCE_PROVIDER_ID: ์ง์› ID ํ’€ ์ œ๊ณต์—…์ฒด ID
  • EXECUTABLE_COMMAND: ์ฃผ์ฒด ํ† ํฐ์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ํ•  ์ธ์ˆ˜๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ๋ช…๋ น์–ด(--executable-command="/path/to/command --arg1=val1 --arg2=val2" ํ˜•์‹)
  • EXECUTABLE_INTERACTIVE_TIMEOUT: ์‹คํ–‰ ํŒŒ์ผ์ด ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ๊ธฐ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)
  • EXECUTABLE_OUTPUT_FILE: ์‹คํ–‰ ํŒŒ์ผ์ด ์ƒ์„ฑํ•œ ์„œ๋“œ ํŒŒํ‹ฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์— ๋Œ€ํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ. ์ด ๊ฒฝ๋กœ๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋จผ์ € ์ด ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • WORKFORCE_POOL_USER_PROJECT: ํ• ๋‹น๋Ÿ‰ ๋ฐ ๊ฒฐ์ œ์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ ๋˜๋Š” ID. ์ฃผ ๊ตฌ์„ฑ์›์€ ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์„ค์ •๋œ serviceusage.services.use ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ OIDC IdP ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{
  "type": "external_account",
  "audience": "//iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID",
  "subject_token_type": "urn:ietf:params:oauth:token-type:id_token",
  "token_url": "https://sts.googleapis.com/v1/token",
  "workforce_pool_user_project": "WORKFORCE_POOL_USER_PROJECT",
  "credential_source": {
    "executable": {
      "command": "EXECUTABLE_COMMAND",
      "interactive_timeout_millis": "EXECUTABLE_INTERACTIVE_TIMEOUT",
      "timeout_millis": "EXECUTABLE_TIMEOUT",
      "output_file": "EXECUTABLE_OUTPUT_FILE",
    }
  }
}

๋˜ํ•œ ์ผ๋ถ€ ๊ฒฝ์šฐ์—๋Š” ๋Œ€ํ™”ํ˜• ์‹คํ–‰ ํŒŒ์ผ์ด ๋น„๋Œ€ํ™”ํ˜• ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ timeout_millis ํ•„๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ˜• ๋ชจ๋“œ์—์„œ ์ด ๋ช…๋ น์–ด๋Š” ๊ธฐ๋ณธ ์ œํ•œ ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

SAML

๋‹ค์Œ ์†Œ์Šค์—์„œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

์–ด์„ค์…˜์ด ํŒŒ์ผ์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ์–ด์„ค์…˜์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ์ƒˆ base64๋กœ ์ธ์ฝ”๋”ฉ๋œ SAML ์–ด์„ค์…˜์œผ๋กœ ์ด ํŒŒ์ผ์„ ์ƒˆ๋กœ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด์„ค์…˜ ์ˆ˜๋ช…์ด 1์‹œ๊ฐ„์ด๋ฉด ํŒŒ์ผ์„ 1์‹œ๊ฐ„ ์ „์— ์ƒˆ๋กœ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud iam workforce-pools create-cred-config \
    locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID \
    --output-file=federation_config.json \
    --credential-source-file=CREDENTIAL_FILE \
    --subject-token-type=urn:ietf:params:oauth:token-type:saml2 \
    --workforce-pool-user-project=WORKFORCE_POOL_USER_PROJECT

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • WORKFORCE_POOL_ID: ์ง์› ID ํ’€ ID
  • WORKFORCE_PROVIDER_ID: ์ง์› ID ํ’€ ์ œ๊ณต์—…์ฒด ID
  • CREDENTIAL_FILE: IdP์—์„œ ์ƒ์„ฑ๋œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
  • WORKFORCE_POOL_USER_PROJECT: ํ• ๋‹น๋Ÿ‰ ๋ฐ ๊ฒฐ์ œ์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ ๋˜๋Š” ID. ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ๋Š” ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ serviceusage.services.use permission์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

URL ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

์–ด์„ค์…˜์€ HTTP `GET` ์š”์ฒญ์— ์‘๋‹ตํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ์„œ๋ฒ„์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์€ [base64๋กœ ์ธ์ฝ”๋”ฉ๋œ](https://toolbox.googleapps.com/apps/encode_decode/) SAML ์–ด์„ค์…˜์ด๊ฑฐ๋‚˜ base64๋กœ ์ธ์ฝ”๋”ฉ๋œ SAML ์–ด์„ค์…˜์ด ํฌํ•จ๋œ JSON์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด `--credential-source-url` ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ```sh gcloud iam workforce-pools create-cred-config \ locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID \ --output-file=federation_config.json \ --credential-source-url=CREDENTIAL_URL \ --subject-token-type=urn:ietf:params:oauth:token-type:saml2 \ --workforce-pool-user-project=WORKFORCE_POOL_USER_PROJECT ``` ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. * WORKFORCE_POOL_ID: ์ง์› ID ํ’€ ID์ž…๋‹ˆ๋‹ค. * WORKFORCE_PROVIDER_ID: ์ง์› ID ํ’€ ์ œ๊ณต์—…์ฒด ID * CREDENTIAL_URL: ๋กœ์ปฌ ์„œ๋ฒ„ ์—”๋“œํฌ์ธํŠธ์˜ URL * WORKFORCE_POOL_USER_PROJECT: ํ• ๋‹น๋Ÿ‰ ๋ฐ ๊ฒฐ์ œ์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ ๋˜๋Š” ID. ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ `serviceusage.services.use ๊ถŒํ•œ`์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ํŒŒ์ผ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

์–ด์„ค์…˜์ด ๋กœ์ปฌ ์‹คํ–‰ ํŒŒ์ผ์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ํŒŒ์ผ์€ ์œ ํšจํ•˜๊ณ  ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์€ SAML ์–ด์„ค์…˜์„ JSON ํ˜•์‹์œผ๋กœ stdout์— ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

{
  "version": 1,
  "success": true,
  "token_type": "urn:ietf:params:oauth:token-type:saml2",
  "saml_response": "...",
  "expiration_time": 1620499962
}

์„ฑ๊ณต์ ์ธ ์‘๋‹ต์„ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ํ•„๋“œ๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค(expiration_time ์ œ์™ธ). expiration_time ํ•„๋“œ๋Š” ์ถœ๋ ฅ ํŒŒ์ผ์ด ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ์— ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‹คํ–‰ ํŒŒ์ผ์— ์˜ํ•ด ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ stdout์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

{
  "version": 1,
  "success": false,
  "code": "401",
  "message": "Caller not authorized."
}

์ด ํ•„๋“œ๋Š” ๋ชจ๋‘ ์˜ค๋ฅ˜ ์‘๋‹ต์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ฐ ๋ฉ”์‹œ์ง€ ํ•„๋“œ๋Š” ์ ์ ˆํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๋•Œ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • version: JSON ์ถœ๋ ฅ์˜ ๋ฒ„์ „. ๋ฒ„์ „ 1๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
  • success: ์‘๋‹ต ์ƒํƒœ. ์ƒํƒœ๊ฐ€ true์ด๋ฉด ์‹คํ–‰ ํŒŒ์ผ์€ ์ข…๋ฃŒ ์ฝ”๋“œ 0์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•˜๋ฉฐ ์‘๋‹ต์—๋Š” ๋‹ค์Œ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • token_type: saml_response
    • ์ถœ๋ ฅ ํŒŒ์ผ์ด ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ์— ์ง€์ •๋œ ๊ฒฝ์šฐ expiration_time ํ•„๋“œ

    ์ƒํƒœ๊ฐ€ false์ด๋ฉด ์‹คํ–‰ ํŒŒ์ผ์€ 0์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•˜๋ฉฐ ์‘๋‹ต์—๋Š” ๋‹ค์Œ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + code + message

  • token_type: ์„œ๋“œ ํŒŒํ‹ฐ ์ œ๋ชฉ ํ† ํฐ ์œ ํ˜•(urn:ietf:params:oauth:token-type:saml2์ด์–ด์•ผ ํ•จ)

  • saml_response: ์„œ๋“œ ํŒŒํ‹ฐ SAML ์‘๋‹ต

  • expiration_time: ์„œ๋“œ ํŒŒํ‹ฐ SAML ์‘๋‹ต ๋งŒ๋ฃŒ ์‹œ๊ฐ„(์ดˆ)(์œ ๋‹‰์Šค ์‹œ๊ฐ„)

  • code: ์˜ค๋ฅ˜ ์ฝ”๋“œ ๋ฌธ์ž์—ด

  • message: ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€

์‹คํ–‰ ํŒŒ์ผ์ด ์‹คํ–‰๋  ๋•Œ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE: ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ์˜ ์ž ์žฌ๊ณ ๊ฐ ํ•„๋“œ. ์ด ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE: ์˜ˆ์ƒ๋˜๋Š” ์ œ๋ชฉ ํ† ํฐ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE: ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ์˜ ์ถœ๋ ฅ ํŒŒ์ผ ์œ„์น˜. ์ด ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ์— ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ์†Œ์Šค ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud iam workforce-pools create-cred-config \
    locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID \
    --subject-token-type=urn:ietf:params:oauth:token-type:saml2  \
    --executable-command=EXECUTABLE_COMMAND \
    --executable-timeout-millis=EXECUTABLE_TIMEOUT \
    --executable-output-file=EXECUTABLE_OUTPUT_FILE \
    --workforce-pool-user-project=WORKFORCE_POOL_USER_PROJECT \
    --output-file /path/to/generated/config.json

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • WORKFORCE_POOL_ID: ์ง์› ID ํ’€ ID
  • WORKFORCE_PROVIDER_ID: ์ง์› ID ํ’€ ์ œ๊ณต์—…์ฒด ID
  • EXECUTABLE_COMMAND: ์ฃผ์ฒด ํ† ํฐ์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ํ•  ์ธ์ˆ˜๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ๋ช…๋ น์–ด(--executable-command="/path/to/command --foo=bar" ํ˜•์‹
  • EXECUTABLE_TIMEOUT: ์„ ํƒ์‚ฌํ•ญ. ์‹คํ–‰ ํŒŒ์ผ์ด ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ์„ ํƒ์  ๊ธฐ๊ฐ„(๋‹จ์œ„: ๋ฐ€๋ฆฌ์ดˆ, ๊ธฐ๋ณธ๊ฐ’: 30์ดˆ)
  • EXECUTABLE_OUTPUT_FILE: ์„ ํƒ์‚ฌํ•ญ. ์‹คํ–‰ ํŒŒ์ผ์ด ์ƒ์„ฑํ•œ ์„œ๋“œ ํŒŒํ‹ฐ ID(3PI) ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • WORKFORCE_POOL_USER_PROJECT: ํ• ๋‹น๋Ÿ‰ ๋ฐ ๊ฒฐ์ œ์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ. ์ฃผ ๊ตฌ์„ฑ์›์€ ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์„ค์ •๋œ serviceusage.services.use ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ SAML IdP ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{
  "type": "external_account",
  "audience": "//iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID",
  "subject_token_type": "urn:ietf:params:oauth:token-type:saml2",
  "token_url": "https://sts.googleapis.com/v1/token",
  "workforce_pool_user_project": "WORKFORCE_POOL_USER_PROJECT",
  "credential_source": {
    "executable": {
      "command": "EXECUTABLE_COMMAND",
      "timeout_millis": "EXECUTABLE_TIMEOUT",
      "output_file": "EXECUTABLE_OUTPUT_FILE"
    }
  }
}

gcloud ๋Œ€ํ™”ํ˜• ๋ชจ๋“œ์— ๋Œ€ํ•œ ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด

gcloud ๋Œ€ํ™”ํ˜• ๋ชจ๋“œ์— ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹คํ–‰์€ ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๋ช…๋ น์–ด์—์„œ ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • EXECUTABLE_OUTPUT_FILE: (ํ•„์ˆ˜์‚ฌํ•ญ) ์‹คํ–‰ ํŒŒ์ผ์ด ์ƒ์„ฑํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
  • EXECUTABLE_TIMEOUT: (ํ•„์ˆ˜์‚ฌํ•ญ) 0์ด ์•„๋‹Œ ์ œํ•œ ์‹œ๊ฐ„ ๊ฐ’์€ ๋ช…๋ น์–ด์— ๋Œ€ํ™”ํ˜• ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    {
      "version": 1,
      "success": true,
      "token_type": "urn:ietf:params:oauth:token-type:saml2",
      "saml_response": "...",
      "expiration_time": 1620499962
    }

์„ฑ๊ณต์ ์ธ ์‘๋‹ต์„ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ํ•„๋“œ๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค(expiration_time ์ œ์™ธ). expiration_time์„ ์ƒ๋žตํ•ด๋„ ์‹คํ–‰ ํŒŒ์ผ์€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ํŒŒ์ผ์€ executable-output-file์— ๋‹ค์Œ JSON ํ˜•์‹์˜ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ํŒŒ์ผ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•  ๋•Œ ์ด๋Ÿฌํ•œ ํ•„๋“œ๋Š” ๋ชจ๋‘ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ฐ ๋ฉ”์‹œ์ง€ ํ•„๋“œ๋Š” ์ ์ ˆํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๋•Œ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

{
  "version": 1,
  "success": false,
  "code": "401",
  "message": "Caller not authorized."
}

๋ช…๋ น์–ด๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด ๋น„๋Œ€ํ™”ํ˜• ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์™€ ๋™์ผํ•œ ํ•„๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ๋น„๋Œ€ํ™”ํ˜• ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ™”ํ˜• ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด --executable-interactive-timeout-millis ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

gcloud iam workforce-pools create-cred-config \
    locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID \
    --subject-token-type=urn:ietf:params:oauth:token-type:saml2  \
    --executable-command=EXECUTABLE_COMMAND \
    --executable-interactive-timeout-millis=EXECUTABLE_INTERACTIVE_TIMEOUT \
    --executable-output-file=EXECUTABLE_OUTPUT_FILE \
    --workforce-pool-user-project=WORKFORCE_POOL_USER_PROJECT \
    --output-file /path/to/generated/config.json

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • WORKFORCE_POOL_ID: ์ง์› ID ํ’€ ID
  • WORKFORCE_PROVIDER_ID: ์ง์› ID ํ’€ ์ œ๊ณต์—…์ฒด ID
  • EXECUTABLE_COMMAND: ์ฃผ์ฒด ํ† ํฐ์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ํ•  ์ธ์ˆ˜๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ๋ช…๋ น์–ด(--executable-command="/path/to/command --foo=bar") ํ˜•์‹)
  • EXECUTABLE_INTERACTIVE_TIMEOUT: ์‹คํ–‰ ํŒŒ์ผ์ด ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ๊ธฐ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)
  • EXECUTABLE_OUTPUT_FILE: ์‹คํ–‰ ํŒŒ์ผ์ด ์ƒ์„ฑํ•œ ์„œ๋“œ ํŒŒํ‹ฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์— ๋Œ€ํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ. ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋จผ์ € ์ด ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • WORKFORCE_POOL_USER_PROJECT: ํ• ๋‹น๋Ÿ‰ ๋ฐ ๊ฒฐ์ œ์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ ๋˜๋Š” ID. ์ฃผ ๊ตฌ์„ฑ์›์€ ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์„ค์ •๋œ serviceusage.services.use ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ SAML IdP ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{
  "type": "external_account",
  "audience": "//iam.googleapis.com/locations/global/workforcePools/<var>WORKFORCE_POOL_ID<var>/providers/<var>WORKFORCE_PROVIDER_ID</var>",
  "subject_token_type": "urn:ietf:params:oauth:token-type:saml2",
  "token_url": "https://sts.googleapis.com/v1/token",
  "workforce_pool_user_project": "<var>WORKFORCE_POOL_USER_PROJECT</var>",
  "credential_source": {
    "executable": {
      "command": "<var>EXECUTABLE_COMMAND</var>",
      "interactive_timeout_millis": "<var>EXECUTABLE_INTERACTIVE_TIMEOUT</var>",
      "timeout_millis": "<var>EXECUTABLE_TIMEOUT</var>",
      "output_file": "<var>EXECUTABLE_OUTPUT_FILE</var>",
    }
  }
}

๋กœ๊ทธ์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud auth login --cred-file=/path/to/config.json

gcloud CLI์™€ bq ๋ช…๋ น์ค„ ๋„๊ตฌ๋Š” ์‹คํ–‰ ์†Œ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ์œ ํ˜•์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ—ค๋“œ๋ฆฌ์Šค ํ๋ฆ„์˜ ๊ฒฝ์šฐ gcloud CLI๋Š” ์ž๋™์œผ๋กœ https://www.googleapis.com/auth/cloud-platform ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด gcloud CLI๊ฐ€ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ณด์•ˆ ํ† ํฐ ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ์— ํˆฌ๋ช…ํ•˜๊ฒŒ ๊ฒŒ์‹œํ•˜์—ฌ, ์—ฌ๊ธฐ์—์„œ ์ž„์‹œGoogle Cloud ์•ก์„ธ์Šค ํ† ํฐ์œผ๋กœ ๊ตํ™˜๋ฉ๋‹ˆ๋‹ค.

์ด์ œ gcloud CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ gcloud ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Google Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ง€์›๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ Google ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๊ฐ€ ์ƒ์„ฑ๋˜๋„๋ก ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ํ† ํฐ ๊ตํ™˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ง์› ํ’€์„ ์œ„ํ•œGoogle Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Node.js, Java, Python, Go, C++(gRPC) ์–ธ์–ด๋กœ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์„œ๋น„์Šค ๋˜๋Š” ์–ธ์–ด๋กœ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

bq ๋„๊ตฌ

์ง์› ID ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•˜๋ ค๋ฉด gcloud auth login ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud auth login --cred-file=FILEPATH.json

์—ฌ๊ธฐ์„œ FILEPATH๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

bq ๋„๊ตฌ์—์„œ ์ง์› ID ์ œํœด ์ง€์›์€ Google Cloud CLI ๋ฒ„์ „ 390.0.0 ์ด์ƒ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

C++

๋Œ€๋ถ€๋ถ„์˜ C++์šฉGoogle Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” grpc::GoogleDefaultCredentials()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑ๋œ ChannelCredentials ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ์ง์› ID ์ œํœด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ gRPC ๋ฒ„์ „ 1.42.0 ์ด์ƒ์œผ๋กœ ๋นŒ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

C++์šฉ Cloud Storage Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” gRPC๊ฐ€ ์•„๋‹Œ REST API๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ง์› ID ์ œํœด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

auto creds = grpc::GoogleDefaultCredentials();

// Create a channel, stub and make RPC calls (same as in the previous example)
auto channel = grpc::CreateChannel("greeter.googleapis.com", creds);
std::unique_ptr<Greeter::Stub> stub(Greeter::NewStub(channel));
grpc::Status s = stub->sayHello(&context, *request, response);

gcloud

์ง์› ID ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•˜๋ ค๋ฉด gcloud auth login ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud auth login --cred-file=FILEPATH.json

FILEPATH๋ฅผ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

gcloud CLI์—์„œ ์ง์› ID ์ œํœด๋Š” Google Cloud CLI ๋ฒ„์ „ 392.0.0 ์ด์ƒ์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

Go

golang.org/x/oauth2 ๋ชจ๋“ˆ ๋ฒ„์ „ v0.0.0-20211005180243-6b3c2da341f1 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Go์šฉ Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง์› ID ์ œํœด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

import (
  "context"
  "fmt"
  "log"

  "cloud.google.com/go/storage"
  "google.golang.org/api/iterator"
  "google.golang.org/api/option"
  "io/ioutil"
)
ctx := context.Background()
client, err := storage.NewClient(ctx)
# Explicit initialization can also be used.
# var jsonPath = "/path/to/3p-credentials.json"
# client, err := storage.NewClient(ctx, option.WithCredentialsFile(jsonPath))
if err != nil {
  log.Fatal(err)
}
fmt.Println("Buckets:")
it := client.Buckets(ctx, projectID)
for {
  battrs, err := it.Next()
  if err == iterator.Done {
    break
  }
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println(battrs.Name)
}

Java

com.google.auth:google-auth-library-oauth2-http ์•„ํ‹ฐํŒฉํŠธ ๋ฒ„์ „ 1.2.0 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Java์šฉ Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง์› ID ์ œํœด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
GoogleCredentials sourceCredentials = credentials
    .createScoped(Arrays.asList("https://www.googleapis.com/auth/devstorage.read_only"));

Storage storageService = StorageOptions.newBuilder().setProjectId("project-id")
    .setCredentials(sourceCredentials).build().getService();

Node.js

google-auth-library ํŒจํ‚ค์ง€ ๋ฒ„์ „ 7.10.0 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Node.js์šฉ Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง์› ID ์ œํœด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€๊ณผ ๋‹ฌ๋ฆฌ ์ง์› ID ํ’€์€ Google Cloud ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹Œ ์กฐ์ง๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. GoogleAuth ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ํ”„๋กœ์ ํŠธ ID๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ google-auth-library ํŒจํ‚ค์ง€์˜ ๋ฆฌ๋“œ๋ฏธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

const auth = new GoogleAuth({
  scopes: 'https://www.googleapis.com/auth/cloud-platform',
  // Specify a project ID.
  projectId: 'CLOUD_RESOURCE_PROJECT_ID',
});

# API request using Auth library.
const client = await auth.getClient();
const url =
    `https://storage.googleapis.com/storage/v1/b?projects=${projectId}`;
const res = await client.request({url});
console.log(res.data);

Python

google-auth ํŒจํ‚ค์ง€ ๋ฒ„์ „ 2.3.0 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Python์šฉ Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง์› ID ์ œํœด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

from google.cloud import storage
import google.auth

credentials, project = google.auth.default(
    scopes=['https://www.googleapis.com/auth/devstorage.read_only'])

client = storage.Client(
    project="project-id", credentials=credentials)

์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ”„๋กœ์ ํŠธ ID๋ฅผ ์ž๋™์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†์œผ๋ฉด project ๊ฐ’์ด None์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ์ง€ ํด๋ผ์ด์–ธํŠธ ์˜ˆ์™€ ๊ฐ™์ด ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ”„๋กœ์ ํŠธ ID๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ GOOGLE_CLOUD_PROJECT๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ ID๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ google-auth ํŒจํ‚ค์ง€ ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

REST API ์‚ฌ์šฉ

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Google Cloud Security Token Service API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์™ธ๋ถ€ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ Google Cloud ์•ก์„ธ์Šค ํ† ํฐ์œผ๋กœ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

curl https://sts.googleapis.com/v1/token \
    --data-urlencode "audience=//iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID" \
    --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
    --data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:access_token" \
    --data-urlencode "scope=https://www.googleapis.com/auth/cloud-platform" \
    --data-urlencode "subject_token_type=SUBJECT_TOKEN_TYPE" \
    --data-urlencode "subject_token=EXTERNAL_SUBJECT_TOKEN"  \
    --data-urlencode "options={\"userProject\":\"BILLING_PROJECT_NUMBER\"}"

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • AUDIENCE: ์ฃผ์ฒด ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๋Š” ๊ณต๊ธ‰์—…์ฒด์˜ ์ „์ฒด ๋ฆฌ์†Œ์Šค ์ด๋ฆ„
  • WORKFORCE_POOL_ID: ์ง์› ID ํ’€ ID์ž…๋‹ˆ๋‹ค.
  • WORKFORCE_PROVIDER_ID: ์ง์› ID ํ’€ ์ œ๊ณต์—…์ฒด ID
  • SUBJECT_TOKEN_TYPE์„ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    • OIDC ID ํ† ํฐ: urn:ietf:params:oauth:token-type:id_token
    • SAML ์–ด์„ค์…˜: urn:ietf:params:oauth:token-type:saml2
  • EXTERNAL_SUBJECT_TOKEN: ์•ก์„ธ์Šค ํ† ํฐ์ด ์š”์ฒญ๋œ ์ฃผ ๊ตฌ์„ฑ์›์˜ ID๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” IdP ๋ฐœ๊ธ‰ ํ† ํฐ

    OIDC ์ œ๊ณต์—…์ฒด๋ฅผ ๊ตฌ์„ฑํ•œ ๊ฒฝ์šฐ ํ† ํฐ์€ JWT ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • BILLING_PROJECT_NUMBER: ํ• ๋‹น๋Ÿ‰ ๋ฐ ๊ฒฐ์ œ์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ ๋˜๋Š” ID. ์ฃผ ๊ตฌ์„ฑ์›์€ ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์„ค์ •๋œ serviceusage.services.use ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‘๋‹ต์€ ๋‹ค์Œ ์˜ˆ์‹œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

{
  "access_token": "ya29.dr.AaT61Tc6Ntv1ktbGkaQ9U_MQfiQw...",
  "issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
  "token_type": "Bearer",
  "expires_in": 3600
}

gcloud CLI๋ฅผ ์‚ฌ์šฉํ•œ ์„ธ์…˜ ๊ด€๋ฆฌ

gcloud CLI๊ฐ€ Security Token Service ์—”๋“œํฌ์ธํŠธ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ์ž„์‹œ Google Cloud ํ† ํฐ์€ ์ง€์ •๋œ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์ด ์ง€๋‚˜๋ฉด ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ํ† ํฐ์ด ๊ณง ๋งŒ๋ฃŒ๋˜๋ฉด gcloud CLI์—์„œ ์ œ๊ณต๋œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ํŒŒ์ผ์„ ๊ฒ€์‚ฌํ•˜๊ณ  IdP์—์„œ ๋ฐ›์€ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๊ฐ€ ์—ฌ์ „ํžˆ ์œ ํšจํ•œ ๊ฒฝ์šฐ์—๋Š” gcloud CLI์—์„œ ์ƒˆGoogle Cloud ์•ก์„ธ์Šค ํ† ํฐ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ค๊ณ  ํ˜„์žฌ ์„ธ์…˜์ด ์ค‘๋‹จ ์—†์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๊ฐ€ ๋งŒ๋ฃŒ๋˜๋ฉด ์ƒˆ Google Cloud ํ† ํฐ์ด ๋ฐœ๊ธ‰๋˜์ง€ ์•Š๊ณ  ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํ˜ธ์ถœ์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ๋‹ค์‹œ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์„ธ์…˜์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud auth revoke

gcloud๋Š” ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž ์„ธ์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํ™œ์„ฑ ์„ธ์…˜์„ ํฌํ•จํ•˜์—ฌ ์„ธ์…˜ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud auth list

์ด ๋ช…๋ น์–ด ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

Credentialed Accounts
ACTIVE    ACCOUNT
*         bola@example.com
          principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/kalani@example.com

๋‹ค๋ฅธ ์„ธ์…˜์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์ด๋ฅผ ํ™œ์„ฑ ์ƒํƒœ๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud config set account principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/SUBJECT_ID

๋‹ค์Œ ๋‹จ๊ณ„