가상 머신에서 JWT로 API 게이트웨이 요청 검증
가상 머신에서 JWT로 API 게이트웨이 요청 검증
가상 머신(VM)에서 JSON Web Token(JWT)을 사용하여 API 게이트웨이에 대한 요청을 검증하는 방법을 설명해 드릴게요. JWTProvider부터 리스너 기본값/재정의, HTTP 라우트 필터까지 설정해 볼게요.
출처: 문서
본문
이 문서는 가상 머신(VM)에서 JSON Web Token(JWT)을 사용하여 API 게이트웨이에 대한 요청을 검증하는 방법을 설명해요. 서비스가 Kubernetes 오케스트레이션 컨테이너에 배포된 경우 Kubernetes에서 JWT로 API 게이트웨이 요청 검증을 참고해 주세요.
엔터프라이즈
이 기능은 Consul Enterprise에서 사용할 수 있어요.
개요
API 게이트웨이를 구성하여 JWT로 들어오는 요청을 검증함으로써 검증되지 않은 트래픽을 게이트웨이에서 차단할 수 있어요. JWT 검증을 서로 다른 수준에서 구성할 수 있어요:
- 리스너 기본값: 리스너에 연결된 모든 라우트에 적용되는 기본 기본값을 정의해요.
- HTTP 라우트별 설정: 특정 HTTP 라우트에 대한 JWT 인증 설정을 정의할 수 있어요. 라우트별 JWT 설정은 기본 구성을 재정의해요.
- 리스너 재정의: 기본 및 라우트별 구성보다 우선하는 재정의 설정을 정의해요. 이를 통해 리스너에 대해 적용 가능한 정책을 설정할 수 있어요.
JWT로 요청을 검증하려면 다음 단계를 완료해 주세요:
-
게이트웨이에 대한 요청을 검증하는 데 사용되는 JWT provider와 claims를 지정하는 JWTProvider를 정의해요.
-
API 게이트웨이 구성 엔트리에서 리스너에 대한 기본 및 재정의 설정을 구성해요.
-
HTTP 라우트 구성 엔트리에서 필터로 라우트별 JWT 검증 설정을 정의해요.
-
JWT를 사용하여 요청 검증을 시작하도록 구성 엔트리를 Consul에 기록해요.
요구 사항
- Consul 1.17 이상
- JWT 세부 정보(claims 및 provider 등)
JWTProvider 정의
claims를 검증할 JWT provider를 정의하는 JWTProvider 구성 엔트리를 만들어 주세요. 다음 예시에서 JWTProvider CRD는 로컬 JWKS를 포함해요. 프로덕션 환경에서는 프로덕션 등급의 JWKS 엔드포인트를 대신 사용해 주세요.
jwt-provider.hcl
Kind = "jwt-provider"
Name = "local"
Issuer = "local"
JSONWebKeySet = {
Local = {
JWKS="<JWKS-Key>"
}
}
이 CRD에서 구성할 수 있는 필드에 대한 자세한 내용은 JWTProvider 구성 참조를 참고해 주세요.
기본 및 재정의 설정 구성
API 게이트웨이 구성 엔트리에서 JWT 검증에 대한 기본 및 재정의 설정을 정의해 주세요.
-
JWT 검증을 적용하려는 리스너에
default.JWT블록을 추가해 주세요. Consul은 이 구성을 리스너에 연결된 라우트에 적용해요. 자세한 내용은 Listeners.default.JWT 구성 참조를 참고해 주세요. -
JWT 검증 정책을 적용하려는 리스너에
override.JWT블록을 추가해 주세요. Consul은default또는 라우트별 설정과 무관하게 이 구성을 리스너에 연결된 모든 라우트에 적용해요. 자세한 내용은 Listeners.override.JWT 구성 참조를 참고해 주세요. -
API 게이트웨이 구성 엔트리에서 설정을 적용해 주세요. /config API 엔드포인트 또는 consul config write 명령을 사용할 수 있어요.
다음 예시는 리스너를 통해 들어오는 모든 요청이 다음 조건을 충족해야 하도록 Gateway를 구성해요:
- 요청이
localprovider에 의해 서명되어야 함 - 리스너에 연결된 HTTPRoute가 재정의하지 않는 한 요청에 값이
user인roleclaim이 있어야 함
gateway.hcl
Kind = "api-gateway"
Name = "api-gateway"
Listeners = [
{
Name = "listener-one"
Port = 9001
Protocol = "http"
Override = {
JWT = {
Providers = [
{
Name = "local"
}
]
}
}
default = {
JWT = {
Providers = [
{
Name = "local"
VerifyClaims = [
{
Path = ["role"]
Value = "pet"
}
]
}
]
}
}
}
]
특정 HTTP 라우트에 대한 검증 구성
HTTP 라우트 구성 엔트리에서 라우트별 JWT 검증 설정을 활성화하려면 필터를 정의해 주세요.
-
rules.filter블록에JWT구성을 추가해 주세요. API 게이트웨이 구성 엔트리에서 기본 설정과 겹치는 라우트별 구성이 우선해요. 리스너 재정의 설정에 정의된 구성이 가장 높은 우선순위를 가져요. -
API 게이트웨이 구성 엔트리에서 설정을 적용해 주세요. /config API 엔드포인트 또는 consul config write 명령을 사용할 수 있어요.
다음 예시는 api-gateway-fqdn:3002/admin에 대한 모든 요청이 다음 조건을 충족해야 하도록 HTTPRoute를 구성해요:
- 요청이
localprovider에 의해 서명되어야 함 - 요청에
roleclaim이 있어야 함 - claim의 값이
admin이어야 함
다른 모든 요청은 Gateway 리스너에 정의된 대로 local provider에 의해 서명되고 값이 user인 role claim이 있어야 해요.
http-route.hcl
Kind = "http-route"
Name = "api-gateway-route"
Parents = [
{
SectionName = "listener-one"
Name = "api-gateway"
Kind = "api-gateway"
},
]
Rules = [
{
Matches = [
{
Path = {
Match = "prefix"
Value = "/admin"
}
}
]
Filters = {
JWT = {
Providers = [
{
Name = "local"
VerifyClaims = [
{
Path = ["role"]
Value = "admin"
}
]
}
]
}
}
Services = [
{
Name = "admin-service"
}
]
},
{
Matches = [
{
Path = {
Match = "prefix"
Value = "/"
}
}
]
Services = [
{
Name = "user-service"
}
]
},
]