Skip to content

Commit

Permalink
포스팅 임시 저장
Browse files Browse the repository at this point in the history
  • Loading branch information
mainmethod0126 committed Jan 8, 2025
1 parent 663aa73 commit 3069f9e
Showing 1 changed file with 134 additions and 1 deletion.
135 changes: 134 additions & 1 deletion pages/msa/add-jwt-verification-proxy-to-istio.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,140 @@ spec:
image: example-app:latest
```
### jwkUri 로 부터 keyset 을 가져왔는지 확인하는 방법
## jwt 검증을 위한 jwks 지정
### jwk 란?
`JWK`는 공개 키 또는 비밀 키를 JSON 형식으로 표현한 데이터 구조이며 [RFC 7517](https://datatracker.ietf.org/doc/html/rfc7517) 표준이다

```json filename="jwk.json"
{
"kty": "RSA",
"use": "sig",
"kid": "12345",
"alg": "RS256",
"n": "0vx7agoebGcQSuuPiLJXZptN29WJna...",
"e": "AQAB"
}
```

### 공통 속성 (모든 kty에 해당)

| **속성 이름** | **필수 여부** | **설명** | **예시 값** |
|---------------|---------------|------------------------------------------------------------------------------------------------------------|-----------------------------------|
| **`kty`** | 필수 | 키의 유형(Key Type). RSA, EC, oct(대칭 키) 등을 지정. | `"RSA"`, `"EC"`, `"oct"` |
| **`use`** | 선택 | 키의 용도(Key Usage). `sig`(서명), `enc`(암호화) 중 하나. | `"sig"`, `"enc"` |
| **`key_ops`** | 선택 | 키가 지원하는 작업(Key Operations). 예: `sign`, `verify`, `encrypt`, `decrypt`. | `["sign", "verify"]` |
| **`alg`** | 선택 | 키가 사용하는 알고리즘. JWT 헤더의 `alg`와 일치해야 함. | `"RS256"`, `"ES256"`, `"HS256"` |
| **`kid`** | 선택 | 키 식별자(Key ID). 여러 키 중 특정 키를 식별하기 위한 고유 값. | `"rsa-key-id"` |
| **`x5u`** | 선택 | X.509 인증서를 포함한 URI. 인증서를 외부에서 참조할 수 있음. | `"https://example.com/cert.pem"` |
| **`x5c`** | 선택 | X.509 인증서 체인. Base64url로 인코딩된 값 배열. | `["MIIC..."]` |
| **`x5t`** | 선택 | X.509 인증서의 SHA-1 해시 값. | `"Fv_...123"` |
| **`x5t#S256`**| 선택 | X.509 인증서의 SHA-256 해시 값. | `"Vv_...456"` |


### RSA 키 (kty: RSA)

| **속성 이름** | **필수 여부** | **설명** | **예시 값** |
|---------------|---------------|------------------------------------------------------------------------------------------------------------|-----------------------------------|
| **`n`** | 필수 | RSA 키의 모듈러스(Modulus). Base64url로 인코딩된 매우 큰 정수 값. | `"0vx7...9WJna"` |
| **`e`** | 필수 | RSA 키의 공개 지수(Exponent). 일반적으로 `65537`이며 Base64url로 인코딩됨. | `"AQAB"` |
| **`d`** | 선택 | RSA 키의 개인 지수(Private Exponent). Base64url로 인코딩됨. | `"Eq5x...Gn3o"` |
| **`p`** | 선택 | RSA 키 생성 시 사용된 첫 번째 소수(Prime 1). Base64url로 인코딩됨. | `"1Auv..."` |
| **`q`** | 선택 | RSA 키 생성 시 사용된 두 번째 소수(Prime 2). Base64url로 인코딩됨. | `"4B6V..."` |
| **`dp`** | 선택 | CRT 최적화 값: \( dp = d \mod (p-1) \). | `"BwKf..."` |
| **`dq`** | 선택 | CRT 최적화 값: \( dq = d \mod (q-1) \). | `"h3wS..."` |
| **`qi`** | 선택 | CRT 계수: \( qi = q^{-1} \mod p \). | `"H9lK..."` |

### 타원 곡선 키 (Elliptic curve, kty: EC)
| **속성 이름** | **필수 여부** | **설명** | **예시 값** |
|---------------|---------------|------------------------------------------------------------------------------------------------------------|-----------------------------------|
| **`crv`** | 필수 | 타원 곡선의 이름. 예: `P-256`, `P-384`, `P-521`. | `"P-256"` |
| **`x`** | 필수 | 타원 곡선의 공개 키 X 좌표. Base64url로 인코딩됨. | `"f83O...xF4F"` |
| **`y`** | 필수 | 타원 곡선의 공개 키 Y 좌표. Base64url로 인코딩됨. | `"x_FE...VVjX"` |
| **`d`** | 선택 | 타원 곡선의 개인 키(Private Key). Base64url로 인코딩됨. | `"Gawgg...WKav7"` |

### 대칭 키 (kty: oct)
| **속성 이름** | **필수 여부** | **설명** | **예시 값** |
|---------------|---------------|------------------------------------------------------------------------------------------------------------|-----------------------------------|
| **`k`** | 필수 | 대칭 키 값. Base64url로 인코딩된 값. | `"Gawgg...WKav7"` |







### jwks 란?

`JWK`는 단일 키를 나타내며, 여러 키를 포함하는 경우는 **JSON Web Key Set (JWKS)**를 사용한다

[RFC 7517](https://datatracker.ietf.org/doc/html/rfc7517) 에서 Section 5 - JWK Set Format 을 참고하며되며

```json filename="jwks.json"
{
"keys": [
{
"kty": "RSA",
"use": "sig",
"kid": "12345",
"alg": "RS256",
"n": "0vx7agoebGcQSuuPiLJXZptN29WJna...",
"e": "AQAB"
},
{
"kty": "EC",
"use": "sig",
"kid": "67890",
"alg": "ES256",
"crv": "P-256",
"x": "f83OJ3D2xF4F2JfSJwsFrLWLOHkXtw...",
"y": "x_FEzRu9VVjX9JHgBVMwD1tE44D07..."
}
]
}
```

### jwks(키셋) 얻어오는 방법

`RequestAuthentication.spec.jwtRules` 에 공개키셋을 얻어올 수 있는 uri 를 지정하면 된다
이때 얻어오는 jwks.json 또는 json body는 꼭 jwks 표준 형식을 지켜야한다

#### .json 파일을 통하여 keyset을 획득하는 방식

```yaml filename="RequestAuthenticationSample"
apiVersion: security.istio.io/v1
kind: RequestAuthentication
metadata:
name: httpbin
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
jwtRules:
- issuer: "issuer-foo"
jwksUri: https://example.com/.well-known/jwks.json
```

#### json body를 반환하는 api를 통하여 keyset을 획득하는 방식

```yaml filename="RequestAuthenticationSample"
apiVersion: security.istio.io/v1
kind: RequestAuthentication
metadata:
name: httpbin
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
jwtRules:
- issuer: "issuer-foo"
jwksUri: https://example.com/api/jwks
```

### jwksUri 로 부터 keyset 을 성공적으로 가져왔는지 확인하는 방법

#### Istio Control Plane (istiod) 로그 확인

Expand Down

0 comments on commit 3069f9e

Please sign in to comment.