์ด ํ์ด์ง์์๋ ์๋ช ๋ IAP ํค๋๋ก ์ฑ์ ๋ณดํธํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค. IAP(Identity-Aware Proxy)๊ฐ ๊ตฌ์ฑ๋๋ฉด JWT(JSON ์น ํ ํฐ)๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ๋ํ ์์ฒญ์ด ์น์ธ๋์๋์ง ํ์ธํฉ๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ ๋ค์ ์ข ๋ฅ์ ์ํ์ผ๋ก๋ถํฐ ์ฑ์ ๋ณดํธํฉ๋๋ค.
- ์ค์๋ก ์ฌ์ฉ ์ค์ง๋ IAP
- ์๋ชป ๊ตฌ์ฑ๋ ๋ฐฉํ๋ฒฝ
- ํ๋ก์ ํธ ๋ด๋ถ์์์ ์ก์ธ์ค
์ฑ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ณดํธํ๋ ค๋ฉด ๋ชจ๋ ์ฑ ์ ํ์ ์๋ช ๋ ํค๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋๋ App Engine ํ์ค ํ๊ฒฝ ์ฑ์ด ์๋ ๊ฒฝ์ฐ Users API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Compute Engine ๋ฐ GKE ์ํ ์ ๊ฒ์ JWT ํค๋๋ฅผ ํฌํจํ์ง ์์ผ๋ฉฐ IAP๋ ์ํ ์ ๊ฒ์ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. ์ํ ์ ๊ฒ์ด ์ก์ธ์ค ์ค๋ฅ๋ฅผ ๋ฐํํ ๊ฒฝ์ฐ, Google Cloud ์ฝ์์์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง ๊ทธ๋ฆฌ๊ณ JWT ํค๋ ๊ฒ์ฆ์์ ์ํ ์ ๊ฒ ๊ฒฝ๋ก๋ฅผ ํ์ฉํ๋์ง ํ์ธํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ํ ์ ๊ฒ ์์ธ ๋ง๋ค๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์์ํ๊ธฐ ์ ์
์๋ช ๋ ํค๋๋ก ์ฑ์ ๋ณดํธํ๊ธฐ ์ํด์๋ ๋ค์์ด ํ์ํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ์ฐ๊ฒฐํ๋๋ก ํ๋ ค๋ ์ ํ๋ฆฌ์ผ์ด์
ES256
์๊ณ ๋ฆฌ์ฆ์ ์ง์ํ๋ ํด๋น ์ธ์ด์ ์ 3์ JWT ๋ผ์ด๋ธ๋ฌ๋ฆฌ
IAP ํค๋๋ก ์ฑ ๋ณดํธ
IAP JWT๋ก ์ฑ์ ๋ณดํธํ๊ธฐ ์ํด์๋ JWT์ ํค๋, ํ์ด๋ก๋, ์๋ช
์ ํ์ธํฉ๋๋ค. JWT๋ HTTP ์์ฒญ ํค๋ x-goog-iap-jwt-assertion
์ ์์ต๋๋ค. ๊ณต๊ฒฉ์๊ฐ IAP๋ฅผ ์ฐํํ ๊ฒฝ์ฐ, ๊ณต๊ฒฉ์๋ IAP ๋น์๋ช
ID ํค๋์ธ x-goog-authenticated-user-{email,id}
๋ฅผ ์์กฐํ ์ ์์ต๋๋ค. IAP JWT๋ ๋ณด๋ค ์์ ํ ๋์์ ์ ๊ณตํฉ๋๋ค.
์๋ช
๋ ํค๋๋ ๋ค๋ฅธ ์ฌ๋์ด IAP๋ฅผ ์ฐํํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ๋ณด์กฐ ๋ณด์ ์๋จ์ ์ ๊ณตํฉ๋๋ค. IAP๊ฐ ์ฌ์ฉ ์ค์ ๋๋ฉด ์์ฒญ์ด IAP ์ ๊ณต ์ธํ๋ผ๋ฅผ ํต๊ณผํ ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ณตํ x-goog-*
ํค๋๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค.
JWT ํค๋ ํ์ธ
JWT ํค๋๊ฐ ๋ค์ ์ ์ฝ์กฐ๊ฑด์ ๋ฐ๋ฅด๋์ง ํ์ธํฉ๋๋ค.
JWT ํค๋ ํด๋ ์ | ||
---|---|---|
alg |
์๊ณ ๋ฆฌ์ฆ | ES256 |
kid |
ํค ID |
https://www.gstatic.com/iap/verify/public_key ๋ฐ https://www.gstatic.com/iap/verify/public_key-jwk ์ ๋ ๊ฐ์ง ํ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ IAP ํค ํ์ผ์ ๋์ด๋ ๊ณต๊ฐ ํค ์ค ํ๋์ ์ผ์นํด์ผ ํฉ๋๋ค.
|
ํ ํฐ์ kid
ํด๋ ์์ ํด๋นํ๋ ๋น๊ณต๊ฐ ํค๋ก JWT์ ์๋ช
ํ๋์ง ํ์ธํฉ๋๋ค. ์ด๋ฅผ ์ํด์๋ ๋จผ์ ๋ค์ ๋ ์์น ์ค ํ๋์์ ๊ณต๊ฐ ํค๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
https://www.gstatic.com/iap/verify/public_key
. ์ด URL์๋kid
ํด๋ ์์ ๊ณต๊ฐ ํค ๊ฐ์ ๋งคํํ๋ JSON ๋์ ๋๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.https://www.gstatic.com/iap/verify/public_key-jwk
. ์ด URL์๋ JWK ํ์์ IAP ๊ณต๊ฐ ํค๊ฐ ํฌํจ๋ฉ๋๋ค.
๊ณต๊ฐ ํค๊ฐ ์ค๋น๋ ๋ค์์๋ JWT ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ช ์ ํ์ธํฉ๋๋ค.
JWT ํ์ด๋ก๋ ํ์ธ
JWT์ ํ์ด๋ก๋๊ฐ ๋ค์ ์ ์ฝ์กฐ๊ฑด์ ๋ฐ๋ฅด๋์ง ํ์ธํฉ๋๋ค.
JWT ํ์ด๋ก๋ ํด๋ ์ | ||
---|---|---|
exp |
๋ง๋ฃ ์๊ฐ | ๋ฏธ๋ ์๊ฐ์ด์ด์ผ ํฉ๋๋ค. UNIX ๊ธฐ์ ์ ๊ธฐ์ค์ผ๋ก ์ธก์ ํ ์๊ฐ(์ด)์ ๋๋ค. ๋ณด์ ๊ฐ์ 30์ด๊ฐ ํ์ฉ๋ฉ๋๋ค. ํ ํฐ์ ์ต๋ ์๋ช ์ 10๋ถ + 2 * ๋ณด์ ๊ฐ์ ๋๋ค. |
iat |
๋ฐ๊ธ ์๊ฐ | ๊ณผ๊ฑฐ ์๊ฐ์ด์ด์ผ ํฉ๋๋ค. UNIX ๊ธฐ์ ์ ๊ธฐ์ค์ผ๋ก ์ธก์ ํ ์๊ฐ(์ด)์ ๋๋ค. ๋ณด์ ๊ฐ์ 30์ด๊ฐ ํ์ฉ๋ฉ๋๋ค. |
aud |
๋์ |
๋ค์ ๊ฐ์ด ํฌํจ๋ ๋ฌธ์์ด์ด์ด์ผ ํฉ๋๋ค.
|
iss |
๋ฐ๊ธ์ |
https://cloud.google.com/iap ์ฌ์ผ ํฉ๋๋ค.
|
hd |
๊ณ์ ๋๋ฉ์ธ |
๊ณ์ ์ด ํธ์คํ
๋ ๋๋ฉ์ธ์ ์ํ ๊ฒฝ์ฐ, ๊ณ์ ์ด ์ฐ๊ฒฐ๋ ๋๋ฉ์ธ์ ๊ตฌ๋ถํ๊ธฐ ์ํด hd ํด๋ ์์ด ์ ๊ณต๋ฉ๋๋ค.
|
google |
Google ํด๋ ์ |
ํ๋ ์ด์์ ์ก์ธ์ค ์์ค์ด ์์ฒญ์ ์ ์ฉ๋ ๊ฒฝ์ฐ ํด๋น ์ด๋ฆ์ด google ํด๋ ์์ JSON ๊ฐ์ฒด ๋ด๋ถ์ access_levels ํค ์๋์ ๋ฌธ์์ด ๋ฐฐ์ด๋ก ์ ์ฅ๋ฉ๋๋ค.
๊ธฐ๊ธฐ ์ ์ฑ
์ ์ง์ ํ๊ณ ์กฐ์ง์ ๊ธฐ๊ธฐ ๋ฐ์ดํฐ์ ๋ํ ์ก์ธ์ค ๊ถํ์ด ์์ผ๋ฉด |
Google Cloud ์ฝ์์ ์ก์ธ์คํ์ฌ ์์ ์ค๋ช
๋ aud
๋ฌธ์์ด์ ๊ฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋ gcloud ๋ช
๋ น์ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Google Cloud ์ฝ์์์ aud
๋ฌธ์์ด ๊ฐ์ ์ป์ผ๋ ค๋ฉด ํ๋ก์ ํธ์ Identity-Aware Proxy ์ค์ ์ผ๋ก ์ด๋ํ์ฌ ๋ถํ ๋ถ์ฐ๊ธฐ ๋ฆฌ์์ค ์์ ์๋ ๋๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ ํ ์๋ช
๋ ํค๋ JWT ๋์์ ์ ํํ์ธ์. ํ์๋๋ ์๋ช
๋ ํค๋ JWT ๋ํ์์์ ์ ํ๋ ๋ฆฌ์์ค์ aud
ํด๋ ์์ด ํ์๋ฉ๋๋ค.
gcloud CLI
gcloud ๋ช
๋ น์ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ aud
๋ฌธ์์ด ๊ฐ์ ๊ฐ์ ธ์ค๋ ค๋ฉด ํ๋ก์ ํธ ID๋ฅผ ์์์ผ ํฉ๋๋ค. Google Cloud ์ฝ์
ํ๋ก์ ํธ ์ ๋ณด ์นด๋์์ ํ๋ก์ ํธ ID๋ฅผ ์ฐพ์ ๋ค์ ๊ฐ ๊ฐ์ ๋ํด ์๋ ์ง์ ๋ ๋ช
๋ น์ด๋ฅผ ์คํํ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ ๋ฒํธ
gcloud ๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ ๋ฒํธ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์.
gcloud projects describe PROJECT_ID
์ด ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๋น์ทํ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
createTime: '2016-10-13T16:44:28.170Z' lifecycleState: ACTIVE name: project_name parent: id: '433637338589' type: organization projectId: PROJECT_ID projectNumber: 'PROJECT_NUMBER'
์๋น์ค ID
gcloud ๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค ID๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์.
gcloud compute backend-services describe SERVICE_NAME --project=PROJECT_ID --global
์ด ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๋น์ทํ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
affinityCookieTtlSec: 0 backends: - balancingMode: UTILIZATION capacityScaler: 1.0 group: https://www.googleapis.com/compute/v1/projects/project_name/regions/us-central1/instanceGroups/my-group connectionDraining: drainingTimeoutSec: 0 creationTimestamp: '2017-04-03T14:01:35.687-07:00' description: '' enableCDN: false fingerprint: zaOnO4k56Cw= healthChecks: - https://www.googleapis.com/compute/v1/projects/project_name/global/httpsHealthChecks/my-hc id: 'SERVICE_ID' kind: compute#backendService loadBalancingScheme: EXTERNAL name: my-service port: 8443 portName: https protocol: HTTPS selfLink: https://www.googleapis.com/compute/v1/projects/project_name/global/backendServices/my-service sessionAffinity: NONE timeoutSec: 3610
์ฌ์ฉ์ ID ๊ฒ์
์์ ๋ชจ๋ ํ์ธ์ด ์ฑ๊ณตํ ๊ฒฝ์ฐ ์ฌ์ฉ์ ID๋ฅผ ๊ฒ์ํฉ๋๋ค. ID ํ ํฐ์ ํ์ด๋ก๋์๋ ๋ค์ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค.
ID ํ ํฐ ํ์ด๋ก๋ ์ฌ์ฉ์ ID | ||
---|---|---|
sub |
์ ๋ชฉ |
์ฌ์ฉ์์ ๋ํ ๊ณ ์ ํ๊ณ ์์ ์ ์ธ ์๋ณ์์
๋๋ค. x-goog-authenticated-user-id ํค๋ ๋์ ์ด ๊ฐ์ ์ฌ์ฉํ์ธ์.
|
email |
์ฌ์ฉ์ ์ด๋ฉ์ผ | ์ฌ์ฉ์ ์ด๋ฉ์ผ ์ฃผ์์
๋๋ค.
|
๋ค์์ ์๋ช ๋ IAP ํค๋๋ก ์ฑ์ ๋ณดํธํ๊ธฐ ์ํ ์ํ ์ฝ๋์ ๋๋ค.
C#
Go
Java
Node.js
PHP
Python
Ruby
๊ฒ์ฆ ์ฝ๋ ํ ์คํธ
secure_token_test
์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ผ๋ก ์ด๋ํ๋ฉด IAP์ ์๋ชป๋ JWT๊ฐ ํฌํจ๋ฉ๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ์ฌ JWT ๊ฒ์ฆ ๋ก์ง์ด ๋ค์ํ ์คํจ ์ฌ๋ก๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์๋์ง ํ์ธํ๊ณ ์๋ชป๋ JWT๋ฅผ ๋ฐ์ ๋์ ์ฑ ๋์์ ํ์ธํฉ๋๋ค.
์ํ ์ ๊ฒ ์์ธ ๋ง๋ค๊ธฐ
์์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ Compute Engine ๋ฐ GKE ์ํ ์ ๊ฒ์ JWT ํค๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ IAP๋ ์ํ ์ ๊ฒ์ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. ์ํ ์ ๊ฒ์ ๊ตฌ์ฑํ ํ์๊ฐ ์๊ณ , ์ฑ์ด ์ํ ์ ๊ฒ์ ํ์ฉํ๋๋ก ๊ตฌ์ฑํ ํ์๊ฐ ์์ต๋๋ค.
์ํ ์ ๊ฒ ๊ตฌ์ฑ
์ํ ์ ๊ฒ์ ๋ํด ์์ง ๊ฒฝ๋ก๋ฅผ ์ค์ ํ์ง ์์ ๊ฒฝ์ฐ,Google Cloud ์ฝ์์ ์ฌ์ฉํด์ ์ํ ์ ๊ฒ์ ๋ํด ์ค์ํ์ง ์์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํฉ๋๋ค. ์ด ๊ฒฝ๋ก๋ ๋ค๋ฅธ ๋ฆฌ์์ค์ ์ํด ๊ณต์ ๋์ง ์๋๋ก ํ์ธ์.
- Google Cloud ์ฝ์์ ์ํ ์ ๊ฒ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
์ํ ์ ๊ฒ ํ์ด์ง๋ก ์ด๋ - ์ฑ์ ์ฌ์ฉ ์ค์ธ ์ํ ์ ๊ฒ์ ํด๋ฆญํ ํ ์์ ์ ํด๋ฆญํฉ๋๋ค.
- ์์ฒญ ๊ฒฝ๋ก ์๋์์ ์ค์ํ์ง ์์ ๊ฒฝ๋ก ์ด๋ฆ์ ์ถ๊ฐํฉ๋๋ค. ์ด๋ Google Cloud ๊ฐ ์ํ ์ ๊ฒ ์์ฒญ์ ๋ณด๋ผ ๋ ์ฌ์ฉํ๋ URL ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค.
์๋ตํ๋ฉด ์ํ ์ ๊ฒ ์์ฒญ์ด
/
๋ก ์ ์ก๋ฉ๋๋ค. - ์ ์ฅ์ ํด๋ฆญํฉ๋๋ค.
JWT ๊ฒ์ฆ ๊ตฌ์ฑ
JWT ๊ฒ์ฆ ๋ฃจํด์ ํธ์ถํ๋ ์ฝ๋์์ ์ํ ์ ๊ฒ ์์ฒญ ๊ฒฝ๋ก์ ๋ํด 200 HTTP ์ํ๋ฅผ ์ ๊ณตํ๋ ์กฐ๊ฑด์ ์ถ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
if HttpRequest.path_info = '/HEALTH_CHECK_REQUEST_PATH' return HttpResponse(status=200) else VALIDATION_FUNCTION
์ธ๋ถ ID๋ฅผ ์ํ JWT
์ธ๋ถ ID์ ํจ๊ป IAP๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ IAP๋ Google ID์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ์ฆ๋ ๋ชจ๋ ์์ฒญ์ ๋ํด ์๋ช ๋ JWT๋ฅผ ๊ณ์ ๋ฐํํฉ๋๋ค. ํ์ง๋ง ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ด ์์ต๋๋ค.
์ ๊ณต์ ์ฒด ์ ๋ณด
์ธ๋ถ ID๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ JWT ํ์ด๋ก๋์๋ gcip
๋ผ๋ ํด๋ ์์ด ํฌํจ๋ฉ๋๋ค. ์ด ํด๋ ์์๋ ์ด๋ฉ์ผ ๋ฐ ์ฌ์ง URL๊ณผ ๊ฐ์ ์ฌ์ฉ์์ ๋ํ ์ ๋ณด์ ์ถ๊ฐ ์ ๊ณต์
์ฒด๋ณ ์์ฑ์ด ํฌํจ๋ฉ๋๋ค.
๋ค์์ Facebook์ผ๋ก ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ฅผ ์ํ JWT ์์์ ๋๋ค.
"gcip": '{
"auth_time": 1553219869,
"email": "facebook_user@gmail.com",
"email_verified": false,
"firebase": {
"identities": {
"email": [
"facebook_user@gmail.com"
],
"facebook.com": [
"1234567890"
]
},
"sign_in_provider": "facebook.com",
},
"name": "Facebook User",
"picture: "https://graph.facebook.com/1234567890/picture",
"sub": "gZG0yELPypZElTmAT9I55prjHg63"
}',
email
๋ฐ sub
ํ๋
Identity Platform์์ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ ๊ฒฝ์ฐ JWT์ email
๋ฐ sub
ํ๋ ์์ Identity Platform ํ ํฐ ๋ฐ๊ธ๊ธฐ๊ด๊ณผ ์ฌ์ฉ๋ ํ
๋ํธ ID(์๋ ๊ฒฝ์ฐ)๊ฐ ํ๋ฆฌํฝ์ค๋ก ๋ถ์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"email": "securetoken.google.com/PROJECT-ID/TENANT-ID:demo_user@gmail.com", "sub": "securetoken.google.com/PROJECT-ID/TENANT-ID:gZG0yELPypZElTmAT9I55prjHg63"
sign_in_attributes
๋ก ์ก์ธ์ค ์ ์ด
IAM์ ์ธ๋ถ ID์ ํจ๊ป ์ฌ์ฉํ ์ ์์ง๋ง ๋์ sign_in_attributes
ํ๋์ ํฌํจ๋ ํด๋ ์์ ์ฌ์ฉํ์ฌ ์ก์ธ์ค๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, SAML ์ ๊ณต์
์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ฅผ ๊ณ ๋ คํฉ๋๋ค.
{
"aud": "/projects/project_number/apps/my_project_id",
"gcip": '{
"auth_time": 1553219869,
"email": "demo_user@gmail.com",
"email_verified": true,
"firebase": {
"identities": {
"email": [
"demo_user@gmail.com"
],
"saml.myProvider": [
"demo_user@gmail.com"
]
},
"sign_in_attributes": {
"firstname": "John",
"group": "test group",
"role": "admin",
"lastname": "Doe"
},
"sign_in_provider": "saml.myProvider",
"tenant": "my_tenant_id"
},
"sub": "gZG0yELPypZElTmAT9I55prjHg63"
}',
"email": "securetoken.google.com/my_project_id/my_tenant_id:demo_user@gmail.com",
"exp": 1553220470,
"iat": 1553219870,
"iss": "https://cloud.google.com/iap",
"sub": "securetoken.google.com/my_project_id/my_tenant_id:gZG0yELPypZElTmAT9I55prjHg63"
}
์ ํจํ ์ญํ ์ด ์๋ ์ฌ์ฉ์์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ํํ๊ธฐ ์ํด ์๋ ์ฝ๋์ ์ ์ฌํ ๋ ผ๋ฆฌ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
const gcipClaims = JSON.parse(decodedIapJwtClaims.gcip);
if (gcipClaims &&
gcipClaims.firebase &&
gcipClaims.firebase.sign_in_attributes &&
gcipClaims.firebase.sign_in_attribute.role === 'admin') {
// Allow access to admin restricted resource.
} else {
// Block access.
}
gcipClaims.gcip.firebase.sign_in_attributes
์ค์ฒฉ ํด๋ ์์ ์ฌ์ฉํ์ฌ Identity Platform SAML ๋ฐ OIDC ์ ๊ณต์
์ฒด์ ์ถ๊ฐ ์ฌ์ฉ์ ์์ฑ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
IdP ํด๋ ์ ํฌ๊ธฐ ์ ํ
์ฌ์ฉ์๊ฐ Identity Platform์ผ๋ก ๋ก๊ทธ์ธํ ํ IAP์ ์์ ํ๊ฒ ์ ๋ฌ๋๋ ์คํ ์ดํธ๋ฆฌ์ค(Stateless) Identity Platform ID ํ ํฐ์ ์ถ๊ฐ ์ฌ์ฉ์ ์์ฑ์ ์ ๋ฌ๋ฉ๋๋ค. ๊ทธ๋ฐ ํ IAP๊ฐ ๋์ผ ํด๋ ์์ด ํฌํจ๋ ์์ฒด ์คํ ์ดํธ๋ฆฌ์ค(Stateless) ๋ถํฌ๋ช ์ฟ ํค๋ฅผ ๋ฐํํฉ๋๋ค. IAP๋ ์ฟ ํค ์ฝํ ์ธ ๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ช ๋ JWT ํค๋๋ฅผ ์์ฑํฉ๋๋ค.
๋ฐ๋ผ์ ์ธ์ ์ด ๋์ฉ๋ ํด๋ ์์ผ๋ก ์์๋ ๊ฒฝ์ฐ ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ์์ ์ผ๋ฐ์ ์ผ๋ก 4KB ์ ๋์ธ ์ต๋ ํ์ฉ ์ฟ ํค ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ก๊ทธ์ธ ์์ ์ด ์คํจํฉ๋๋ค.
ํ์ํ ํด๋ ์๋ง IdP SAML ๋๋ OIDC ์์ฑ์ ์ ๋ฌ๋๋๋ก ํด์ผ ํฉ๋๋ค. ๋ ๋ค๋ฅธ ์ต์ ์ ์ฐจ๋จ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์น์ธ ๊ฒ์ฌ์ ํ์ํ์ง ์์ ํด๋ ์์ ํํฐ๋งํ๋ ๊ฒ์ ๋๋ค.
const gcipCloudFunctions = require('gcip-cloud-functions');
const authFunctions = new gcipCloudFunctions.Auth().functions();
// This function runs before any sign-in operation.
exports.beforeSignIn = authFunctions.beforeSignInHandler((user, context) => {
if (context.credential &&
context.credential.providerId === 'saml.my-provider') {
// Get the original claims.
const claims = context.credential.claims;
// Define this function to filter out the unnecessary claims.
claims.groups = keepNeededClaims(claims.groups);
// Return only the needed claims. The claims will be propagated to the token
// payload.
return {
sessionClaims: claims,
};
}
});