Skip to content

Commit

Permalink
Update web/jwt
Browse files Browse the repository at this point in the history
- jwt의 ꡬ성 μš”μ†Œ, 유의 사항, 절차 등에 λŒ€ν•œ μ„ΈλΆ€ μ„€λͺ… μΆ”κ°€
  • Loading branch information
hyh1016 committed Apr 3, 2024
1 parent 0a22156 commit 6ae9d8f
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 29 deletions.
Binary file added web/images/jwt-flow.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
111 changes: 82 additions & 29 deletions web/jwt.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# JWT

## λ“±μž₯ 계기
## JWT(JSON Web Token)

### λ“±μž₯ 계기

κΈ°μ‘΄μ—λŠ” [**μΏ ν‚€-μ„Έμ…˜ 방식**](cookie-session.md)을 톡해 μ‚¬μš©μž 인증을 μˆ˜ν–‰ν•˜μ˜€λ‹€. 이 방법은 μ„œλ²„κ°€ μ‚¬μš©μžλ₯Ό μ‹λ³„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©μžμ˜ 정보λ₯Ό μ„œλ²„μ— μ €μž₯ν•˜κ³  μžˆμ–΄μ•Ό ν–ˆκ³ , μ΄λŠ” λ‹€μŒμ˜ 문제λ₯Ό λ°œμƒμ‹œμΌ°λ‹€.

Expand All @@ -9,46 +11,97 @@

λ”°λΌμ„œ Stateful λ°©μ‹μœΌλ‘œ μ‚¬μš©μž 정보λ₯Ό κ΄€λ¦¬ν•˜λŠ” 것에 어렀움을 느끼게 λ˜μ—ˆκ³ , 이에 λŒ€ν•œ λŒ€μ•ˆμœΌλ‘œ λ“±μž₯ν•œ Stateless λ°©μ‹μ˜ 인증 기법이 λ°”λ‘œ **Token을 μ΄μš©ν•œ 인증 기법**이닀.

## JWT(JSON Web Token)
### μ •μ˜

토큰 μ€‘μ—μ„œλ„ JSON ν˜•μ‹μ˜ 데이터λ₯Ό μ΄μš©ν•˜λŠ” 토큰
- JSON ν˜•μ‹μ˜ 데이터λ₯Ό μ΄μš©ν•˜λŠ” 토큰
- jwt λŠ” 검증 κ°€λŠ₯ν•œ(can be verified) 데이터 톡신을 μœ„ν•œ 것
- **주의. μ•”ν˜Έν™”λœ 데이터 톡신을 μœ„ν•œ 것이 μ•„λ‹˜!!!**
- λ‚΄λΆ€μ˜ λ°μ΄ν„°λŠ” **λˆ„κ΅¬λ‚˜ λ³Ό 수 있음** ν•˜μ§€λ§Œ λ³€μ‘°λŠ” λΆˆκ°€λŠ₯
- SIGNATURE 뢀뢄은 헀더, νŽ˜μ΄λ‘œλ“œλ₯Ό 기반으둜 secret key(HMAC) λ˜λŠ” public/private key pair(RSA/ECDSA)λ₯Ό μ‚¬μš©ν•œ μ•Œκ³ λ¦¬μ¦˜μ„ 톡해 계산됨
- λ”°λΌμ„œ, SIGNATURE 뢀뢄이 λ³€κ²½λ˜λ©΄ μœ νš¨ν•˜μ§€ μ•Šμ€ κ²ƒμœΌλ‘œ νŒλ‹¨
- header, bodyκ°€ λ³€μ‘°λ˜μ—ˆκ±°λ‚˜ 이듀을 μ•”ν˜Έν™”ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ λ˜λŠ” key 값이 λ³€μ‘°λ˜μ—ˆκ±°λ‚˜μž„
- header, bodyκ°€ κ°™κ³  μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜κ³Ό key κ°’ λͺ¨λ‘ κ°™μ•„μ•Ό signatureκ°€ κ°™κΈ° λ•Œλ¬Έ

## JWT Format
### ꡬ쑰

JWTλŠ” 3개의 μš”μ†ŒμΈ `Header`, `Payload`, `Signature`둜 κ΅¬μ„±λœλ‹€.
```java
header.payload.signature
```

각 μš”μ†ŒλŠ” λ¬Έμžμ—΄λ‘œ μΈμ½”λ”©λ˜λ©°, λ””μ½”λ”©ν•˜λ©΄ JSON ν˜•νƒœμ˜ 데이터λ₯Ό 얻을 수 μžˆλ‹€.
- 3가지 ꡬ역은 각각에 ν•΄λ‹Ήν•˜λŠ” json 데이터λ₯Ό BASE64둜 μΈμ½”λ”©ν•œ 것
- 각 json의 킀값은 compactν•˜κ²Œ ν‘œν˜„ν•˜λŠ” 것을 ꢌμž₯함

* **Header**
* ν—€λ”λŠ” typ, alg둜 κ΅¬μ„±λœλ‹€.
* typ: ν† ν°μ˜ νƒ€μž…μ„ 지정 (ex: JWT)
* alg: μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜μ„ 지정 (ex: SHA256)
* **Payload**
* νŽ˜μ΄λ‘œλ“œλŠ” ν•΄λ‹Ή 토큰을 톡해 μ–»κ³ μž ν•˜λŠ” μ •λ³΄λ“€λ‘œ κ΅¬μ„±λœλ‹€.
* μ΄λŠ” ν΄λ ˆμž„(Claim)이라고 λΆ€λ₯Έλ‹€.
* **Signature**
* 토큰을 μΈμ½”λ”©ν•˜κ±°λ‚˜ μœ νš¨μ„±μ„ 검증할 λ•Œ μ‚¬μš©ν•˜λŠ” 고유 μ•”ν˜Έν™” μ½”λ“œ
* λ‹€μŒκ³Ό 같은 μˆœμ„œλ₯Ό 톡해 μƒμ„±λœλ‹€.
1. 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό 각각 BASE64둜 인코딩
2. 1번의 결과값을 λΉ„λ°€ ν‚€λ₯Ό 톡해 ν—€λ”μ—μ„œ μ •μ˜ν•œ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ ν•΄μ‹±
3. 2번의 결과값을 λ‹€μ‹œ BASE64둜 인코딩
1. **Header**

## μ‚¬μš©λ²•
```java
{
"alg": "HS256",
"typ": "JWT"
}
```

μƒμ„±λœ 토큰은 λ¬Έμžμ—΄ ν˜•νƒœλ₯Ό 가지며, μ΄λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ 둜컬 μŠ€ν† λ¦¬μ§€μ— μ €μž₯λ˜μ–΄ μ„œλ²„μ—κ²Œ 인증이 ν•„μš”ν•œ APIλ₯Ό μš”μ²­ν•  λ•Œ μ „μ†‘λ˜μ–΄μ•Ό ν•œλ‹€.
- sign κ³Όμ •μ—μ„œ μ‚¬μš©λœ μ•Œκ³ λ¦¬μ¦˜ (HS256, RSA256 등등…)
- ν† ν°μ˜ νƒ€μž… (JWT)

이λ₯Ό μœ„ν•΄ 토큰은 헀더에 μ‹€μœΌλ©°, λ‹€μŒκ³Ό 같은 ν˜•μ‹μœΌλ‘œ μ „μ†‘λœλ‹€.
2. **Payload**

```java
{
"Authorization": "Bearer {token value}"
exp: 1712120600083,
id: 12873,
name: "alice"
}
```

## 인증 흐름
- Claim을 ν¬ν•¨ν•œ 데이터
- Claimμ΄λž€? ν•΄λ‹Ή 데이터에 λŒ€ν•œ λΆ€κ°€ μ„€λͺ…
- **`registered`**
- λ°œν–‰μž, λ§Œλ£Œμ‹œκ°„, subject, audience λ“±
- https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
- **`public`**
- jwtλ₯Ό μ‚¬μš©ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λΆ€κ°€ 정보듀
- https://www.iana.org/assignments/jwt/jwt.xhtml
- registered κ³Ό μ€‘λ³΅λ˜λŠ” 것듀 있음. μœ„μ— μžˆλŠ” λͺ…μ„Έ 데이터듀이 public claim 에 ν•΄λ‹Ή
- **`private`**
- registered, public 에 ν•΄λ‹Ήν•˜μ§€ μ•ŠλŠ” μ»€μŠ€ν…€ 데이터
- μœ„ λ°μ΄ν„°μ˜ id, name 같은 κ°’

3. **Signature**

```json
HMACSHA256(
base64UrlEncoded(header) + "." + base64UrlEncoded(payload),
secret key
)
```

```json
RSASHA256(
base64UrlEncoded(header) + "." + base64UrlEncoded(payload),
public key,
private key
)
```

- ν•΄λ‹Ή JWT에 λŒ€ν•œ μ„œλͺ…. 토큰이 λ³€μ‘°λ˜μ§€ μ•Šμ•˜μŒμ„ 보μž₯ν•˜κΈ° μœ„ν•΄ 쑴재
- 미리 μ•½μ†λœ ν‚€λ₯Ό 톡해 κ²€μ¦ν•¨μœΌλ‘œμ¨ 이 토큰이 μ•Œλ§žμ€ μ‚¬λžŒμ—κ²Œμ„œ λ°œν–‰λ˜μ—ˆμŒλ„ 검증 κ°€λŠ₯
- μΈμ½”λ”©λœ 헀더, νŽ˜μ΄λ‘œλ“œ κ°’, 킀값을 기반으둜 μ•”ν˜Έν™”λœ 데이터

## 유의 사항

- **λ³΄μ•ˆ μœ„ν—˜μ΄ μžˆλŠ” λ°μ΄ν„°λŠ” λ„£μœΌλ©΄ μ•ˆ 됨. λ‹¨μˆœ μΈμ½”λ”©λœ λ¬Έμžμ—΄μ΄λ―€λ‘œ λˆ„κ΅¬λ“  λ‚΄λΆ€ 데이터λ₯Ό 확인할 수 있음**
- λ³€μ‘°λ₯Ό λ°©μ§€ν•œλ‹€μ§€ 데이터λ₯Ό μ€λ‹‰ν•˜λŠ” κΈ°λŠ₯은 μ—†μŒ
- 보톡 Authorization 헀더에 λ‹΄μ•„ λ³΄λ‚΄λŠ” ν˜•μ‹μ„ μ‚¬μš©. 헀더 μ‚¬μ΄μ¦ˆκ°€ λ„ˆλ¬΄ 크면 μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜λŠ” μ„œλ²„λ“€μ΄ 생겨 jwt 토큰 μ‚¬μ΄μ¦ˆλŠ” μ΅œλŒ€ν•œ μž‘κ²Œ λ§Œλ“œλŠ” 것을 ꢌμž₯함
- 헀더 크기가 8KBκ°€ λ„˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것이 μ’‹λ‹€κ³  함

## λ°œκΈ‰ 및 μ‚¬μš© 절차

![JWT λ°œκΈ‰ 및 μ‚¬μš© 절차](./images/jwt-flow.png)

1. ν΄λΌμ΄μ–ΈνŠΈκ°€ 인증 μ„œλ²„μ— 인증 μš”μ²­μ„ ν•œλ‹€.
2. 인증 μ ˆμ°¨μ— ν†΅κ³Όν•˜λ©΄, 인증 μ„œλ²„λŠ” μ•‘μ„ΈμŠ€ 토큰을 λ°˜ν™˜ν•œλ‹€.
3. ν΄λΌμ΄μ–ΈνŠΈλŠ” 토큰과 ν•¨κ»˜ λ¦¬μ†ŒμŠ€ μ„œλ²„μ˜ 보호 μžμ›μ— μ ‘κ·Όν•œλ‹€.

## 좜처

1. μ‚¬μš©μžκ°€ 아이디/λΉ„λ°€λ²ˆν˜Έλ₯Ό 톡해 λ‘œκ·ΈμΈμ„ μ‹œλ„
2. μ„œλ²„λŠ” ν•΄λ‹Ή 정보가 λ§žλ‹€λ©΄ 토큰을 λ°œκΈ‰
3. ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €)λŠ” 토큰을 둜컬 μŠ€ν† λ¦¬μ§€μ— μ €μž₯ν•΄ λ‘” λ’€ μ„œλ²„μ— μš”μ²­μ„ 보낼 λ•Œλ§ˆλ‹€ ν•΄λ‹Ή 토큰을 헀더에 μ‹€μ–΄ 보냄
4. μ„œλ²„λŠ” 토큰을 κ²€μ¦ν•˜κ³ , μœ νš¨ν•œ 토큰이라면 μš”μ²­μ— 응닡
* 주둜 μœ νš¨ν•˜μ§€ μ•Šμ€ ν† ν°μ΄κ±°λ‚˜ 토큰이 μ—†λ‹€λ©΄ `401 Unauthorized`둜 응닡
[JWT.IO - JSON Web Tokens Introduction](https://jwt.io/introduction)

0 comments on commit 6ae9d8f

Please sign in to comment.