๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ Istio์์ JWT(JSON Web Token)๋ฅผ ํ์ฉํ ์ธ์ฆ ์ ์ฉ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
JWT๋ OAuth 2.0 ๋ฐ OIDC(OpenID Connect) ๊ธฐ๋ฐ์ ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ผ๋ก,
Istio์์๋ ์ด๋ฅผ ํ์ฉํ์ฌ API ์์ฒญ์ ์์ ํ๊ฒ ๋ณดํธํ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ JWT ์ธ์ฆ ๊ฐ๋
, Istio์์ JWT ์ ์ฉ ๋ฐฉ๋ฒ,
๊ทธ๋ฆฌ๊ณ OAuth 2.0 ๋ฐ OIDC ์ฐ๋์ ํตํ ๋ณด์ ๊ฐํ๋ฅผ ๋ค๋ฃฐ ์์ ์
๋๋ค.
๐น 1. JWT ์ธ์ฆ์ด๋?
โ 1.1 JWT(JSON Web Token) ๊ฐ๋
**JWT(JSON Web Token)**์ ์ฌ์ฉ์์ ์ ์์ ์ฆ๋ช
ํ๋ ๋ณด์ ํ ํฐ์
๋๋ค.
JWT๋ Base64๋ก ์ธ์ฝ๋ฉ๋ 3๊ฐ์ ๋ถ๋ถ(ํค๋, ํ์ด๋ก๋, ์๋ช
)์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ,
์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ํ ๋ฐ ๊ถํ์ ์ธ์ฆํ๋ ๋ฐ ํ์ฉ๋ฉ๋๋ค.
JWT์ ์ฃผ์ ํน์ง
- ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ผ๋ก ์ธ์ ๊ด๋ฆฌ๊ฐ ํ์ ์์
- ๋ฐ๊ธ๋ ํ ํฐ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๊ดํ๊ณ API ์์ฒญ ์ ํฌํจ
- ํ ํฐ์ด ์๋ณ์กฐ๋์ง ์์๋์ง ๊ฒ์ฆ ๊ฐ๋ฅ
๐ก JWT๋ OAuth 2.0 ๋ฐ OIDC์์ ํ์ค ์ธ์ฆ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
โ 1.2 OAuth 2.0 ๋ฐ OIDC ๊ฐ์
**OAuth 2.0(Open Authorization)**์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ๊ถํ์ ๋ถ์ฌํ๋ ์ธ์ฆ ํ๋กํ ์ฝ์
๋๋ค.
OIDC(OpenID Connect)๋ OAuth 2.0์ ํ์ฅํ์ฌ ์ฌ์ฉ์ ์ธ์ฆ(Authentication)๊น์ง ์ง์ํ๋ ํ์ค์
๋๋ค.
OAuth 2.0 ๋ฐ OIDC์ ์ฐจ์ด์
ํ๋กํ ์ฝ | ์ญํ |
OAuth 2.0 | API ์ ๊ทผ ๊ถํ์ ์ ์ด (Access Token ๋ฐ๊ธ) |
OIDC(OpenID Connect) | OAuth 2.0 ๊ธฐ๋ฐ ์ฌ์ฉ์ ์ธ์ฆ (ID Token ๋ฐ๊ธ) |
๐น 2. Istio์์ JWT ์ธ์ฆ ์ ์ฉ
โ 2.1 Istio์์ JWT ๊ธฐ๋ฐ ์ธ์ฆ์ ํ์ฑํํ๋ ๋ฐฉ๋ฒ
Istio์์๋ AuthorizationPolicy๋ฅผ ํ์ฉํ์ฌ ํน์ API ์๋ํฌ์ธํธ์ JWT ์ธ์ฆ์ ์ ์ฉํ ์ ์์ต๋๋ค.
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: jwt-auth
namespace: default
spec:
selector:
matchLabels:
app: my-service # JWT ์ธ์ฆ์ ์ ์ฉํ ์๋น์ค
jwtRules:
- issuer: "https://auth.example.com" # ํ ํฐ ๋ฐ๊ธ์ (OAuth 2.0 ์ธ์ฆ ์๋ฒ)
jwksUri: "https://auth.example.com/.well-known/jwks.json" # JWT ๊ณต๊ฐ ํค ์์น
์ค๋ช :
- issuer: "https://auth.example.com" → JWT๋ฅผ ๋ฐ๊ธํ ์ธ์ฆ ์๋ฒ
- jwksUri: "https://auth.example.com/.well-known/jwks.json" → JWT ์๋ช ์ ๊ฒ์ฆํ ๊ณต๊ฐ ํค
- selector.matchLabels.app: my-service → JWT ์ธ์ฆ์ ์ ์ฉํ ์๋น์ค ์ ํ
๐ก Istio๋ JWT๋ฅผ ์๋์ผ๋ก ๊ฒ์ฆํ๋ฉฐ, ์ ํจํ์ง ์์ ํ ํฐ์ ์์ฒญ์ ์ฐจ๋จํฉ๋๋ค.
โ 2.2 AuthorizationPolicy๋ฅผ ํ์ฉํ JWT ์ธ์ฆ ๊ฐํ
์๋ ์์ ๋ JWT๊ฐ ์ ํจํ ์ฌ์ฉ์๋ง ํน์ API์ ์ ๊ทผํ ์ ์๋๋ก ์ค์ ํ๋ ์ ์ฑ ์ ๋๋ค.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: require-jwt
namespace: default
spec:
action: ALLOW
rules:
- from:
- source:
requestPrincipals: ["https://auth.example.com/*"] # JWT ๋ฐ๊ธ์ ๊ธฐ๋ฐ ์ธ์ฆ
to:
- operation:
paths: ["/secure-api"] # "/secure-api" ๊ฒฝ๋ก๋ง ๋ณดํธ
์ค๋ช :
- requestPrincipals: ["https://auth.example.com/*"] → JWT ๋ฐ๊ธ์ ๊ธฐ๋ฐ ์ธ์ฆ ์ ์ฉ
- operation.paths: ["/secure-api"] → ํน์ API ๊ฒฝ๋ก ๋ณดํธ
๐ก ์ด ์ค์ ์ ์ ์ฉํ๋ฉด, ์ ํจํ JWT๋ฅผ ๋ณด์ ํ ์ฌ์ฉ์๋ง /secure-api ์๋ํฌ์ธํธ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
๐น 3. OAuth 2.0 ๋ฐ OIDC ์ฐ๋ ๋ฐฉ๋ฒ
โ 3.1 OAuth 2.0 Access Token์ ์ด์ฉํ API ์ธ์ฆ
OAuth 2.0์ ํ์ฉํ์ฌ API ์์ฒญ ์ Access Token์ ์ ๋ฌํ๋ ๋ฐฉ์์ ๋๋ค.
โ ํด๋ผ์ด์ธํธ์์ OAuth 2.0 ์ธ์ฆ ์๋ฒ์ ๋ก๊ทธ์ธ ์์ฒญ
curl -X POST https://auth.example.com/oauth/token \
-d "client_id=my-client" \
-d "client_secret=my-secret" \
-d "grant_type=password" \
-d "username=user@example.com" \
-d "password=my-password"
โก Access Token์ ์ฌ์ฉํ์ฌ API ์์ฒญ
curl -H "Authorization: Bearer " https://api.example.com/secure-api
๐ก Access Token์ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ๋ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์งํ๋ฉด์ API ์์ฒญ์ ์ธ์ฆํ ์ ์์ต๋๋ค.
โ 3.2 OIDC(OpenID Connect) ๊ธฐ๋ฐ ์ฌ์ฉ์ ์ธ์ฆ ์ ์ฉ
OIDC๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ID Token์ ๋ฐ๊ธ๋ฐ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก API ์์ฒญ์ ์ธ์ฆํ ์ ์์ต๋๋ค.
โ ID Token์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ํ ๋ก๊ทธ์ธ ์์ฒญ
curl -X POST https://auth.example.com/oauth/token \
-d "client_id=my-client" \
-d "client_secret=my-secret" \
-d "grant_type=authorization_code" \
-d "code=AUTHORIZATION_CODE" \
-d "redirect_uri=https://my-app.com/callback"
โก ID Token์ ์ฌ์ฉํ์ฌ API ์์ฒญ
curl -H "Authorization: Bearer " https://api.example.com/user-info
๐ก OIDC์ ID Token์ ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ๋ฉฐ, ๋ก๊ทธ์ธ ํ ์ถ๊ฐ์ ์ธ API ์ ๊ทผ์ ์ ์ดํ ์ ์์ต๋๋ค.
๐น 4. JWT ์ธ์ฆ ์ ์ฉ ํ ํ์ธ ๋ฐฉ๋ฒ
โ 4.1 JWT ์ธ์ฆ ์ ์ฉ ํ์ธ
ํ์ฌ ์ ์ฉ๋ JWT ์ธ์ฆ ์ ์ฑ ์ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl get requestauthentication -n default
โ 4.2 JWT ํ ํฐ ๊ฒ์ฆ ํ ์คํธ
JWT๋ฅผ ํฌํจํ์ฌ API ์์ฒญ์ ํ ์คํธํฉ๋๋ค.
curl -H "Authorization: Bearer " https://api.example.com/secure-api
๐ก ์ ํจํ JWT๊ฐ ํฌํจ๋์ง ์์ผ๋ฉด 401 Unauthorized ์๋ต์ด ๋ฐํ๋ฉ๋๋ค.
๐ ๊ฒฐ๋ก
- JWT(JSON Web Token)๋ OAuth 2.0 ๋ฐ OIDC ๊ธฐ๋ฐ์ ํ์ค ์ธ์ฆ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- Istio์์๋ RequestAuthentication ๋ฐ AuthorizationPolicy๋ฅผ ํ์ฉํ์ฌ JWT ๊ธฐ๋ฐ ์ธ์ฆ์ ์ ์ฉํ ์ ์์ต๋๋ค.
- OAuth 2.0์ ํ์ฉํ๋ฉด API ์ ๊ทผ์ ์ ์ดํ ์ ์์ผ๋ฉฐ, ID Token(OIDC)์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ธ์ฆ์ ๊ฐํํ ์ ์์ต๋๋ค.
- JWT ๊ธฐ๋ฐ ์ธ์ฆ์ ์ ์ฉํ๋ฉด API ๋ณด์์ ๊ฐํํ๊ณ , ์ฌ์ฉ์ ๊ถํ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.