์ด ๋ฌธ์์์๋ ์ธ์ฆ์ ์ธ๋ถ ID๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ IAP(Identity-Aware Proxy)๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ ์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
์ธ์ ์๋ก๊ณ ์นจ
Identity Platform ์ธ์ ์ 1์๊ฐ ๋์ ์ ํจํฉ๋๋ค. ์ธ์ ์ด ๋ง๋ฃ๋๋ฉด ์ฑ์ด ์ธ์ฆ ํ์ด์ง๋ก ๋ฆฌ๋๋ ์ ๋์ด์ผ ํฉ๋๋ค. ์ธ์ฆ ํ์ด์ง์๋ Identity Platform ์๋ก๊ณ ์นจ ํ ํฐ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ฌ์ฉ์์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๊ฐ ์ฌ์ ํ ์ ํจํ๋ฉด UI๋ฅผ ํ์ํ์ง ์๊ณ ์ฌ์ธ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์ต๊ทผ์ ์ด๋ฉ์ผ ๋๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ํ ํฐ์ ์ทจ์ํ ๋ค๋ฅธ ์กฐ์น๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ธ์ฆ ํ๋ฆ์ ๋ค์ ์๋ฃํด์ผ ํฉ๋๋ค.
๋นAJAX ์์ฒญ ์ฒ๋ฆฌ
๋นAJAX ์์ฒญ์ ์ธ์ฆ ํ์ด์ง๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋ค๊ณ ๊ฐ์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ๋ฆฌ๋๋ ์ ์ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
AJAX ์์ฒญ ์ฒ๋ฆฌ
Chrome ๋ฐ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๋ ์๋ ํํฐ ์ฟ ํค๋ฅผ ๋จ๊ณ์ ์ผ๋ก ์ค์ฌ๊ฐ๊ณ ์์ต๋๋ค. ์๋ ํํฐ ์ฟ ํค๊ฐ ์ฌ์ฉ ์ค์ง๋์ด ์์ผ๋ฉด ์ด ํ์ด์ง์์ AJAX ์์ฒญ์ ์คํํ๊ธฐ ์ํ ๊ถ์ฅ์ฌํญ์ด ์๋ํ์ง ์์ต๋๋ค. ํ์ง๋ง AJAX ์์ฒญ์ ์์ค์ ๋์์ ๋ชจ๋ ๋์ผํ ์ฌ์ดํธ์์ ๊ฐ์ ธ์จ ๊ฒฝ์ฐ ์ ๊ณต๋ ์ถ์ฒ ํญ๋ชฉ์ ๊ณ์ ์๋ํฉ๋๋ค.
Chrome์์ ์๋ ํํฐ ์ฟ ํค ๊ด๋ฆฌ์ ๋ํ ์์ธํ ๋ด์ฉ์ Chrome์์ ์ฟ ํค ์ญ์ , ํ์ฉ, ๊ด๋ฆฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ง๋ฃ๋ ํ ํฐ์ผ๋ก AJAX ์์ฒญ์ ๋ณด๋ด๋ฉด ์์ฒญ์ 401: Unauthorized
์ํ ์ฝ๋๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ค์ ์๋ฃจ์
์ค ํ๋๋ฅผ ๊ตฌํํ์ธ์.
- HTTP
401
์ํ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์์ ํฉ๋๋ค. - ์ธ์
์๋ก๊ณ ์นจ์ ๊ฐ๋ฆฌํค๋๋ก
iframe
์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ถ๊ฐํฉ๋๋ค. - ์ฌ์ฉ์๊ฐ ์ธ์ ์๋ก๊ณ ์นจ์ ๊ฐ๋ณ ํญ์ผ๋ก ์๋ ๋ก๋ํ๋๋ก ์ง์ํฉ๋๋ค.
AJAX ์์ฒญ์ ๋ํ ์๋ต์ผ๋ก 401
๋์ 302
์ํ ์ฝ๋๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ ๊ฐ์ด XMLHttpRequest
์ธ X-Requested-With
ํค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ด๊ฒ์ ์์ฒญ์ด ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์๋๋ค๋ ๊ฒ์ IAP์ ์๋ ค์ค๋๋ค.
ํ๋ก๊ทธ๋๋งคํฑ ๋ฐฉ์์ผ๋ก HTTP 401 ์ฒ๋ฆฌ
ํ๋ก๊ทธ๋๋งคํฑ ๋ฐฉ์์ผ๋ก HTTP 401
์ํ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด AJAX ์ธ์
์ ์๋ก ๊ณ ์น๋ ๋ฐ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์
๋๋ค. ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
์ฐฝ์ ์ด์ด์ ์ฌ์ฉ์๋ฅผ ์ฌ์ธ์ฆํ๋ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํ ๋ค์ ํ๋ก์ธ์ค๊ฐ ์๋ฃ๋๋ฉด ๋ซ์ต๋๋ค.
iframe ์ฌ์ฉ
ํ๋ก๊ทธ๋๋งคํฑ ๋ฐฉ์์ผ๋ก HTTP 401
์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ ๋ค์์ผ๋ก ์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ธ์
์๋ก๊ณ ์นจ์ ๊ฐ๋ฆฌํค๋ iframe
์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค.
iframe์ ์ฌ์ฉํ๋ ค๋ฉด IAP ๋ณด์ ์น ์ฑ๊ณผ ๋์ผํ ๋๋ฉ์ธ์ ์ปค์คํ ๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ์ง ์์ผ๋ฉด ์ฌ์ฉ์์๊ฒ ๊ต์ฐจ ์ถ์ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ก๊ทธ์ธ ํ์ด์ง ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ปค์คํ ๋ก๊ทธ์ธ ํ์ด์ง ๋ง๋ค๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
iframe ์ฌ์ฉ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<iframe src="https://example.com/some/path?gcp-iap-mode=SESSION_REFRESHER" style="width:0;height:0;border:0; border:none;"></iframe>
์ธ์ ์๋ก๊ณ ์นจ ๋ก๋
์ตํ์ ์๋จ์ผ๋ก ์ฌ์ฉ์์๊ฒ ์ธ์ ์๋ก๊ณ ์นจ์ ์๋์ผ๋ก ๋ก๋ํ๋๋ก ์ง์ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ณ๋์ ํญ์์ ๋ค์ URL์ ์ด๋๋ก ์ง์ํ๋ ์ง์นจ์ ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ์ค๋ช ์์ ์ถ๊ฐํฉ๋๋ค.
https://example.com/some/path?gcp-iap-mode=SESSION_REFRESHER
์ฌ์ฉ์ ๋ก๊ทธ์์
IAP ๋ฆฌ์์ค์์ ์ฌ์ฉ์๋ฅผ ๋ก๊ทธ์์์ํค๋ ค๋ฉด ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์ ?gcp-iap-mode=GCIP_SIGNOUT
์ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด App Engine ์ฑ์์ URL์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
https://example.com/some/path?gcp-iap-mode=GCIP_SIGNOUT
์ฌ์ฉ์๋ ๋ก๊ทธ์์ํ ํ ๋ค์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋๋ ์ ๋ฉ๋๋ค.
๋ชจ๋ ๋ฆฌ์์ค์ ์ธ์
์์ ์ฌ์ฉ์๋ฅผ ๋ก๊ทธ์์์ํค๋ ค๋ฉด API ํค์ ๋งค๊ฐ๋ณ์๋ก ์ถ๊ฐ๋ mode=signout
์ ์ฌ์ฉํ์ฌ ์ธ์ฆ URL๋ก ๋ฆฌ๋๋ ์
ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
https://auth.example.com/?apiKey=API-KEY&mode=signout
๋ก๊ทธ์์์ด ์๋ฃ๋ ํ์๋ ์ฌ์ฉ์๋ ํ์ด์ง์ ๋จ์ ์์ต๋๋ค. ์ฌ์ฉ์์๊ฒ ๋ก๊ทธ์์ํ๋ค๋ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ค๋ฉด AuthenticationHandler
๊ฐ์ฒด์์ completeSignOut()
์ฝ๋ฐฑ์ ๊ตฌํํฉ๋๋ค.
ํ ๋ํธ ๊ฐ ์ ํ
๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฌ์ฉ์๋ ๋์ผํ IAP ๋ฆฌ์์ค์ ์ฌ๋ฌ ํ ๋ํธ๋ก ์ธ์ฆํ๋ ค๊ณ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ก ๋ค๋ฅธ ์์ค์ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋ ๋ฉํฐ ํ ๋ํธ์ ์ํ ์ ์์ผ๋ฉฐ ๋ ์ ๊ฑฐ๋ ๋ ํฐ ๊ถํ์ด ์๋ ํ ๋ํธ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
ํ
๋ํธ ์ ํ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ๋ก ๋ค์ ์์ํ๋ ค๋ฉด ?gcp-iap-mode=CLEAR_LOGIN_COOKIE
๋ฅผ ์ฌ์ฉํ์ธ์. ์๋ฅผ ๋ค์ด App Engine ์ฑ์์ URL์ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
https://PROJECT-ID.appspot.com/some/path?gcp-iap-mode=CLEAR_LOGIN_COOKIE