Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.20] 3๋ถ€ ๋ณด์•ˆ ๋ฐ ์ธ์ฆ #4 | JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ ์šฉํ•˜๊ธฐ: OAuth & OIDC ์—ฐ๋™ ๊ฐ€์ด๋“œ

ygtoken 2025. 3. 18. 11:42
728x90

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” 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 ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ณ , ์‚ฌ์šฉ์ž ๊ถŒํ•œ์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
728x90