Claude ์ฑ ๊ฒ์ดํธ์จ์ด ๋ฐฐํฌ ๋ฐ ์ด์
IdP์ ๊ฒ์ดํธ์จ์ด๋ฅผ ๋ฑ๋กํ๊ณ , ์ปจํ ์ด๋๋ฅผ ๋น๋ํ๋ฉฐ, Kubernetes ๋๋ Cloud Run์ ๋ฐฐํฌํ๊ณ ์ด์ํฉ๋๋ค: ์ํ ํ์ธ, ์ํฌ๋ฆฟ ๋กํ ์ด์ , ์ ๊ทธ๋ ์ด๋ ๋ฐ ๋ณด์.
์ด ํ์ด์ง๋ Claude ์ฑ ๊ฒ์ดํธ์จ์ด ์คํ์ ์ด์ ์ธก๋ฉด์ ๋ค๋ฃน๋๋ค: ๊ฒ์ดํธ์จ์ด๋ฅผ ID ๊ณต๊ธ์(IdP)์ ๋ฑ๋กํ๊ณ , ๊ฒ์ดํธ์จ์ด๋ฅผ ์ปจํ
์ด๋๋ก ๋ฐฐํฌํ๋ฉฐ, ์ผ์์ ์ผ๋ก ์ด์ํฉ๋๋ค. ๊ฒ์ดํธ์จ์ด๊ฐ ๋ถํ
์ ์ฝ๋ gateway.yaml ํ์ผ์ ๋ชจ๋ ์ต์
์ ๋ํด์๋ ๊ตฌ์ฑ ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
ํ๋ก๋์ ๋ฐฐํฌ๋ ์์๋๋ก 4๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ์๋ ์น์ ์ด ์ด๋ฅผ ์ผ์น์ํต๋๋ค. ์ฒ์ ๋ ๋จ๊ณ๋ ์ ํ์ ํ๋ ๊ณณ์ด๊ณ , ๋๋จธ์ง ๋ ๋จ๊ณ๋ ์คํ ์ค์ผ ๋ ์ฐธ์กฐํ ์ฐธ๊ณ ์๋ฃ์ ๋๋ค.
- ID ๊ณต๊ธ์ ์ค์ : OAuth ํด๋ผ์ด์ธํธ๋ฅผ ๋ฑ๋กํ๊ณ Okta, Entra, Google์ ๋ํ IdP๋ณ ์ฐธ๊ณ ์ฌํญ ํ์ธ
- ๊ฒ์ดํธ์จ์ด ๋ฐฐํฌ: ๊ณ ์ ๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ Kubernetes, Cloud Run ๋๋ ์์ ์ ํ๋ซํผ์์ ์คํํฉ๋๋ค. ์ด ์น์ ์ ๋น์ฉ, ์ฐํ, ๋ค์ค ๊ฒ์ดํธ์จ์ด ๋ฐ ์๋ฒ๋ฆฌ์ค ๊ฒฐ์ ๋ ๋ค๋ฃน๋๋ค
- ์ด์ ์ค์ : ๋ก๊ทธ, ์ํ ํ๋ก๋ธ, ์ค๋จ ๋์, ์ํฌ๋ฆฟ ๋กํ ์ด์ ๋ฐ ์ ๊ทธ๋ ์ด๋. ๋ชจ๋ํฐ๋ง ๋ฐ ๋ฐ๋ถ์ ์ฐ๊ฒฐํ ๋ ์ฐธ์กฐํ ์ฐธ๊ณ ์๋ฃ
- ๋ณด์ ํ์ธ ๊ฒํ : ๋ฐ์ดํฐ๊ฐ ์ด๋๋ก ํ๋ฅด๋์ง, ์ํ ๋ชจ๋ธ ๋ฐ ๊ท์ ์ค์ ๋ต๋ณ. ๋ณด์ ๊ฒํ ๋ฅผ ์ํ ์ฐธ๊ณ ์๋ฃ
๋ก๊ทธ์ธ ๋๋ ๋ถํ ์ด ์คํจํ๋ฉด ๋ฌธ์ ํด๊ฒฐ๋ก ๋ฐ๋ก ์ด๋ํ์ธ์. ์ด๋ ํ์๋๋ ์ค๋ฅ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
ํ๋ผ์ด๋น ๋คํธ์ํฌ์ ๋ฐฐํฌํ์ธ์. Claude Code๋ ์ฃผ์๊ฐ ํ๋ผ์ด๋น์ธ ๊ฒ์ดํธ์จ์ด์๋ง ์ฐ๊ฒฐํฉ๋๋ค. ์ด๋ ๋ณด์ ๊ฐ๋์ ๋๋ค. ์ ๋ขฐํ ์ ์๋ ๊ฒ์ดํธ์จ์ด๋ ๊ฐ๋ฐ์ ๋จธ์ ์์ ๋ช ๋ น์ ์คํํ๋ ์ค์ ์ ํธ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฒ์ดํธ์จ์ด๋ฅผ ๋ด๋ถ ๋ก๋ ๋ฐธ๋ฐ์ ๋๋ VPN ๋ค์ ๋ฐฐ์นํ๊ณ ํ๋ผ์ด๋น IP๋ก๋ง ํ์ธ๋๋ ํธ์คํธ๋ช ์ ์ง์ ํ์ธ์.
Anthropic์ด ์ด์ํ๋ ๊ณต๊ฐ ๊ฒ์ดํธ์จ์ด ์๋ํฌ์ธํธ๋ ์์ธ์
๋๋ค: /login์ https://๋ฅผ ํตํด ์ด๋ค์ ์๋ฝํฉ๋๋ค. ์ด๋ Anthropic ์์ฒด๊ฐ ์ด์ํ๋ ์์ ๊ณ ์ ๊ฒ์ดํธ์จ์ด ์ธํธ์
๋๋ค. ์ด๋ค์ ์ ํํ๊ฑฐ๋ ๊ตฌ์ฑํ ์ ์๋ ๋ฐฐํฌ ์ต์
์ด ์๋๋๋ค. ๋ชฉ๋ก์ Claude Code์ ์ปดํ์ผ๋๋ฏ๋ก ๊ตฌ์ฑ์ด ํธ์คํธ๋ช
์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ ํธ์คํ
ํ๋ ๊ฒ์ดํธ์จ์ด๋ ๋ฉด์ ๋์์ด ๋ ์ ์์ต๋๋ค. {/* min-version: 2.1.206 */}v2.1.206 ์ด์ ์๋ /login์ด ๋ค๋ฅธ ๊ณต๊ฐ ์ฃผ์์ฒ๋ผ ์ด๋ฌํ ์๋ํฌ์ธํธ๋ฅผ ๊ฑฐ๋ถํ์ต๋๋ค.
ID ๊ณต๊ธ์ ์ค์
๋จ์ผ ๋ฆฌ๋๋ ์
URI https://<gateway>/oauth/callback์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฐ OAuth/OpenID Connect(OIDC) ์น ์ ํ๋ฆฌ์ผ์ด์
์ ID ๊ณต๊ธ์์ ๋ฑ๋กํ๊ณ , ๊ฒ์ดํธ์จ์ด ์ก์ธ์ค ๊ถํ์ด ์์ด์ผ ํ๋ ์ฌ์ฉ์ ๋๋ ๊ทธ๋ฃน์ ํ ๋นํ์ธ์.
๋ชจ๋ OIDC ํธํ IdP๊ฐ ์๋ํฉ๋๋ค: Okta, Microsoft Entra ID, Google Workspace, Keycloak, Dex, PingFederate ๋ฑ. IdP๋ ์ธ ๊ฐ์ง ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํด์ผ ํฉ๋๋ค:
/.well-known/openid-configuration์ ํ๋ก๋์ ์์ HTTPS๋ฅผ ํตํด ์ ๊ณตํฉ๋๋ค. ๊ฒ์ดํธ์จ์ด๋http://๋ฐ๊ธ์๋ฅผ ํ์ฉํ๋ฉฐ, ๋ฃจํ๋ฐฑ ๋ฐ๊ธ์๋ ์ถ๊ฐ๋กCLAUDE_GATEWAY_ALLOW_LOOPBACK=1์ด ํ์ํฉ๋๋ค- ์ธ์ฆ ์ฝ๋ ํ๋ฆ์ ์ง์ํฉ๋๋ค. PKCE(Proof Key for Code Exchange)๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ต๋๋ค. ์ด๋ฅผ ์ง์ํ์ง ์๋ IdP์ ๊ฒฝ์ฐ
oidc.use_pkce: false๋ก ๋นํ์ฑํํ์ธ์ - id_token์์
email์ ๋ฐํํ๊ณ ์ ํ์ ์ผ๋กgroups๋ฅผ ๋ฐํํ๊ฑฐ๋,oidc.userinfo_fallback: true๋ฅผ ์ฌ์ฉํ์ฌ userinfo ์๋ํฌ์ธํธ์์ ์ ๊ณตํฉ๋๋ค
ํ๋ผ์ด๋น PKI์ ๊ฒฝ์ฐ oidc.ca_cert_pem์ ์ค์ ํ์ธ์.
์ผ๋ถ ๊ณต๊ธ์๋ ์ด๋ฉ์ผ ๋ฐ ๊ทธ๋ฃน ํด๋ ์์ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํฉ๋๋ค:
- Okta:
https://example.okta.com์ ์กฐ์ง ์ธ์ฆ ์๋ฒ๋email๋ฐgroups๋ฅผ ์๋ตํ๋ ์์ id_token์ ๋ฐํํ๋ฏ๋ก, ์ด๋ฅผissuer๋ก ์ฌ์ฉํ ๋๋ง๋คoidc.userinfo_fallback: true๋ฅผ ์ค์ ํ์ธ์.https://example.okta.com/oauth2/default์ ๊ฐ์ id_token์email๋ฐ ์ ํ์ ์ผ๋กgroups๋ฅผ ํฌํจํ๋ ์ฌ์ฉ์ ์ ์ ์ธ์ฆ ์๋ฒ๋ ์ด๋ฅผ ์ง์ ๋ด๋ณด๋ด๋ฉฐ ํด๋ฐฑ์ด ํ์ํ์ง ์์ต๋๋ค. Okta๋oidc.scopes์์groups๋ฒ์๊ฐ ์์ฒญ๋๊ณ ์ฑ์ ๊ทธ๋ฃน ํด๋ ์ ํํฐ๊ฐ ์ด๋ฅผ ํ์ฉํ ๋๋งgroups๋ฅผ ๋ด๋ณด๋ ๋๋ค.userinfo_fallback์ IdP๊ฐ ์์ฒญํ์ง ์์ ํด๋ ์์ ์ฑ์ธ ์ ์์ต๋๋ค. - Microsoft Entra ID:
issuer=https://login.microsoftonline.com/<tenant-id>/v2.0. Entra๋ ์ด๋ฆ์ด ์๋ ๊ทธ๋ฃน ๊ฐ์ฒด ID๋ฅผ ๋ด๋ณด๋ด๋ฏ๋ก,managed.policies.match.groups์์ GUID๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ธ๊ฐ์ด ์ฝ์ ์ ์๋ ์ด๋ฆ์ ์ํด ์ฑ ์ญํ ์ ์ฌ์ฉํ์ธ์. ํ ๋ํธ๊ฐgroups๋์roles์๋์ ์ญํ ์ ๋ด๋ณด๋ด๋ ๊ฒฝ์ฐoidc.groups_claim: roles์ ์ค์ ํ์ธ์. - Google Workspace:
issuer=https://accounts.google.com. Google์ id_token์ ๊ทธ๋ฃน์ ์ ๋ฌํ์ง ์์ต๋๋ค. Google์ IdP๋ก ์ฌ์ฉํ์ฌ ๊ทธ๋ฃน ๊ธฐ๋ฐallowed_groups๋๋managed.policies๋ฅผ ์ฌ์ฉํ๋ ค๋ฉดoidc.google_groups๋ฅผ ๊ตฌ์ฑํ์ธ์. ์ด๋ ๋๋ฉ์ธ ์ ์ฒด ์์์ด ์๋ ์๋น์ค ๊ณ์ ์ ์ฌ์ฉํ์ฌ Admin SDK Directory API๋ฅผ ํตํด ๊ฐ ์ฌ์ฉ์์ ๊ทธ๋ฃน์ ์กฐํํฉ๋๋ค. ์ด ์์ด๋ ๋ฉค๋ฒ์ญ ๊ฒ์ดํ ์ ์ํดoidc.allowed_email_domains๋ฅผ ์ฌ์ฉํ๊ณ ์ ์ฑ ํ ๋น์ ์ํดmanaged.policies.match.email_domain์ ์ฌ์ฉํ์ธ์. Google์ ๋ํ ํ์คoffline_access๋ฒ์๋ฅผ ๋ฌด์ํฉ๋๋ค. ์๋ก๊ณ ์นจ ํ ํฐ์ ๊ฒฝ์ฐoidc.scopes: [openid, profile, email]๊ณผoidc.extra_auth_params: { access_type: offline, prompt: consent }๋ฅผ ์ค์ ํ์ธ์.
์์์ ๋ค๋ฃจ์ง ์์ ID ๊ณต๊ธ์์ ๋ํ ์ง์์ ๋ฌธ์ ํด๊ฒฐ์ ์ฐธ์กฐํ์ธ์.
์๋ก๊ณ ์นจ ํ ํฐ์ ์ฌ์ฉํ๋ฉด ๊ฒ์ดํธ์จ์ด๊ฐ ๊ฐ๋ฐ์๋ฅผ ๋ธ๋ผ์ฐ์ ๋ก ๋ค์ ๋ณด๋ด์ง ์๊ณ ๊ฐ๋ฐ์์ ์ธ์
์ ์๋์ผ๋ก ๊ฐฑ์ ํ ์ ์์ต๋๋ค. ๋ํ IdP๊ฐ ์ฌ์ฉ์๋ฅผ ๋นํ์ฑํํ ๋ ๋ค์ ์๋ก๊ณ ์นจ์ด ์คํจํ๊ณ ์ธ์
์ด ttl_hours ๋ด์ ์ข
๋ฃ๋๋ฏ๋ก ํ๋ก๋น์ ๋ ํด์ ๋ฅผ ์ฃผ๋ํฉ๋๋ค. ๊ฒ์ดํธ์จ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ก๊ณ ์นจ ํ ํฐ์ ์ป๊ธฐ ์ํด offline_access๋ฅผ ์์ฒญํฉ๋๋ค. IdP๊ฐ ์คํ๋ผ์ธ ์ก์ธ์ค์ ๋ํ ๋ช
์์ ๋์๋ฅผ ์๊ตฌํ๋ ๊ฒฝ์ฐ OAuth ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌ์ฑํ์ฌ ์ด๋ฅผ ํ์ฉํ์ธ์.
IdP๊ฐ ์ ํ ์๋ก๊ณ ์นจ ํ ํฐ์ ๋ฐ๊ธํ ์ ์๋ ๊ฒฝ์ฐ, ๊ฒ์ดํธ์จ์ด๋ ์ฌ์ ํ ์๋ํ์ง๋ง ์๋ ๊ฐฑ์ ์ด ์์ผ๋ฏ๋ก ๊ฐ๋ฐ์๋ ์ธ์
์ด ๋ง๋ฃ๋ ๋ ๋ธ๋ผ์ฐ์ ๋ก๊ทธ์ธ์ ๋ค์ ์คํํฉ๋๋ค. ์ด๊ฒ์ด ๋งค์๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ๋ ค๋ฉด session.ttl_hours๋ฅผ 8 ๋๋ 12๋ก ์ฌ๋ฆฌ์ธ์. ํธ๋ ์ด๋์คํ๋ ํ๋ก๋น์ ๋ ํด์ ์ง์ฐ์
๋๋ค. ์๋ก๊ณ ์นจ ํ ํฐ์ด ์์ผ๋ฉด ๋นํ์ฑํ๋ ์ฌ์ฉ์๋ ๋ ๊ธด TTL์ด ๊ฒฝ๊ณผํ ๋๊น์ง ์ก์ธ์ค๋ฅผ ์ ์งํฉ๋๋ค.
๋ฐฐํฌ
๊ฒ์ดํธ์จ์ด๋ ๋จ์ผ Linux ๋ฐ์ด๋๋ฆฌ์ ๋๋ค. ๋ณต์ ๋ณธ์ด ์ํ ๋น์ ์ฅ์ด๊ณ Postgres๊ฐ ๊ณต์ ์กฐ์ ๊ณ์ธต์ด๋ฏ๋ก ์ํ์ผ๋ก ํ์ฅ๋ฉ๋๋ค. ํ๊ฒฝ์์ ์ํ ๋น์ ์ฅ ์๋น์ค๋ฅผ ์คํํ๋ ๋ฐฉ์๋๋ก ์คํํ์ธ์. ์ด ์น์ ์ ๋๋จธ์ง ๋ถ๋ถ์ ์ด๋ฏธ์ง๊ฐ ํ์ํ ๊ฒ์ ์ค๋ช ํ๋ฉฐ, Kubernetes ๋ฐ Cloud Run์ ๋ํ ์งง์ ์ฐธ๊ณ ์ฌํญ์ด ์์ต๋๋ค.
๊ฒ์ดํธ์จ์ด๋ ์ ์คํธ๋ฆผ ์๊ฒฉ ์ฆ๋ช ์ ๋ณด์ ํ๊ณ ์ถ๋ก ์ ์ํ ๋จ์ผ ์ก์ ์ง์ ์ผ๋ก ์๋ํ๋ฏ๋ก ๋คํธ์ํฌ ๋ด๋ถ์์ ์คํ๋๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๊ฐ๋ฐ์์ IdP๊ฐ HTTPS๋ฅผ ํตํด ๋๋ฌํ ์ ์๋ ๊ณณ์ด๋ฉด ์ด๋๋ ์คํํ ์ ์์ต๋๋ค. ํ๋ก๋์ ์๊ฒฉ ์ฆ๋ช ์ ๋ณด์ ํ๋ ๋ค๋ฅธ ์๋น์ค์ฒ๋ผ ์ทจ๊ธํ์ธ์.
๋ช ๊ฐ์ง ๊ฒฐ์ ์ด ์คํ ์์น ์ด์์ผ๋ก ๋ฐฐํฌ๋ฅผ ํ์ฑํฉ๋๋ค:
- ๋น์ฉ: ๊ฒ์ดํธ์จ์ด์ ๋ํ ๋ณ๋์ ๋ผ์ด์ ์ค ๋๋ ์ฌ์ฉ์๋น ์๊ธ์ด ์์ต๋๋ค. ์ด๋
claude๋ฐ์ด๋๋ฆฌ์ ์ผ๋ถ์ ๋๋ค. ๊ธฐ์กด ํด๋ผ์ฐ๋ ๋๋ Anthropic ์ฝ์ ์ ํตํด ์ถ๋ก ์ ๋ํด ๋น์ฉ์ ์ง๋ถํ๊ณ , ์ปจํ ์ด๋ ๋ฐ ํ ๋ ๋ฉํธ๋ฆฌ ์์ง๊ธฐ์ ์ปดํจํ ์ ์ง๋ถํฉ๋๋ค. - ์ฐํ: ๊ฒ์ดํธ์จ์ด๋ ๋ชจ๋ธ๋ก์ ์ ์ผํ ๊ฒฝ๋ก๊ฐ ์ด๋ฅผ ํต๊ณผํ๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์์ ์ ์๊ฒฉ ์ฆ๋ช
์ด ์๋ ๊ฐ๋ฐ์๋ ์ฌ์ ํ ๊ณต๊ธ์๋ฅผ ์ง์ ํธ์ถํ ์ ์์ผ๋ฏ๋ก, ํด๋น ๊ฒฝ๋ก๋ฅผ ๋ซ๋ ๊ฒ์ ๋คํธ์ํฌ ์ ์ฑ
๊ฒฐ์ ์
๋๋ค. ์๋ฅผ ๋ค์ด
api.anthropic.com์ผ๋ก์ ์ก์ ์ ๊ฒ์ดํธ์จ์ด๋ฅผ ์ ์ธํ๊ณ ์ฐจ๋จํฉ๋๋ค. ํด๋น ์ก์ ์ ์ฐจ๋จํ๋ฉด ๊ฐ ๊ฐ๋ฐ์์ ๋จธ์ ์์api.anthropic.com์ ํธ์ถํ๋ WebFetch ๋๋ฉ์ธ ์์ ํ์ธ๋ ์ค๋จ๋ฉ๋๋ค. ๊ด๋ฆฌํ ์ ์ฑ ์์skipWebFetchPreflight: true๋ฅผ ์ค์ ํ์ฌ ๋นํ์ฑํํ์ธ์. - ๋ค์ค ๊ฒ์ดํธ์จ์ด: ๊ฐ ๊ฒ์ดํธ์จ์ด๋ ์์ ์ ๊ตฌ์ฑ์ ๊ฐ์ง ๋ณ๋์ ๋ฐฐํฌ์ ๋๋ค. CLI๋ ๊ฒ์ดํธ์จ์ด ํธ์คํธ๋ช ๋ณ๋ก ์ ๋ขฐ ์ง๋ฌธ ๋ฐ ์๊ฒฉ ์ฆ๋ช ์ ์ ์ฅํ๋ฏ๋ก, ๋ค๋ฅธ ํ์ด ์ถฉ๋ ์์ด ๋ค๋ฅธ ๊ฒ์ดํธ์จ์ด์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ฌ๋ฌ OIDC ๋ฐ๊ธ์๋ฅผ ์ ๊ณตํ๋ ค๋ฉด ๋ณ๋์ ์ธ์คํด์ค๋ฅผ ์คํํ์ธ์.
- ์๋ฒ๋ฆฌ์ค: Cloud Run์ด ์๋ํฉ๋๋ค. ์ฝ๋ OIDC ๊ฒ์์ ํผํ๋ ค๋ฉด
min-instances: 1์ ์ค์ ํ์ธ์. Lambda ๋ฐ Cloud Functions๋ ์๋ํ์ง ์์ต๋๋ค. ๊ฒ์ดํธ์จ์ด๋ ์ฅ๊ธฐ ์คํ HTTP ์๋ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฌ๊ธฐ์ ๋ชจ๋ ํ๋ก๋์
ํ ํด๋ก์ง๋ ์ผ๋ฐ HTTP ๋ณต์ ๋ณธ ์์ Ingress, Cloud Run์ ํ๋ก ํธ ์๋ ๋๋ ALB์ ๊ฐ์ L7 ํ๋ก์๋ฅผ ๋ฐฐ์นํฉ๋๋ค. listen.trusted_proxies๋ฅผ ํ๋ก์์ ์์ค ๋ฒ์๋ก ์ค์ ํ์ฌ ๊ฒ์ดํธ์จ์ด๊ฐ X-Forwarded-For์์ ํด๋ผ์ด์ธํธ IP๋ฅผ ์ฝ๋๋ก ํ์ธ์. ๊ฒ์ดํธ์จ์ด๋ TCP ํผ์ด๊ฐ ์ ๋ขฐํ ์ ์์ ๋๋ง ํค๋๋ฅผ ์ธ์ ํฉ๋๋ค. Google Cloud ์๋ ์์ ๋ ํ ํด๋ก์ง๋ณ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ ๋ขฐํ ์ ์๋ ํ๋ก์๊ฐ ์์ผ๋ฉด, ๋ชจ๋ ์์ฒญ์ด ํ๋ก์์ IP์์ ์ค๋ ๊ฒ์ผ๋ก ๋ํ๋๋ฏ๋ก IP๋น ์๋ ์ ํ์ด ํ๋์ ๊ณต์ ๋ฒํท์ผ๋ก ์ถ์๋๊ณ ๊ฐ์ฌ ์ด๋ฒคํธ์ ํ๋ก์์ IP๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค.
์ปจํ ์ด๋ ์ด๋ฏธ์ง
ํ์ค Claude Code ๋ฆด๋ฆฌ์ค์ ๋ค์ดํฐ๋ธ claude ๋ฐ์ด๋๋ฆฌ ์ฃผ์์ ์์ ์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ์ธ์:
- ๊ณ ์ ๋ ๋ฆด๋ฆฌ์ค์์ ์ด๋ฏธ์ง ์ํคํ ์ฒ์ฉ Linux ๋น๋๋ฅผ ๋ค์ด๋ก๋ํ์ธ์. ๋ค์ด๋ก๋ URL์ ํน์ ๋ฒ์ ์ค์น๋ฅผ ์ฐธ์กฐํ์ธ์.
- ๋ฐ์ด๋๋ฆฌ ๋ฌด๊ฒฐ์ฑ ๋ฐ ์ฝ๋ ์๋ช
์ ์ค๋ช
๋ ๋๋ก ๋ฆด๋ฆฌ์ค์ GPG ์๋ช
๋
manifest.json์ ๋ํด ํ์ธํ์ธ์. - ๋น๋ ์ปจํ ์คํธ์ ๋ณต์ฌํ์ธ์.
๋น๋๊ฐ ๋ฆด๋ฆฌ์ค ํธ์คํธ์ ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ ๋ฆด๋ฆฌ์ค๋ฅผ ๋ด๋ถ ๋ ์ง์คํธ๋ฆฌ๋ก ๋ฏธ๋ฌ๋งํ๊ณ ํ๋ฆฟ์ด ์คํํ๋ ๋ฒ์ ์ ๊ณ ์ ํ์ธ์.
๋ฐ์ด๋๋ฆฌ ์ธ์๋ ์ด๋ฏธ์ง๋ ๋ค์์ด ํ์ํฉ๋๋ค:
- glibc ๊ธฐ๋ฐ ์ด๋ฏธ์ง: glibc ๋น๋์ ์ ์ผํ ๋์ ์ข
์์ฑ์ glibc ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. Musl ๊ธฐ๋ฐ ์ด๋ฏธ์ง๋
linux-x64-musl๋๋linux-arm64-musl๋น๋์ ์ถ๊ฐ ํจํค์ง๊ฐ ํ์ํฉ๋๋ค. Alpine Linux ์ค์ ์ ์ฐธ์กฐํ์ธ์. - ์ฐ๊ธฐ ๊ฐ๋ฅํ ์ํ ๋๋ ํ ๋ฆฌ: ๊ฒ์ดํธ์จ์ด๋ ๋ชจ๋ ์ฌ์ฉ์๋ก ์คํ๋์ง๋ง, ์ต์ ์ด๋ฏธ์ง์๋ ์ฐ๊ธฐ ๊ฐ๋ฅํ ํ์ด ์์ต๋๋ค.
CLAUDE_CONFIG_DIR์/tmp/.claude์ ๊ฐ์ ์ฐ๊ธฐ ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ก ์ค์ ํ์ธ์. - ์ปจํ
์ด๋ ๋ช
๋ น:
claude gateway --config /etc/claude/gateway.yaml. ๊ตฌ์ฑ ํ์ผ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง์ดํธ๋๊ณ ์ํฌ๋ฆฟ์ ํ๊ฒฝ ๋ณ์๋ก ์ ๊ณต๋ฉ๋๋ค. ๊ฒ์ดํธ์จ์ด๋listen.port์์ ์์ ํ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์8080์ ๋๋ค.
Kubernetes
๊ฒ์ดํธ์จ์ด๋ฅผ ๋ชจ๋ ์ํ ๋น์ ์ฅ ์๋น์ค์ฒ๋ผ ๋ฐฐํฌ๋ก ์คํํ์ธ์:
- ConfigMap์์ ๊ตฌ์ฑ์ ๋ง์ดํธํ๊ณ Secret์์ ์ํฌ๋ฆฟ์ ๋ง์ดํธํ์ธ์. YAML์์
${file:/path/to/secret}๋๋ ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ์ํฌ๋ฆฟ์ ์ฐธ์กฐํ์ธ์ - Ingress์์ TLS๋ฅผ ์ข
๋ฃํ๊ณ
listen.public_url์ Ingress ํธ์คํธ๋ช ์ผ๋ก ์ค์ ํ์ธ์ - ์ค๋น ํ๋ก๋ธ๋ฅผ
GET /readyz๋ก ์ง์ ํ๊ณ ์์กด ํ๋ก๋ธ๋ฅผGET /healthz๋ก ์ง์ ํ์ธ์
์ํฌ๋ก๋ ID
์ ์ ํค๋ณด๋ค ํ๋ซํผ์ ์ํฌ๋ก๋ ID๋ฅผ ์ ํธํ์ธ์: EKS์ Bedrock์ฉ IRSA, GKE์ Agent Platform์ฉ Workload Identity, AKS์ Foundry์ฉ ์ํฌ๋ก๋ ID. ์
์คํธ๋ฆผ ๋ธ๋ก์์ auth: {}๋ฅผ ์ค์ ํ๊ฑฐ๋ Foundry์ ๊ฒฝ์ฐ use_azure_ad: true๋ฅผ ์ค์ ํ๋ฉด, ๊ฒ์ดํธ์จ์ด๋ ํด๋น ๊ณต๊ธ์์ ๊ธฐ๋ณธ ์๊ฒฉ ์ฆ๋ช
์ฒด์ธ์ ํตํด ํฌ๋์ ID๋ฅผ ์ ํํฉ๋๋ค. Bedrock ์
์คํธ๋ฆผ์ GKE์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ ํด๋ผ์ฐ๋ ๊ฐ ํ์ด๋ง์ ๊ฒฝ์ฐ, ์
์คํธ๋ฆผ์ auth ๋ธ๋ก์์ ๋ช
์์ ์๊ฒฉ ์ฆ๋ช
์ ์ค์ ํ์ธ์. upstreams ์ฐธ์กฐ๋ ํ๋ซํผ๋ณ ์ค์ ์ธ๋ถ์ฌํญ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
Cloud Run
์๋น์ค๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํ์ธ์:
listen.port๋ฅผ ๊ธฐ๋ณธ๊ฐ8080์ผ๋ก ์ ์งํ์ธ์. ์ด๋ Cloud Run์ ๊ธฐ๋ณธPORT์ ์ผ์นํ๊ฑฐ๋port: ${PORT}๋ฅผ ์ค์ ํ์ธ์public_url์ ์ธ๋ถ์์ ๋๋ฌ ๊ฐ๋ฅํ ์๋ณธ์ผ๋ก ์ค์ ํ์ธ์. ํ๋ก๋์ ์ ๊ฒฝ์ฐ ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ด๋ถ ๋ก๋ ๋ฐธ๋ฐ์์ ํธ์คํธ๋ช ์ ๋๋ค./login์ด ๊ณต๊ฐ ์ฃผ์๋ฅผ ๊ฑฐ๋ถํ๊ณ*.run.appURL์ด ํ๋๋ก ํ์ธ๋๋ฏ๋ก, Cloud Run URL ๋จ๋ ์curl๋๋ ๋ธ๋ผ์ฐ์ ์ค๋ชจํฌ ํ ์คํธ์๋ง ์๋ํฉ๋๋ค. ์์ธ๋*.run.app์ด Private Service Connect๋ฅผ ํตํด ํ๋ผ์ด๋น์ผ๋ก ํ์ธ๋๊ณ Cloud DNS ํ๋ผ์ด๋น ์์ญ์ด ์๋ ๋คํธ์ํฌ์ ๋๋ค. ํด๋น ํ ํด๋ก์ง์์ Cloud Run URL์ ์ ํจํpublic_url์ ๋๋ค. Google Cloud ์๋ ์์ ๋ ๋ ๋ค ๋ค๋ฃน๋๋ค.- ๊ตฌ์ฑ์ ์ํฌ๋ฆฟ ๋ณผ๋ฅจ์ผ๋ก ๋ง์ดํธํ์ธ์
- ์ฒซ ๋ฒ์งธ ์์ฒญ์์ ์ฝ๋ OIDC ๊ฒ์์ ํผํ๋ ค๋ฉด
min-instances: 1์ ์ค์ ํ์ธ์
Cloud Run ๋๋ GKE, Cloud SQL ๋ฐ Secret Manager๋ฅผ ๋ค๋ฃจ๋ Google Cloud์ ์์ ํ ์๋ ์์ ๋ Google Cloud์ ๋ฐฐํฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ฒ์ดํธ์จ์ด URL์ ๊ฐ๋ฐ์ ๋จธ์ ์ผ๋ก ํธ์
๊ฒ์ดํธ์จ์ด๊ฐ ์ ๊ณต๋๋ฉด, MDM์ ํตํด ๋๋ OS๋ณ managed-settings.json์ ์ง์ ์์ฑํ์ฌ ๊ด๋ฆฌํ ์ค์ ์ ํตํด ๊ฐ ๊ฐ๋ฐ์์ ๋จธ์ ์ผ๋ก forceLoginMethod ๋ฐ forceLoginGatewayUrl์ ํธ์ํ์ธ์. ์ด ์์ด๋ /login์ด ๊ฒ์ดํธ์จ์ด ์ต์
์ด ์๋ ํ์ค ๊ณ์ ์ ํ๊ธฐ๋ฅผ ํ์ํฉ๋๋ค. ํ์ผ ๊ฒฝ๋ก๋ ํด๋ผ์ด์ธํธ ์ธก ๊ด๋ฆฌํ ์ค์ ์ ์ฐธ์กฐํ์ธ์.
์ด์
๊ฒ์ดํธ์จ์ด๊ฐ ํธ๋ํฝ์ ์ ๊ณตํ๋ฉด, ์ผ์์ ์ธ ์ด์์ ๋ก๊ทธ๋ฅผ ์ฝ๊ณ , ์ํ๋ฅผ ํ๋ก๋ธํ๋ฉฐ, ์ผ์ ์ ๋ฐ๋ผ ์ํฌ๋ฆฟ์ ๋กํ ์ด์ ํ๋ ๊ฒ์ ๋๋ค. ์๋ ์น์ ์ ๊ฐ๊ฐ์ ๋ค๋ฃจ๊ณ , Postgres๊ฐ ๋ณด์ ํ ๊ฒ๊ณผ ์ ๊ทธ๋ ์ด๋ ๋ฐ ๋กค๋ฐฑ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง๋ฅผ ๋ค๋ฃน๋๋ค.
๋ก๊ทธ
๊ฒ์ดํธ์จ์ด๋ stderr์ ๋ ๊ฐ์ ์คํธ๋ฆผ์ ์์ฑํ๋ฉฐ, ๋ ๋ค JSON ์นํ์ ์ ๋๋ค:
- ๊ฐ์ฌ ์ด๋ฒคํธ: ๋ณด์ ๊ด๋ จ ์ด๋ฒคํธ๋น ํ ์ค์ JSON. stderr๋ฅผ ๋ก๊ทธ ์์ง๊ธฐ๋ก ํ์ดํํ์ธ์. ๋ด๋ณด๋ธ ์ด๋ฒคํธ๋
config.load,session.mint,session.refresh,device.authorize,device.verify,auth.denied,access.denied,inference,managed.serve,spend.blocked๋ฐadmin.denied๋ฅผ ํฌํจํฉ๋๋ค. ํ๋๋ ์ด๋ฒคํธ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค:- ์ฑ๊ณต์ ์ธ mint ๋ฐ refresh ์ด๋ฒคํธ๋
sub,email,client_ip๋ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํฉ๋๋ค - ๊ฑฐ๋ถ ์ด๋ฒคํธ๋ ์ด์ , ๊ฒฝ๋ก ๋ฐ ํด๋ผ์ด์ธํธ IP๋ฅผ ์ ๋ฌํฉ๋๋ค. ๊ฑฐ๋ถ ์ ID๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค
inference๋ ์ด๋ ์ ์คํธ๋ฆผ์ด ์์ฒญ์ ์ ๊ณตํ๋์ง ๋ฐ ์๋ต ์ํ๋ฅผ ๊ธฐ๋กํฉ๋๋คadmin.denied๋ ๊ฑฐ๋ถ๋ ๊ด๋ฆฌ์ API ์ธ์ฆ ์๋๋ฅผ ์ด์ (invalid_key๋๋no_credentials), ํด๋ผ์ด์ธํธ IP, ๋ฉ์๋ ๋ฐ ๊ฒฝ๋ก์ ํจ๊ป ๊ธฐ๋กํ๋ฉฐ, ์ ์๋ ํค ์๋ฃ๋ ์์ต๋๋ค
- ์ฑ๊ณต์ ์ธ mint ๋ฐ refresh ์ด๋ฒคํธ๋
- ์ด์ ๋ก๊ทธ: ๋ถํ
, ๊ฒฝ๊ณ ๋ฐ ์
์คํธ๋ฆผ ์ค๋ฅ์ ๋ํ ์ธ๊ฐ์ด ์ฝ์ ์ ์๋
[gateway]์ ๋์ฌ ์ค.CLAUDE_GATEWAY_LOG_LEVELํ๊ฒฝ ๋ณ์๋ ์์ธ๋๋ฅผ ์ ์ดํ๊ณinfo,warn๋๋error๋ฅผ ํ์ฉํ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์info์ ๋๋ค. ๊ฐ์ฌ ์ด๋ฒคํธ๋ ํญ์ ๋ด๋ณด๋ด์ง๋ฏ๋ก ์ด๋ ๊ฐ์ฌ ์ด๋ฒคํธ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
์ํ
๊ฒ์ดํธ์จ์ด๋ GET /healthz๋ฅผ ์์กด ํ๋ก๋ธ๋ก ์ ๊ณตํ๊ณ GET /readyz๋ฅผ ์ค๋น ํ๋ก๋ธ๋ก ์ ๊ณตํฉ๋๋ค. /readyz๋ ์ ์ฅ์์ ๋๋ฌ ๊ฐ๋ฅํ์ง ํ์ธํฉ๋๋ค. ๋ ๋ค access_control.allow_cidrs์์ ์ ์ธ๋๋ฏ๋ก ํ๋ก๋ธ๋ ์ ๊ธด ๋ฆฌ์ค๋์์ ์๋ํฉ๋๋ค.
/.well-known/oauth-authorization-server์ OAuth ๊ฒ์ ๋ฌธ์๋ ๊ตฌ์ฑ ๋ก๋, OIDC ๊ฒ์, ์
์คํธ๋ฆผ ํด๋ผ์ด์ธํธ ๊ตฌ์ฑ ๋ฐ Postgres ๋ง์ด๊ทธ๋ ์ด์
์ด ๋ชจ๋ ์ฑ๊ณตํ ํ์๋ง 200์ ๋ฐํํ๋ฏ๋ก, ์๋ ํฌ ์๋ ๋ถํ
ํ์ธ์ผ๋ก๋ ์๋ํฉ๋๋ค.
์คํ ์ค์ธ ๊ฒ์ดํธ์จ์ด๋ ๋ํ <public_url>/protocol์์ ์คํ ์ค์ธ ๋ฒ์ ๊ณผ ์ผ์นํ๋ ์๋ฝํ๋ ๊ฒฝ๋ก ๋ฐ ์์ฒญ ํํ์ ์ค๋ช
์ ์ ๊ณตํฉ๋๋ค. ๋ด์ฉ์ ๋ฆด๋ฆฌ์ค ๊ฐ์ ์์ ์ ์ด์ง ์์ต๋๋ค.
์ค๋จ ๋์
Postgres๊ฐ ๋ค์ด๋๋ฉด, ๊ฒ์ดํธ์จ์ด ์์ฒด๋ ๋ก๊ทธ์ธํ ๊ฐ๋ฐ์๋ฅผ ๊ณ์ ์ ๊ณตํ๊ณ ์๋ก์ด ๋ก๊ทธ์ธ์ ์คํจํฉ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ค์ ๋ก ๊ณ์ ์๋ํ๋์ง๋ ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ ์ค๋น๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค:
- ๊ธฐ์กด ์ธ์ : ๋ฒ ์ด๋ฌ ํ ํฐ์ JWT ์ํฌ๋ฆฟ์ผ๋ก ๋ก์ปฌ์์ ๊ฒ์ฆ๋๊ณ , ์ธ์ ์๋ก๊ณ ์นจ์ ์ ์ฅ์๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ผ๋ฉฐ, ๊ฒ์ดํธ์จ์ด ํ๋ก์ธ์ค๋ ์ฌ์ ํ ์ถ๋ก ์ ์ ๊ณตํ ์ ์์ต๋๋ค
- ์๋ก์ด ๋ก๊ทธ์ธ: Postgres๊ฐ ๋ณต๊ตฌ๋ ๋๊น์ง ์คํจํฉ๋๋ค. ์ฅ์น ํ๋ฆ ๋ฐ ์๋ ์ ํ ์นด์ดํฐ๊ฐ Postgres์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค
- ์ง์ถ ์ ํ ์ ์ฉ: ์ค๋จ ์ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฆฐ ์ํ๋ก ์คํจํ๋ฏ๋ก ์ถ๋ก ์ด ๊ณ์ ํ๋ฆ ๋๋ค. ์ฐจ๋จํ๋ ๊ฒ์ ์ ํธํ๋ฉด ๋ซํ ์ํ๋ก ๋ค์ง์ผ์ธ์
- ์ค๋น:
/readyz๋ ์ค๋จ ์ค์ ์ค๋น๋์ง ์์์ ๋ณด๊ณ ํ๋ฏ๋ก, ์ค๋น์ ๋ํ ํธ๋ํฝ์ ๊ฒ์ดํธํ๋ ์ค์ผ์คํธ๋ ์ดํฐ๋ Postgres๊ฐ ๋ณต๊ตฌ๋ ๋๊น์ง ๋ชจ๋ ๋ณต์ ๋ณธ์ ํ ๋ฒ์ ๋กํ ์ด์ ์์ ์ ๊ฑฐํฉ๋๋ค. ํด๋น ํ ํด๋ก์ง์์ ๊ฒ์ดํธ์จ์ด๊ฐ ์ฌ์ ํ ์ ๊ณตํ ์ ์๋ ์ถ๋ก ์ ํฌํจํ ๋ชจ๋ ํธ๋ํฝ์ ๋ก๋ ๋ฐธ๋ฐ์์์ ์คํจํฉ๋๋ค./healthz์ ์์กด ํ๋ก๋ธ๋ ๊ณ์ ํต๊ณผํ๋ฏ๋ก ๋ณต์ ๋ณธ์ ๋ค์ ์์๋์ง ์์ต๋๋ค. ๋ก๊ทธ์ธํ ๊ฐ๋ฐ์๊ฐ ์ ์ฅ์ ์ค๋จ์ ํตํด ๊ณ์ ์๋ํ๋๋ก ํ๋ ค๋ฉด ์ค๋น ํ๋ก๋ธ๋ฅผ/healthz๋ก ์ง์ ํ์ธ์. ๋น์ฉ์ ์๋ก์ด ๋ก๊ทธ์ธ์ด ์ฌ์ ํ ์ค๋น๋จ์ ๋ณด๊ณ ํ๋ ๋ณต์ ๋ณธ์ ๋ํด ์คํจํ๋ค๋ ๊ฒ์ ๋๋ค.
IdP๊ฐ ๋ค์ด๋๋ฉด, ๊ธฐ์กด ์ธ์
์ ttl_hours๊น์ง ์๋ํ๊ณ , ์๋ก์ด ๋ก๊ทธ์ธ ๋ฐ ์๋ก๊ณ ์นจ์ ์คํจํฉ๋๋ค. IdP๊ฐ ์์ฃผ ์ ์ง๋ณด์ ์ฐฝ์ ๊ฐ์ง๋ฉด ๋ ๊ธด ttl_hours๋ฅผ ์ค์ ํ์ธ์.
JWT ์ํฌ๋ฆฟ ๋กํ ์ด์
๊ธฐ์กด ์ธ์ ์ด ์ ํจํ๊ฒ ์ ์ง๋๋๋ก 3๋จ๊ณ๋ก ์๋ช ์ํฌ๋ฆฟ์ ๋กํ ์ด์ ํ์ธ์:
- ์ ์ํฌ๋ฆฟ์ ์์ฑํ์ธ์.
session.jwt_secret๋ฐฐ์ด์ ์์ ์ถ๊ฐํ์ธ์. - ๋ฐฐํฌ๋ฅผ ๋กค๋งํ์ธ์. ์ ํ ํฐ์ ์ ์ํฌ๋ฆฟ์ผ๋ก ์๋ช ํฉ๋๋ค. ์ด์ ํ ํฐ์ ์ฌ์ ํ ๊ฒ์ฆํฉ๋๋ค.
ttl_hours์ ์ฌ์ ํ์ ์ด์ ์ํฌ๋ฆฟ์ ์ ๊ฑฐํ๊ณ ๋ค์ ๋กค๋งํ์ธ์.
๋กํ
์ด์
์ ๋ํ ๋ง๋ฃ ์ ์ ์ธ์
์ ๊ฐ์ ๋ก ์ ๊ฑฐํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์
๋๋ค: ๋ฒ ์ด๋ฌ ํ ํฐ์ JWT ์ํฌ๋ฆฟ์ ๋ํด ๋ก์ปฌ์์ ๊ฒ์ฆ๋๋ฏ๋ก ์ธ์
๋ณ ํด์ ๊ฐ ์์ต๋๋ค. ๋ฐฐ์ด์ ์ด์ ์ํฌ๋ฆฟ์ ์ ์งํ์ง ์๊ณ ์ํฌ๋ฆฟ์ ์์ ํ ๊ต์ฒดํ๋ฉด ํ ๋ฒ์ ๋ชจ๋ ๋ฏธํด๊ฒฐ ์ธ์
์ด ๋ฌดํจํ๋ฉ๋๋ค. ๊ฐ๋ณ ์คํ๋ณด๋ฉ์ ๊ฒฝ์ฐ IdP์์ ์ฌ์ฉ์๋ฅผ ํ๋ก๋น์ ๋ ํด์ ํ์ธ์. ์ธ์
์ ttl_hours ๋ด์ ์ข
๋ฃ๋ฉ๋๋ค.
Postgres
๊ฒ์ดํธ์จ์ด๋ ๋ถํ ์ ๋ง์ด๊ทธ๋ ์ด์ ์ผ๋ก ์์ฑ๋๋ 5๊ฐ์ ํ ์ด๋ธ์ ๋ณด์ ํฉ๋๋ค:
| ํ ์ด๋ธ | ๋ด์ฉ | ๋ณด์กด |
|---|---|---|
kv |
์ฅ์น ๋ถ์ฌ(10๋ถ TTL) ๋ฐ ์๋ ์ ํ ์นด์ดํฐ | ํ๋ณ TTL |
spend |
์ฃผ์ ๊ธฐ๊ฐ๋ณ ๋์ ์ง์ถ ์นด์ดํฐ(์ผํธ) | admin.spend_retention_months, ๊ธฐ๋ณธ๊ฐ 13 |
spend_limits |
๊ตฌ์ฑ๋ ์ง์ถ ์ํ | API๋ฅผ ํตํด ์ญ์ ๋ ๋๊น์ง |
admin_audit |
๊ด๋ฆฌ์ API ๋ณ๊ฒฝ ์ถ์ | admin.audit_retention_days, ๊ธฐ๋ณธ๊ฐ 365 |
principal_emails |
๊ฐ ์ฃผ์์ ๋ง์ง๋ง ํ์ธ ์ด๋ฉ์ผ, ํ์ ์ด๋ฆ ๋ฐ IdP ๊ทธ๋ฃน. PII๋ฅผ ํฌํจํฉ๋๋ค. | admin.identity_retention_days ๋ง์ง๋ง ํ๋ ์ดํ, ๊ธฐ๋ณธ๊ฐ 90 |
30์ด ๋ฃจํ๋ TTL์ ์ง๋ kv ํ์ ๋ง๋ฃํ๊ณ , ์๊ฐ๋ณ ์ค์์ ์ง์ถ ํ
์ด๋ธ์ ๋ณด์กด ์ฐฝ์ ์ ์ฉํ๋ฏ๋ก ์๋ฌด๊ฒ๋ ๋ฌดํ์ ์ฆ๊ฐํ์ง ์์ต๋๋ค. ์ง์ถ ์ ํ์ด ๊ตฌ์ฑ๋์ง ์์ผ๋ฉด kv๋ง ์์ฑ๋ฉ๋๋ค. ๋ณด์ ์ ์ฑ
์ด ์ ํ๋ฆฌ์ผ์ด์
์ญํ ์ DDL์ ๊ธ์งํ๋ฉด ์ด๋ฌํ ํ
์ด๋ธ๊ณผ _migrations์ ๊ด๋ฆฌ์ ์ญํ ๋ก ๋ฏธ๋ฆฌ ์์ฑํ๊ณ ์ฑ ์ญํ ์ ๊ฐ๊ฐ์ ๋ํด SELECT, INSERT, UPDATE, DELETE๋ฅผ ๋ถ์ฌํ์ธ์.
์ง์ถ ์ ํ์ด ์ฌ์ฉ ์ค์ด๋ฉด, ์์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ฐ๋ฐ์ ์ฌ๋ก๊ทธ์ธ๋ฟ๋ง ์๋๋ผ ์์ค๋ ์ง์ถ ์ถ์ ๋ฐ ์ํ์ ์๋ฏธํ๋ฏ๋ก ์ ๊ธฐ์ ์ธ ๋ฐฑ์
์ ์คํํ์ธ์. ๋ณด์กด์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ ๋ ๊ฐ๋ฐ์ ํ๋๋ฅผ ์ฆ์ ์ง์ฐ๋ ค๋ฉด DELETE FROM principal_emails WHERE principal = '<sub>'์ ์ง์ ์คํํ์ธ์. ์ด๋ ์ด๋ฉ์ผ, ์ด๋ฆ ๋ฐ ๊ทธ๋ฃน์ ๋ณด์ ํ๋ ์ ์ผํ ํ
์ด๋ธ์ ์ ๊ฑฐํฉ๋๋ค. spend ๋ฐ admin_audit ํ์ ์์ฌ๋ช
OIDC sub๋ง ์ฐธ์กฐํฉ๋๋ค.
์ ๊ทธ๋ ์ด๋
๋ณต์ ๋ณธ์ ์ํ ๋น์ ์ฅ์ด๋ฏ๋ก ๋กค๋ง ์ฌ์์์ ์ธ์ ๋ ์ง ์์ ํฉ๋๋ค. ๊ฒ์ดํธ์จ์ด๋ ๋ถํ
์ ์คํค๋ง ๋ง์ด๊ทธ๋ ์ด์
์ ์คํํ๋ฏ๋ก, ์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ฐฐํฌํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
๋ฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ญํ ์ด DDL์ ์คํํ ์ ์์ผ๋ฉด ์คํค๋ง๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ์ธ์. ํ์ฌ ๋ฒ์ ์ผ๋ก ์๋๋ _migrations ํ
์ด๋ธ์ ํฌํจํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ถํ
์ด CREATE TABLE์ ์๋ํ๋ฉด์ ์คํจํฉ๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์ ์ถ๊ฐ ์ ์ฉ์ด๋ฏ๋ก ๋ ์ ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์๋ ์ด์ ๋ฐ์ด๋๋ฆฌ๋ก ๋กค๋ฐฑํ๋ ๊ฒ์ ์์ ํฉ๋๋ค. ์ถ๊ฐ ํ์ ๋ฌด์ํฉ๋๋ค. ๋กค๋ฐฑ์ ๋ํ YAML์ ์ด์ ๋ฐ์ด๋๋ฆฌ์ ์คํค๋ง์ ๋ํด ์ฌ๊ฒ์ฆํ๋ฏ๋ก, ์ ๋ฆด๋ฆฌ์ค์์ ๋์ ํ ํค๋ฅผ ์ฑํํ ๊ตฌ์ฑ์ ์ด์ ๋ฐ์ด๋๋ฆฌ์์ ๋ถํ ์ด ์คํจํฉ๋๋ค. ๋กค๋ฐฑ ์ ์ ์ ํค๋ฅผ ์ ๊ฑฐํ์ธ์.
๊ฒ์ดํธ์จ์ด์ ๋ฒ์ ์ ์์ ์ ์ด๋ฏธ์ง์ ๊ณ ์ ํ๋ฏ๋ก, ์ Claude Code ๋ฆด๋ฆฌ์ค์ ์์ ์ฌํญ(๋ณด์ ์์ ์ฌํญ ํฌํจ)์ ํ์ ์ ๋ฐ์ดํธํ๊ณ ์ฌ๋ฐฐํฌํ ๋๋ง ๋ฐฐํฌ์ ๋๋ฌํฉ๋๋ค. ๊ฒ์ดํธ์จ์ด๋ฅผ ํ๋ก๋์ ์๊ฒฉ ์ฆ๋ช ์ ๋ณด์ ํ๋ ๋ค๋ฅธ ์๋น์ค์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ํจ์นญ ์ฃผ๊ธฐ์ ํฌํจํ์ธ์.
๋ณด์
์ด ์น์ ์ ๋ณด์ ๊ฒํ ๊ฐ ๋ฌป๋ ์ง๋ฌธ์ ๋ตํฉ๋๋ค: ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๊ฒ์ดํธ์จ์ด๋ฅผ ํตํด ํ๋ฅด๊ณ ์ด๋๋ก ๊ฐ๋์ง, ์ค๊ณ๊ฐ ๋ฐฉ์ดํ๋ ๊ณต๊ฒฉ, ๊ท์ ์ค์ ์ง๋ฌธ์ง์ ์ํ๋ ๋ต๋ณ.
๋ฐ์ดํฐ ํ๋ฆ
| ๋ฐ์ดํฐ | ๊ฒฝ๋ก | ๊ฒ์ดํธ์จ์ด์์ Anthropic์ผ๋ก ์ ์ก๋จ |
|---|---|---|
| ์ถ๋ก (ํ๋กฌํํธ, ์๋ฃ) | CLI โ ๊ฒ์ดํธ์จ์ด โ ์ ์คํธ๋ฆผ | Anthropic API๊ฐ ๊ตฌ์ฑ๋ ์ ์คํธ๋ฆผ์ธ ๊ฒฝ์ฐ์๋ง |
| ํ ๋ ๋ฉํธ๋ฆฌ(OTLP ๋ฉํธ๋ฆญ, ํ๋ฌ์ค ์ตํธ์ธ ๋ก๊ทธ ๋ฐ ์ถ์ ) | CLI โ ๊ฒ์ดํธ์จ์ด โ ์์ง๊ธฐ | ์ ๋ ์๋ |
| ID(์ด๋ฉ์ผ, ๊ทธ๋ฃน, sub) | IdP โ ๊ฒ์ดํธ์จ์ด โ JWT โ CLI; CLI๋ OTLP ๋ด๋ณด๋ด๊ธฐ์ ์คํฌํํฉ๋๋ค | ์ ๋ ์๋ |
| ๊ด๋ฆฌํ ์ค์ | ๊ฒ์ดํธ์จ์ด YAML โ CLI | ์ ๋ ์๋ |
| ๊ฐ์ฌ ๋ก๊ทธ | ๊ฒ์ดํธ์จ์ด stderr โ ์์ง๊ธฐ | ์ ๋ ์๋ |
์ํ ๋ชจ๋ธ ์์ฝ
๊ฒ์ดํธ์จ์ด๋ ๋คํธ์ํฌ ๊ฒฝ๊ณ ๋ด๋ถ์ ์์ง๋ง, ๊ฐ๋ณ ๊ฐ๋ฐ์ ๋ ธํธ๋ถ์ ์ ๋ขฐํ ์ ์๋ ๊ฒ์ผ๋ก ์ทจ๊ธ๋์ง ์์ต๋๋ค. ์ค๊ณ๋ 3๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ด๋ฅผ ์ค๋ช ํฉ๋๋ค:
- ๊ฐ๋ฐ์๋ ์์ ์ ์คํธ๋ฆผ ํค ๋์ ๋จ๊ธฐ JWT๋ฅผ ๋ณด์ ํฉ๋๋ค. CLI-๊ฒ์ดํธ์จ์ด ๋ ๊ทธ๋ RFC 8628 ์ฅ์น ๋ถ์ฌ๋ฅผ ์ฌ์ฉํ๊ณ , ๊ฒ์ดํธ์จ์ด์ IdP์์ ์ธ์ฆ ์ฝ๋ ๊ตํ์ ๊ธฐ๋ณธ ๊ตฌ์ฑ์์ PKCE๋ฅผ ์คํํ๋ฏ๋ก, ๊ฐ๋ก์ฑ IdP ์ธ์ฆ ์ฝ๋๋ ์ธ๋ชจ๊ฐ ์์ต๋๋ค.
- ์ฅ์น ๊ฒ์ฆ ํ์ด์ง๋ ๋์ผ ์ถ์ฒ POST ๋ฐ RFC 8628 ยง5.1๋น IP๋น ์๋ ์ ํ์ ์ ์ฉํฉ๋๋ค. ์ฌ์ฉ์ ์ฝ๋ ๋ฌด์ฐจ๋ณ ๋์ ์ ํญ์ ์ฐธ์กฐํ์ธ์.
- ์์๋ฐ์ด๋ ์์ฒญ์ DNS๋ฅผ ํ์ธํ๊ณ , ๋งํฌ ๋ก์ปฌ ๋ฐ ํด๋ผ์ฐ๋ ๋ฉํ๋ฐ์ดํฐ ์ฃผ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฃจํ๋ฐฑ์ ์ฐจ๋จํ๋ฉฐ, ์ฐ๊ฒฐ์ ํ์ธ๋ IP์ ๊ณ ์ ํ๋ ์๋ฒ ์ธก ์์ฒญ ์์กฐ(SSRF) ๊ฐ๋๋ฅผ ํต๊ณผํฉ๋๋ค. ๋ฐ๋ผ์ IdP ๋ฐ OTLP ๋์๊ณผ ๊ฐ์ ์ด์์ ์ํฅ URL์ ํด๋ผ์ฐ๋ ๋ฉํ๋ฐ์ดํฐ ์๋ํฌ์ธํธ๋ก ๋ฆฌ๋๋ ์
๋ ์ ์์ต๋๋ค. RFC 1918 ํ๋ผ์ด๋น ๋ฒ์๋ ์๋์ ์ผ๋ก ํ์ฉ๋ฉ๋๋ค. IdP ๋ฐ OTLP ์์ง๊ธฐ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ํ๋ผ์ด๋น IP์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฃจํ๋ฐฑ IdP ๋๋ ์์ง๊ธฐ์ ๋ํ ๋ก์ปฌ ๊ฐ๋ฐ์ ๊ฒฝ์ฐ ๊ฒ์ดํธ์จ์ด์ ํ๊ฒฝ์์
CLAUDE_GATEWAY_ALLOW_LOOPBACK=1์ ์ค์ ํ์ธ์. ํ๋ก๋์ ์์๋ ์ค์ ํ์ง ๋ง์ธ์.
์์ ์ ์ก์ ์ ์ด๋ฅผ ์ถ๊ฐํ๋ฉด, ๊ฒ์ดํธ์จ์ด๋ ์ํฌ๋ก๋ ID์ ๊ฐ์ ์ธ์คํด์ค ๋ฉํ๋ฐ์ดํฐ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ ๋๋ง๋ค ๋ฉํ๋ฐ์ดํฐ ์๋ฒ์ ๋๋ฌํด์ผ ํฉ๋๋ค.
๋ ๊ฐ์ง ์ํ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ์ต๋๋ค. ์ด๋ ๋ณด์ํ ์ธํ๋ผ์ ๋๋ค:
- ์์๋ ๊ฒ์ดํธ์จ์ด ํธ์คํธ: ํธ์คํธ๋ ์ ์คํธ๋ฆผ ์๊ฒฉ ์ฆ๋ช ์ ๋ณด์ ํ๊ณ ๊ด๋ฆฌํ ์ค์ ์ ๋ชจ๋ ์ฐ๊ฒฐ๋ ๊ฐ๋ฐ์์๊ฒ ๋ฐฐํฌํ๋ฏ๋ก, ๊ฒ์ดํธ์จ์ด ๊ตฌ์ฑ์ ๋ํ ์ ์ด๋ MDM์ ๋ํ ์ ์ด์ ๋น๊ตํ ์ ์์ต๋๋ค. CLI์ ์ผํ์ฑ ์น์ธ ๋ํ๋ ์ ธ ๊ฐ๋ฅ ์ค์ ์ ์๋ ๋ณ๊ฒฝ์ ์ ํํ์ง๋ง ํธ์คํธ ๋ณด์์ ๋์ฒดํ์ง ์์ต๋๋ค.
- ์ ์์ ์ธ OIDC ๊ณต๊ธ์: ๊ณต๊ธ์๋ ๊ฒ์ดํธ์จ์ด๊ฐ ์ ๋ขฐํ๋ id_token์ ์๋ช ํ๋ฏ๋ก ๋ชจ๋ ID๋ฅผ ์ฃผ์ฅํ ์ ์์ต๋๋ค. IdP ๊ฒ์ฆ ๋ฐ ๋ณด์์ ๊ท์ฌ์ ์ฑ ์์ ๋๋ค.
์ฌ์ฉ์ ์ฝ๋ ๋ฌด์ฐจ๋ณ ๋์ ์ ํญ
๊ฐ๋ฐ์๊ฐ /device ๊ฒ์ฆ ํ์ด์ง์ ์
๋ ฅํ๋ user_code๋ 20์ ์ํ๋ฒณ์์ ๊ทธ๋ ค์ง 8์์ด๋ฉฐ, 20โธ ๋๋ ์ฝ 2.56ร10ยนโฐ ์กฐํฉ์ ์ฐ์ถํ๊ณ 10๋ถ ํ ๋ง๋ฃ๋ฉ๋๋ค.
๊ฒ์ดํธ์จ์ด๋ rate_limits๋ฅผ ํตํด ๊ตฌ์ฑ ๊ฐ๋ฅํ ์ฅ์น ๋ถ์ฌ ์๋ํฌ์ธํธ์ IP๋น ์๋ ์ ํ์ ์ ์ฉํฉ๋๋ค. ๋ง์ ๊ฐ๋ฐ์๊ฐ ๋จ์ผ ๊ณต์ ํ์ฌ NAT ์ฃผ์์์ ๋ก๊ทธ์ธํ๋ฉด ์ ํ์ ์ฌ๋ฆฌ์ธ์. ์ ํ์ ๋ก๊ทธ์ธ ํ๋ฆ์๋ง ์ ์ฉ๋๋ฉฐ ์ถ๋ก ์๋ ์ ์ฉ๋์ง ์์ต๋๋ค.
๊ท์ ์ค์ ํ์ธ
- ๋ฐ์ดํฐ ๊ฑฐ์ฃผ์ง: ๊ฒ์ดํธ์จ์ด์ ์์ฒด ๋ฐ์ดํฐ ํ๋ฉด์ Anthropic API๊ฐ ๊ตฌ์ฑ๋ ์ ์คํธ๋ฆผ์ธ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ Anthropic์ ์๋ฌด๊ฒ๋ ๋ณด๋ด์ง ์์ต๋๋ค. ๊ทธ ๊ฒฝ์ฐ ๊ธฐ์กด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ณ์ฝ์ด ์ถ๋ก ๊ฒฝ๋ก์ ์ ์ฉ๋ฉ๋๋ค. ํ ๋ ๋ฉํธ๋ฆฌ, ๊ฐ์ฌ, ID ๋ฐ ์ค์ ์ ๊ตฌ์ฑํ ๋์์ผ๋ก๋ง ์ด๋ํฉ๋๋ค.
- ํธ์คํธ ํ๋ก์ธ์ค ํธ๋ํฝ: ํธ์คํธ ํ๋ก์ธ์ค๋ Claude Code CLI์ด๋ฉฐ, ์์ ๋ถ์ ๋ฐ ์
๋ฐ์ดํธ ํ์ธ์ Anthropic์ผ๋ก ๋ณด๋ผ ์ ์์ต๋๋ค. ์๊ฒฉํ ์ก์ ๋ฐฐํฌ์ ๊ฒฝ์ฐ ๊ฒ์ดํธ์จ์ด์ ์ปจํ
์ด๋ ํ๊ฒฝ์์
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1์ ์ค์ ํ์ธ์. - ํด๋ผ์ด์ธํธ ๋ถ์: CLI๋ ๊ฒ์ดํธ์จ์ด์ ๋ก๊ทธ์ธํ๋ ๋์ ์์ ์ ์ฌ์ฉ ๋ถ์์ ๋นํ์ฑํํ๊ณ , ์ค๋ฅ ๋ณด๊ณ ๋ ํ์ฌ API ํ๋ฉด์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊บผ์ ธ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ ๋จธ์ : ๊ฐ๋ฐ์์ CLI๋
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1๋ฐskipWebFetchPreflight: true๊ฐ ์ค์ ๋์ง ์์ผ๋ฉด ์ฌ์ ํ WebFetch ํธ์คํธ๋ช ํ์ธ ๋ฐ ๋ฒ์ ํ์ธ์ Anthropic์ผ๋ก ๋ณด๋ ๋๋ค. ๋ฐ์ดํฐ ์ฌ์ฉ์ ์ฐธ์กฐํ์ธ์. - ์ค๋ฌธ ์กฐ์ฌ ํ๊ฐ: ๊ฒ์ดํธ์จ์ด ์๊ฒฉ ์ฆ๋ช ์ Anthropic ๋ฐ์ด๋ ํ๊ฐ ์ฑํฌ๋ฅผ ๋นํ์ฑํํ๋ฏ๋ก ํ๊ฐ๋ Anthropic์ผ๋ก ์ ์ก๋์ง ์์ต๋๋ค.
- ํธ๋์คํฌ๋ฆฝํธ ๊ณต์ : ์ค๋ฌธ ์กฐ์ฌ์ ํธ๋์คํฌ๋ฆฝํธ ๊ณต์ ํ๋กฌํํธ์์ ์๋ฅผ ์ ํํ๋ฉด Anthropic์ผ๋ก ์
๋ก๋ํ๋ ๋์
~/.claude/feedback-bundles/์๋์ ๋ก์ปฌ ํ์ผ์ ์์ฑํฉ๋๋ค. - ํด๋ผ์ด์ธํธ ์
๋ฐ์ดํธ: ์
๋ฐ์ดํธ ํ์ธ์ ๊ฒ์ดํธ์จ์ด ํธ๋ํฝ๊ณผ ๋ณ๊ฐ์
๋๋ค. ์์ ์ ๋ฐฐํฌ๋ฅผ ํตํด ๋ฒ์ ์ ๊ณ ์ ํ๊ณ ๋
ธํธ๋ถ์ด ๋ฆด๋ฆฌ์ค๋ฅผ ๊ฐ์ ธ์ค๋ฉด ์ ๋๋ฉด
DISABLE_UPDATES๋ฅผ ์ค์ ํ์ธ์.DISABLE_AUTOUPDATER๋claude update๊ฐ ์ฌ์ ํ ์๋ํ๋ ๋์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ๋ฐ์ดํธ๋ง ์ค์งํฉ๋๋ค. - TLS: ํ๋ก๋์
์์
public_url์ HTTPS๋ฅผ ํตํด ์ ๊ณตํ์ธ์. ๊ฒ์ดํธ์จ์ด์ ์์ฒด ๋ฆฌ์ค๋๋ฅผ ํตํดlisten.tls๋ฅผ ์ฌ์ฉํ๊ฑฐ๋listen.public_url์ด ์ค์ ๋ ์ผ๋ฐ HTTP ๋ณต์ ๋ณธ ์์ TLS ์ข ๋ฃ ingress์์. ๊ฒ์ดํธ์จ์ด๋ ์ผ๋ฐ HTTP๋ฅผ ๊ฑฐ๋ถํ์ง ์์ต๋๋ค. IdP๋ ํ๋ก๋์ ์์ HTTPS๋ฅผ ์ ๊ณตํด์ผ ํ๊ณ , Postgres๋?sslmode=require๋ฅผ ์ง์ํฉ๋๋ค. ingress์์Strict-Transport-Security๋ฅผ ์ค์ ํ์ธ์. - ์ทจ์ฝ์ ๊ณต๊ฐ: ๋ณด์ ๋ฌธ์ ๋ณด๊ณ ๋ฅผ ๋ฐ๋ฅด์ธ์
๋ฌธ์ ํด๊ฒฐ
์ง๋ฌธ ๋ฐ ํผ๋๋ฐฑ์ Claude Code ์ง์์ ์ฌ์ฉํ๊ฑฐ๋ Claude Code GitHub ์ ์ฅ์์์ ์ด์๋ฅผ ์ด์ด์ฃผ์ธ์. ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํ ๋ ๋ค์์ ํฌํจํ์ธ์:
- ๊ฒ์ดํธ์จ์ด ๋ฌธ์ : ๊ด๋ จ ์ฐฝ์ ๊ฒ์ดํธ์จ์ด stderr, ์ํฌ๋ฆฟ์ด ์์ ๋
gateway.yaml, ๊ฒ์ดํธ์จ์ด ๋ฒ์ (๋๋ฉ ํ์ด์ง/์ ํ์๋๊ณ/managed/settings์x-cc-gateway-version์๋ต ํค๋์ ํ์๋จ), ์ต๊ทผ์ ๋ณ๊ฒฝ๋ ๊ฒ - ๋ก๊ทธ์ธ ๋ฌธ์ : ๊ฐ๋ฐ์๋
claude --debug-file ./claude-debug.txt๋ฅผ ์คํํ๊ณ , ์ฌํํ๋ฉฐ, ํด๋น ํ์ผ๊ณผ ๋์ผํ ์ฐฝ์ ๊ฒ์ดํธ์จ์ด ๊ฐ์ฌ ๋ก๊ทธ๋ฅผ ๋ณด๋ ๋๋ค - ์ถ๋ก ๋ฌธ์ : ์์ฒญ๋ ๋ชจ๋ธ, ๊ตฌ์ฑ๋ ์ ์คํธ๋ฆผ, ์์ฒญ์ ๊ฒ์ดํธ์จ์ด ๊ฐ์ฌ ๋ก๊ทธ(์ด๋ ์ ์คํธ๋ฆผ์ด ์ ๊ณตํ๋์ง ๋ฐ ์๋ต ์ํ๋ฅผ ๊ธฐ๋กํจ)
| ์ฆ์ | ์์ธ | ์์ |
|---|---|---|
๊ฐ๋ฐ์์ /login์ด Cloud ๊ฒ์ดํธ์จ์ด ํ๋ฉด ๋์ ํ์ค ๊ณ์ ์ ํ๊ธฐ๋ฅผ ํ์ํฉ๋๋ค |
forceLoginMethod ๋๋ forceLoginGatewayUrl์ด ํด๋น ๋จธ์ ์ ๊ด๋ฆฌํ ์ค์ ์ ์ค์ ๋์ง ์์ |
๊ด๋ฆฌํ ์ค์ ํ์ผ์ ์ฅ์น์ ๋ฐฐํฌํ์ธ์. /login์ ๊ฑฐ๊ธฐ์ ๊ฒ์ดํธ์จ์ด URL์ ์ฝ์ต๋๋ค |
์์ ์ Gateway login is configured in managed settings, but this Claude Code build does not include Cloud gateway support. ํ์ |
์ค์น๋ Claude Code ๋น๋๊ฐ ๊ฒ์ดํธ์จ์ด ์ง์๋ณด๋ค ์์๊ฐ๋๋ค | ๊ฐ๋ฐ์๊ฐ Claude Code๋ฅผ Cloud ๊ฒ์ดํธ์จ์ด ์ง์์ ํฌํจํ๋ ๋ฆด๋ฆฌ์ค๋ก ์ ๋ฐ์ดํธํ๋๋ก ํ์ธ์ |
CLI /login: Gateway hosts must be on your organization's private network; <host> resolves to the public (or unrecognized) address <ip> |
๊ฒ์ดํธ์จ์ด ํธ์คํธ๋ช
์ด ์ ์ด๋ ํ๋์ ๊ณต๊ฐ IP ์ฃผ์๋ก ํ์ธ๋ฉ๋๋ค. Claude Code๋ ๊ฐ ํ์ธ๋ ์ฃผ์๋ฅผ ํ์ธํ๊ณ ๋ชจ๋ ์ฃผ์๊ฐ ํ๋ผ์ด๋น์ด์ด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์์ธ์ ํ ํจ๋ฐ๋ฆฌ๊ฐ ๊ณต๊ฐ ์ฃผ์๋ก ํ์ธ๋๋ ์ด์ค ์คํ ์ด๋ฆ์
๋๋ค. AWS ๋ด๋ถ ์ด์ค ์คํ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ํฌํจํ์ฌ ๊ณต๊ฐ ๋ฒ์ AAAA ์ฃผ์๋ฅผ ๋ฐํํฉ๋๋ค. Anthropic์ด ์ด์ํ๋ ๊ณต๊ฐ ๊ฒ์ดํธ์จ์ด ์๋ํฌ์ธํธ๋ ํ์ธ์์ ์ ์ธ๋๋ฉฐ, /login์ https://๋ฅผ ํตํด ์ด๋ค์ ํ์ฉํฉ๋๋ค. v2.1.206 ์ด์ ์๋ /login์ด ๋ค๋ฅธ ๊ณต๊ฐ ์ฃผ์์ฒ๋ผ ์ด๋ค์ ๊ฑฐ๋ถํ์ต๋๋ค |
๊ฒ์ดํธ์จ์ด ์ด๋ฆ์ด ๊ฐ๋ฐ์ ๋จธ์ ์์ ํ๋ผ์ด๋น ์ฃผ์๋ก๋ง ํ์ธ๋๋๋ก ํ์ธ์. ์ด์ค ์คํ ์ด๋ฆ์ ๊ฒฝ์ฐ ๊ณต๊ฐ ๋ฒ์ ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ ๋ณ๋์ ๋ด๋ถ ์ ์ฉ DNS ์ด๋ฆ์ ์ ๊ณตํ์ธ์. ํ๋ผ์ด๋น ๋คํธ์ํฌ ์ ์ ์กฐ๊ฑด์ ์ฐธ์กฐํ์ธ์. |
CLI /login: Gateway login requires a direct connection and does not support connecting through an HTTP proxy |
HTTPS_PROXY ๋๋ HTTP_PROXY๊ฐ ๊ฒ์ดํธ์จ์ด ํธ์คํธ์ ์ ์ฉ๋๊ณ ํ๋ก์์ ํธ์คํธ๋ช
์ด ๊ณต๊ฐ ์ฃผ์๋ก ํ์ธ๋ฉ๋๋ค. ํธ์คํธ๊ฐ ํ๋ผ์ด๋น ์ฃผ์๋ก๋ง ํ์ธ๋๋ ํ๋ก์๋ ํ์ฉ๋๋ฉฐ ์ด ์ค๋ฅ๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ง ์์ต๋๋ค |
๊ฐ๋ฐ์์ ๋จธ์ ์์ NO_PROXY์ ๊ฒ์ดํธ์จ์ด ํธ์คํธ๋ฅผ ์ถ๊ฐํ์ฌ ์ฐ๊ฒฐ์ด ์ง์ ์ด๊ฑฐ๋ ํธ์คํธ๋ช
์ด ํ๋ผ์ด๋น ์ฃผ์๋ก ํ์ธ๋๋ ํ๋ก์๋ฅผ ์ฌ์ฉํ์ธ์ |
CLI /login: Could not resolve gateway host <host> |
๋จธ์ ์ด ๊ฒ์ดํธ์จ์ด์ ๋ด๋ถ DNS ์ด๋ฆ์ ํ์ธํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ์ฌ ๋คํธ์ํฌ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค | ๊ฐ๋ฐ์๊ฐ ๋คํธ์ํฌ ๋๋ VPN์ ์ฐ๊ฒฐํ ํ /login์ ๋ค์ ์๋ํ๋๋ก ํ์ธ์ |
๋ถํ
์ด store.postgres_url์ ๋ช
๋ช
ํ๋ ๊ตฌ์ฑ ๊ฒ์ฆ ์ค๋ฅ๋ก ์ข
๋ฃ๋ฉ๋๋ค |
Postgres๊ฐ ๊ตฌ์ฑ๋์ง ์์. ๊ฒ์ดํธ์จ์ด๋ Postgres๊ฐ ํ์ํฉ๋๋ค | store.postgres_url์ ์ค์ ํ์ธ์. ๋ก์ปฌ ๊ฐ๋ฐ์ ๊ฒฝ์ฐ ์ผํ์ฉ ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ์ธ์: docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres. |
๋ถํ
์ข
๋ฃ: requires the native binary |
Node ๋์ ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ์์ ์คํ ์ค์ ๋๋ค | ๋ ๋ฆฝ ์คํํ ์ค์น ๋ฐฉ๋ฒ ์ค ํ๋๋ก Claude Code๋ฅผ ์ค์นํ์ธ์ |
๋ถํ
์ด config.load ํ OIDC ๊ฒ์ ์ค๋ฅ๋ก ์ข
๋ฃ๋ฉ๋๋ค |
oidc.issuer์ ๋๋ฌํ ์ ์๊ฑฐ๋ TLS ์ฒด์ธ์ ์ ๋ขฐํ์ง ์์ต๋๋ค |
๋ฐ๊ธ์๊ฐ ํฌ๋์์ ๋๋ฌ ๊ฐ๋ฅํ๊ณ /.well-known/openid-configuration์ ์ ๊ณตํ๋์ง ํ์ธํ์ธ์. ํ๋ผ์ด๋น PKI์ ๊ฒฝ์ฐ ca_cert_pem์ ์ค์ ํ์ธ์. |
| ๋ถํ ์ด Postgres ๊ถํ ์ค๋ฅ๋ก ์ข ๋ฃ๋ฉ๋๋ค | ์ฑ ์ญํ ์ CREATE TABLE ๊ถํ์ด ์์ต๋๋ค |
๊ด๋ฆฌ์ ์ญํ ๋ก ์คํค๋ง๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๊ณ ์ฑ ์ญํ ์ DML์ ๋ถ์ฌํ๊ฑฐ๋, ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ ์ฉํ๋ ๋ถํ ์ ์ํด DDL์ ์์๋ก ๋ถ์ฌํ์ธ์ |
/oauth/callback์ด "Sign-in could not be completed" ํ์ |
์ด๋ฉ์ผ ๋๋ฉ์ธ์ด ๊ฑฐ๋ถ๋์๊ฑฐ๋, id_token ๊ฒ์ฆ์ด ์คํจํ๊ฑฐ๋, email_verified๊ฐ ๋ช
์์ ์ผ๋ก false์
๋๋ค. ๊ฒ์ดํธ์จ์ด๋ ํญ์ ์ด๋ฅผ ๊ฑฐ๋ถํ๋ฉฐ ์ฌ์ ์๊ฐ ์์ต๋๋ค |
allowed_email_domains๋ฅผ ํ์ธํ๊ณ IdP๊ฐ ๊ฒ์ฆ๋ email ํด๋ ์์ ๋ฐํํ๋์ง ํ์ธํ์ธ์. email_verified: false์ ๊ฒฝ์ฐ IdP ์ธก ๊ฒ์ฆ์ ์์ ํ์ธ์. IdP๊ฐ ๋ค๋ฅธ ํด๋ ์ ์ด๋ฆ ์๋์ ์ด๋ฉ์ผ์ ๋ด๋ณด๋ด๋ฉด oidc.email_claim์ ์ค์ ํ์ธ์. |
๋ก๊ทธ: token exchange failed: id_token missing email claim |
IdP๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก id_token์ email์ ํฌํจํ์ง ์์ต๋๋ค. ์ด ๊ฑฐ๋ถ๋ allowed_email_domains๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํฉ๋๋ค. ์์ผ๋ฉด ๋๋ฝ๋ ์ด๋ฉ์ผ์ด ์ด๋ฉ์ผ ์์ด ์ธ์
์ ๋ฏผํธํฉ๋๋ค |
IdP๋ฅผ ๊ตฌ์ฑํ์ฌ id_token์ email์ ๋ด๋ณด๋ด์ธ์. Okta: ์ฌ์ฉ์ ์ ์ ์ธ์ฆ ์๋ฒ์ ID ํ ํฐ ํด๋ ์์ email์ ์ถ๊ฐํ์ธ์. Entra: ์ฑ ๋ฑ๋ก์์ email์ ์ ํ์ ํด๋ ์์ผ๋ก ์ถ๊ฐํ์ธ์. PingFederate: email์ ๋ด๋ณด๋ด๋ OpenID Connect ์ ์ฑ
์ ํ์ฑํํ์ธ์. IdP๊ฐ userinfo ์๋ํฌ์ธํธ์์ email์ ์ ๊ณตํ์ง๋ง id_token์ ํฌํจํ์ง ์์ผ๋ ค๋ฉด(์: Okta ์กฐ์ง ์ธ์ฆ ์๋ฒ), oidc.userinfo_fallback: true๋ฅผ ์ค์ ํ์ธ์. |
๋ชจ๋ Amazon Bedrock ์์ฒญ์ด 502๋ฅผ ๋ฐํํฉ๋๋ค. ๋ก๊ทธ๋ Could not load credentials from any providers ํ์ |
EC2์์ IMDSv2์ ๊ธฐ๋ณธ ํ ์ ํ 1์ ์ปจํ
์ด๋ ๋ด๋ถ์์ ์ธ์คํด์ค ๋ฉํ๋ฐ์ดํฐ ์์ฒญ์ ์ฐจ๋จํฉ๋๋ค. ๋ถํ
๋ฐ /readyz๋ AWS SDK๊ฐ ํด๋ผ์ด์ธํธ ๊ตฌ์ฑ์ด ์๋ ์ฒซ ๋ฒ์งธ ์์ฒญ์์ ์ธ์คํด์ค ์๊ฒฉ ์ฆ๋ช
์ ํ์ธํ๋ฏ๋ก ์ด์จ๋ ํต๊ณผํฉ๋๋ค |
aws ec2 modify-instance-metadata-options --instance-id <id> --http-put-response-hop-limit 2๋ก ํ ์ ํ์ ์ฌ๋ฆฌ๊ฑฐ๋ ์์ ํ
ํ๋ฆฟ์์ ์ค์ ํ์ธ์. ๋ณ๊ฒฝ์ ์ธ์คํด์ค์ ๋ชจ๋ ์ปจํ
์ด๋์ ์ ์ฉ๋ฉ๋๋ค. ๊ฐ๋ฅํ ๊ฒฝ์ฐ ECS ์์
์ญํ ์ ์ ํธํ์ธ์. ์ด๋ ECS ์ปจํ
์ด๋ ์๊ฒฉ ์ฆ๋ช
์๋ํฌ์ธํธ์์ ์๊ฒฉ ์ฆ๋ช
์ ์ฝ๊ณ ๋ณ๊ฒฝ์ ์์ ํ ํผํ๊ฑฐ๋, ๋
ธ์ถ์ ์ ํํ๊ธฐ ์ํด ์ ์ฉ ๊ฒ์ดํธ์จ์ด ์ธ์คํด์ค์ ๋ณ๊ฒฝ์ ์ ์ฉํ์ธ์. |
| IdP ์ค๋ฅ: unknown or unsupported scope | IdP๊ฐ ์ธ์ํ์ง ๋ชปํ๋ ๋ฒ์๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค | oidc.scopes๋ฅผ IdP๊ฐ ํ์ฉํ๋ ์ ํํ ๋ชฉ๋ก์ผ๋ก ์ค์ ํ์ธ์. openid๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ openid profile email offline_access์
๋๋ค. |
oidc.scopes ์ค์ ํ ์ธ์
์ด ์๋์ผ๋ก ๊ฐฑ์ ๋์ง ์์ต๋๋ค |
offline_access๊ฐ ์ฌ์ ์์์ ์ญ์ ๋์์ต๋๋ค |
IdP๊ฐ ์ง์ํ๋ฉด offline_access๋ฅผ ๋ค์ ์ถ๊ฐํ์ธ์. ์๋ก๊ณ ์นจ ํ ํฐ์ด ์์ผ๋ฉด ๊ฐ๋ฐ์๋ ๋งค session.ttl_hours๋ง๋ค ๋ธ๋ผ์ฐ์ ๋ก๊ทธ์ธ์ ๋ค์ ์คํํฉ๋๋ค. |
| ๋ธ๋ผ์ฐ์ ๊ฐ "This request came from another site and was blocked" ํ์ | CSRF ๋ณดํธ๋ก ์ฐจ๋จ๋ ๊ต์ฐจ ์ฌ์ดํธ ์์ POST. ํฌํจ๋๊ฑฐ๋ ํ๋ก์๋ ํ์ด์ง์ ๊ฒฝ์ฐ ์์๋ฉ๋๋ค | ๊ฒ์ฆ ๋งํฌ๋ฅผ ์ง์ ์ด์ด์ฃผ์ธ์ |
| Chrome์ด "Refused to send form data โฆ violates โฆ Content Security Policy directive: form-action"์ผ๋ก ์น์ธ ๋ฒํผ์ ์ฐจ๋จํ์ง๋ง ๋์ผํ ํ์ด์ง๊ฐ Safari ๋๋ Firefox์์ ์๋ํฉ๋๋ค | Chrome์ ์ ์ฒด ๋ฆฌ๋๋ ์
์ฒด์ธ์ ๋ํด form-action์ ์ ์ฉํฉ๋๋ค. IdP๊ฐ ํ์ฉ ๋ชฉ๋ก์ ์๋ ๋ ๋ฒ์งธ ํธ์คํธ๋ก ๊ณ์ ๋ฆฌ๋๋ ์
ํฉ๋๋ค. |
๋ฆฌ๋๋ ์
์ฒด์ธ์ ๊ฐ ์ถ๊ฐ ์๋ณธ์ oidc.form_action_origins์ ์ถ๊ฐํ์ธ์. ์น์ธ ํ์ด์ง์์ Chrome DevTools โ ์ฝ์์ ์ด์ด ์ด๋ ์๋ณธ์ด ์ฐจ๋จ๋์๋์ง ํ์ธํ์ธ์. |
| ๋ก๊ทธ์ธ์ด IdP์์ ์๋ฃ๋์ง๋ง ์ฝ๋ฐฑ์ด ์คํจํฉ๋๋ค. Chrome์์ CSP ์ค๋ฅ ๋๋ Safari์์ "this sign-in link has expired" | IdP๊ฐ response_mode=form_post๋ฅผ ํตํด ์ฝ๋๋ฅผ ๋ฐํํ์ผ๋ฉฐ, ์ด๋ POST๋ฅผ ํตํด /oauth/callback์ผ๋ก ๊ต์ฐจ ์๋ณธ์ ์๋ ์ ์ถํฉ๋๋ค. Chrome์ ์๊ฒฉํ CSP์์ ์ด๋ฅผ ์ฐจ๋จํฉ๋๋ค. Safari๋ ์ ์ถ์ ํ์ฉํ์ง๋ง ์ฝ๋ฐฑ์ ์ฟผ๋ฆฌ ๋ฌธ์์ด๋ง ์ฝ์ต๋๋ค. |
IdP๊ฐ response_mode=query๋ฅผ ์ค์ํ๋์ง ํ์ธํ์ธ์. ๊ฒ์ดํธ์จ์ด๊ฐ ๋ช
์์ ์ผ๋ก ์์ฒญํ๋ฏ๋ก ์ฝ๋ฐฑ์ ์ผ๋ฐ ๋ฆฌ๋๋ ์
์
๋๋ค |
| ๋ก๊ทธ์ธ์ด ๋ก์ปฌ์์ ์๋ํ์ง๋ง ALB ๋ค์์ ์คํจํฉ๋๋ค | public_url์ด ์ค์ ๋์ง ์์ IdP๊ฐ ๋ด๋ถ http:// ์๋ณธ์ redirect_uri๋ก ๋ฐ์ต๋๋ค |
listen.public_url์ ์ธ๋ถ https:// ์๋ณธ์ผ๋ก ์ค์ ํ์ธ์ |
| ๊ฐ๋ฐ์๊ฐ ์ ๋ขฐ ํ๋กฌํํธ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ด ๋๋ค | TLS ์ธ์ฆ์๊ฐ ๋ณต์ ๋ณธ๋ณ ๋๋ ์์ฒญ๋ณ๋ก ํ์ ํฉ๋๋ค | ingress์์ ์์ ์ ์ธ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ TLS๋ฅผ ํ ๋ฒ ์ข ๋ฃํ๊ณ ๋ด๋ถ์ ์ผ๋ก ์ผ๋ฐ HTTP๋ฅผ ํตํด ๋ณต์ ๋ณธ์ ์คํํ์ธ์ |
CLI /login: "Could not verify the gateway's TLS certificate" ๋๋ SELF_SIGNED_CERT_IN_CHAIN |
๊ฒ์ดํธ์จ์ด์ TLS ์ฒด์ธ์ด CLI ํธ์คํธ์ ์ ๋ขฐ ์ ์ฅ์์ ์๋ ํ๋ผ์ด๋น CA๋ก ์๋ช ๋ฉ๋๋ค | Claude Code๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ ๋ฐ Node 22.15 ์ด์์์ OS ์ ๋ขฐ ์ ์ฅ์๋ฅผ ์ฝ์ต๋๋ค. CLAUDE_CODE_CERT_STORE๋ ์ด ๋์์ ์ ์ดํฉ๋๋ค. CA๊ฐ OS ์ ๋ขฐ ์ ์ฅ์์ ์ค์น๋๋ฉด ๊ฐ๋ฐ์๊ฐ ํ์ฌ ๋ฐํ์์ ์๋์ง ํ์ธํ์ธ์. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ ์ ์ NODE_EXTRA_CA_CERTS๋ฅผ CA ์ธ์ฆ์ PEM์ผ๋ก ์ค์ ํ์ธ์. ์ฒซ ์ฐ๊ฒฐ ์ง๋ฌธ ํ๋กฌํํธ๋ ์ฌ์ ํ ์ ์ฉ๋ฉ๋๋ค. |
๊ด๋ จ
- Claude ์ฑ ๊ฒ์ดํธ์จ์ด ๊ฐ์: ๋น ๋ฅธ ์์ ๋ฐ ๊ฐ๋ฐ์ ์ฐ๊ฒฐ
- ๊ตฌ์ฑ ์ฐธ์กฐ: ๋ชจ๋
gateway.yaml์ต์