์ด ๊ฐ์ด๋์์๋ ์ง์ ID ํ ๋ฐ ์ง์ ID ํ ๊ณต๊ธ์ ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด์ ํ ํฐ ์๋น์ค์์ ๋จ๊ธฐ ํ ํฐ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. ํ ํฐ์ ์ฌ์ฉํ์ฌ ์ก์ธ์ค ๊ถํ์ด ๋ถ์ฌ๋ ์ง์ ID ์ ํด๋ฅผ ์ง์ํ๋ Google Cloud ๋ฆฌ์์ค์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
ํค๋๋ฆฌ์ค ๋จธ์ ์์ ์ด ๊ฐ์ด๋์ ์ค๋ช ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์์ ๋ท๋ถ๋ถ์์ ์์ธํ ์ค๋ช ๋ ๋ค์์ ๋๋ต์ ์ธ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋จ๊ธฐ ํ ํฐ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
- ์ ๋ขฐํ ์ ์๋ ID ๊ณต๊ธ์ ์ฒด์์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- ๋ณด์ ํ ํฐ ์๋น์ค์ ํ ํฐ์ ๋ํด ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ตํํฉ๋๋ค.
์์ํ๊ธฐ ์ ์
์ง์ ID ์ ํด๋ฅผ ๊ตฌ์ฑํ๊ฑฐ๋ IdP ๊ด๋ จ ์๋ด๋ ๋ค์ ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
์ง์ ID ํ ID์ ์ง์ ID ํ ์ ๊ณต์ ์ฒด ID๋ฅผ ๊ธฐ๋กํด ๋ก๋๋ค.
Identity and Access Management(IAM) ๊ถํ
serviceusage.services.use
๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. ์ด ๊ถํ์ด ํฌํจ๋ ์ต์ ๊ถํ ์ญํ ์ ์๋น์ค ์ฌ์ฉ๋ ์๋น์(roles/serviceusage.serviceUsageConsumer
)์ ๋๋ค.Enable the IAM and Security Token Service APIs.
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
: ๊ณต๊ธ์ ์ฒด IDLOGIN_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
๋ค์ ์์ค์์ ๊ตฌ์ฑ ํ์ผ์ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
- ํ์ผ ์์ค ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด
- URL ์์ค ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด
- ๋น๋ํํ ์คํ ์์ค ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด
- ๋ํํ ์คํ ์์ค ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด
ํ์ผ ์์ค ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด
ํ์ผ ์์ค ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ฉด ํ ํฐ์ด ํ์ผ์์ ๋ก๋๋ฉ๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ด์ ํ ํฐ์ด ๋ง๋ฃ๋๊ธฐ ์ ์ ์ 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 ํ ์ ๊ณต์ ์ฒด IDPATH_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 ํ IDWORKFORCE_PROVIDER_ID
: ์ง์ ID ํ ์ ๊ณต์ ์ฒด IDURL_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 ํ IDWORKFORCE_PROVIDER_ID
: ์ง์ ID ํ ์ ๊ณต์ ์ฒด IDEXECUTABLE_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 ํ IDWORKFORCE_PROVIDER_ID
: ์ง์ ID ํ ์ ๊ณต์ ์ฒด IDEXECUTABLE_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
๋ค์ ์์ค์์ ๊ตฌ์ฑ ํ์ผ์ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
- ํ์ผ ์์ค ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด
- URL ์์ค ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด
- ์คํ ์์ค ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด
- gcloud ๋ํํ ๋ชจ๋์ ๋ํ ์คํ ์์ค ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด
ํ์ผ ์์ค ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด
์ด์ค์ ์ด ํ์ผ์์ ๋ก๋๋ฉ๋๋ค. ์ด์ ์ด์ค์ ์ด ๋ง๋ฃ๋๊ธฐ ์ ์ ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ์ 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 ํ IDWORKFORCE_PROVIDER_ID
: ์ง์ ID ํ ์ ๊ณต์ ์ฒด IDCREDENTIAL_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 ํ IDWORKFORCE_PROVIDER_ID
: ์ง์ ID ํ ์ ๊ณต์ ์ฒด IDEXECUTABLE_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 ํ IDWORKFORCE_PROVIDER_ID
: ์ง์ ID ํ ์ ๊ณต์ ์ฒด IDEXECUTABLE_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 ํ ์ ๊ณต์ ์ฒด IDSUBJECT_TOKEN_TYPE
์ ๋ค์ ์ค ํ๋๋ก ์ค์ ํฉ๋๋ค.- OIDC ID ํ ํฐ:
urn:ietf:params:oauth:token-type:id_token
- SAML ์ด์ค์
:
urn:ietf:params:oauth:token-type:saml2
- OIDC ID ํ ํฐ:
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
๋ค์ ๋จ๊ณ
- ์ง์ ID ์ ํด ์ฌ์ฉ์ ๋ฐ ๋ฐ์ดํฐ ์ญ์
- ์ง์ ID ์ ํด๋ฅผ ์ง์ํ๋ Google Cloud ์ ํ ์์๋ณด๊ธฐ
- ์ฝ์์ ๋ํ ์ฌ์ฉ์ ์ก์ธ์ค ์ค์ (์ ํด)