Skip to content

Commit

Permalink
🌐 Add Korean translation for `docs/ko/docs/tutorial/security/simple-o…
Browse files Browse the repository at this point in the history
…auth2.md` (#5744)
  • Loading branch information
KdHyeon0661 committed Apr 2, 2024
1 parent 5a29797 commit d6997ab
Showing 1 changed file with 315 additions and 0 deletions.
315 changes: 315 additions & 0 deletions docs/ko/docs/tutorial/security/simple-oauth2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,315 @@
# νŒ¨μŠ€μ›Œλ“œμ™€ Bearerλ₯Ό μ΄μš©ν•œ κ°„λ‹¨ν•œ OAuth2

이제 이전 μž₯μ—μ„œ λΉŒλ“œν•˜κ³  λˆ„λ½λœ 뢀뢄을 μΆ”κ°€ν•˜μ—¬ μ™„μ „ν•œ λ³΄μ•ˆ 흐름을 갖도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

## `username`와 `password` μ–»κΈ°

**FastAPI** λ³΄μ•ˆ μœ ν‹Έλ¦¬ν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ `username` 및 `password`λ₯Ό κ°€μ Έμ˜¬ κ²ƒμž…λ‹ˆλ‹€.

OAuth2λŠ” (μš°λ¦¬κ°€ μ‚¬μš©ν•˜κ³  μžˆλŠ”) "νŒ¨μŠ€μ›Œλ“œ ν”Œλ‘œμš°"을 μ‚¬μš©ν•  λ•Œ ν΄λΌμ΄μ–ΈνŠΈ/μœ μ €κ°€ `username` 및 `password` ν•„λ“œλ₯Ό 폼 λ°μ΄ν„°λ‘œ 보내야 함을 μ§€μ •ν•©λ‹ˆλ‹€.

그리고 μ‚¬μ–‘μ—λŠ” ν•„λ“œμ˜ 이름을 κ·Έλ ‡κ²Œ 지정해야 ν•œλ‹€κ³  λ‚˜μ™€ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ `user-name` λ˜λŠ” `email`은 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ κ±±μ •ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€. ν”„λŸ°νŠΈμ—”λ“œμ—μ„œ μ΅œμ’… μ‚¬μš©μžμ—κ²Œ μ›ν•˜λŠ” λŒ€λ‘œ ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

그리고 λ°μ΄ν„°λ² μ΄μŠ€ λͺ¨λΈμ€ μ›ν•˜λŠ” λ‹€λ₯Έ 이름을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 둜그인 *경둜 μž‘λ™*의 경우 사양과 ν˜Έν™˜λ˜λ„λ‘ μ΄λŸ¬ν•œ 이름을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€(예λ₯Ό λ“€μ–΄ 톡합 API λ¬Έμ„œ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€).

μ‚¬μ–‘μ—λŠ” λ˜ν•œ `username`κ³Ό `password`κ°€ 폼 λ°μ΄ν„°λ‘œ μ „μ†‘λ˜μ–΄μ•Ό ν•œλ‹€κ³  λͺ…μ‹œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€(λ”°λΌμ„œ μ—¬κΈ°μ—λŠ” JSON이 μ—†μŠ΅λ‹ˆλ‹€).

### `scope`

μ‚¬μ–‘μ—λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‹€λ₯Έ 폼 ν•„λ“œ "`scope`"λ₯Ό 보낼 수 μžˆλ‹€κ³  λ‚˜μ™€ μžˆμŠ΅λ‹ˆλ‹€.

폼 ν•„λ“œ 이름은 `scope`(λ‹¨μˆ˜ν˜•)μ΄μ§€λ§Œ μ‹€μ œλ‘œλŠ” 곡백으둜 κ΅¬λΆ„λœ "λ²”μœ„"κ°€ μžˆλŠ” κΈ΄ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.

각 "λ²”μœ„"λŠ” 곡백이 μ—†λŠ” λ¬Έμžμ—΄μž…λ‹ˆλ‹€.

일반적으둜 νŠΉμ • λ³΄μ•ˆ κΆŒν•œμ„ μ„ μ–Έν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. λ‹€μŒμ„ λ΄…μ‹œλ‹€:

* `users:read` λ˜λŠ” `users:write`λŠ” 일반적인 μ˜ˆμ‹œμž…λ‹ˆλ‹€.
* `instagram_basic`은 페이슀뢁/μΈμŠ€νƒ€κ·Έλž¨μ—μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.
* `https://www.googleapis.com/auth/drive`λŠ” Googleμ—μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.

!!! 정보
OAuth2μ—μ„œ "λ²”μœ„"λŠ” ν•„μš”ν•œ νŠΉμ • κΆŒν•œμ„ μ„ μ–Έν•˜λŠ” λ¬Έμžμ—΄μž…λ‹ˆλ‹€.

`:`κ³Ό 같은 λ‹€λ₯Έ λ¬Έμžκ°€ μžˆλŠ”μ§€ λ˜λŠ” URLμΈμ§€λŠ” μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μ„ΈλΆ€ 사항은 κ΅¬ν˜„μ— 따라 λ‹€λ¦…λ‹ˆλ‹€.

OAuth2의 경우 λ¬Έμžμ—΄μΌ λΏμž…λ‹ˆλ‹€.

## `username`κ³Ό `password`λ₯Ό κ°€μ Έμ˜€λŠ” μ½”λ“œ

이제 **FastAPI**μ—μ„œ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ 이λ₯Ό μ²˜λ¦¬ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

### `OAuth2PasswordRequestForm`

λ¨Όμ € `OAuth2PasswordRequestForm`을 가져와 `/token`에 λŒ€ν•œ *경둜 μž‘λ™*μ—μ„œ `Depends`의 μ˜μ‘΄μ„±μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

=== "파이썬 3.7 이상"

```Python hl_lines="4 76"
{!> ../../../docs_src/security/tutorial003.py!}
```

=== "파이썬 3.10 이상"

```Python hl_lines="2 74"
{!> ../../../docs_src/security/tutorial003_py310.py!}
```

`OAuth2PasswordRequestForm`은 λ‹€μŒμ„ μ‚¬μš©ν•˜μ—¬ 폼 본문을 μ„ μ–Έν•˜λŠ” 클래슀 μ˜μ‘΄μ„±μž…λ‹ˆλ‹€:

* `username`.
* `password`.
* `scope`λŠ” 선택적인 ν•„λ“œλ‘œ 곡백으둜 κ΅¬λΆ„λœ λ¬Έμžμ—΄λ‘œ κ΅¬μ„±λœ 큰 λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
* `grant_type`(μ„ νƒμ μœΌλ‘œ μ‚¬μš©).

!!! 팁
OAuth2 사양은 μ‹€μ œλ‘œ `password`λΌλŠ” κ³ μ • 값이 μžˆλŠ” `grant_type` ν•„λ“œλ₯Ό *μš”κ΅¬*ν•˜μ§€λ§Œ `OAuth2PasswordRequestForm`은 이λ₯Ό κ°•μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λ©΄ `OAuth2PasswordRequestForm` λŒ€μ‹  `OAuth2PasswordRequestFormStrict`λ₯Ό μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

* `client_id`(μ„ νƒμ μœΌλ‘œ μ‚¬μš©) (μ˜ˆμ œμ—μ„œλŠ” ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€).
* `client_secret`(μ„ νƒμ μœΌλ‘œ μ‚¬μš©) (μ˜ˆμ œμ—μ„œλŠ” ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€).

!!! 정보
`OAuth2PasswordRequestForm`은 `OAuth2PasswordBearer`와 같이 **FastAPI**에 λŒ€ν•œ 특수 ν΄λž˜μŠ€κ°€ μ•„λ‹™λ‹ˆλ‹€.

`OAuth2PasswordBearer`λŠ” **FastAPI**κ°€ λ³΄μ•ˆ μ²΄κ³„μž„μ„ μ•Œλ„λ‘ ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ OpenAPI에 κ·Έλ ‡κ²Œ μΆ”κ°€λ©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ `OAuth2PasswordRequestForm`은 직접 μž‘μ„±ν•˜κ±°λ‚˜ `Form` λ§€κ°œλ³€μˆ˜λ₯Ό 직접 μ„ μ–Έν•  수 μžˆλŠ” 클래슀 μ˜μ‘΄μ„±μΌ λΏμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 일반적인 μ‚¬μš© μ‚¬λ‘€μ΄λ―€λ‘œ 더 μ‰½κ²Œ ν•˜κΈ° μœ„ν•΄ **FastAPI**μ—μ„œ 직접 μ œκ³΅ν•©λ‹ˆλ‹€.

### 폼 데이터 μ‚¬μš©ν•˜κΈ°

!!! 팁
쒅속성 클래슀 `OAuth2PasswordRequestForm`의 μΈμŠ€ν„΄μŠ€μ—λŠ” 곡백으둜 κ΅¬λΆ„λœ κΈ΄ λ¬Έμžμ—΄μ΄ μžˆλŠ” `scope` 속성이 μ—†κ³  λŒ€μ‹  μ „μ†‘λœ 각 λ²”μœ„μ— λŒ€ν•œ μ‹€μ œ λ¬Έμžμ—΄ λͺ©λ‘μ΄ μžˆλŠ” `scopes` 속성이 μžˆμŠ΅λ‹ˆλ‹€.

이 μ˜ˆμ œμ—μ„œλŠ” `scopes`λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ§€λ§Œ ν•„μš”ν•œ 경우, κΈ°λŠ₯이 μžˆμŠ΅λ‹ˆλ‹€.

이제 폼 ν•„λ“œμ˜ `username`을 μ‚¬μš©ν•˜μ—¬ (κ°€μ§œ) λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μœ μ € 데이터λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.

ν•΄λ‹Ή μ‚¬μš©μžκ°€ μ—†μœΌλ©΄ "잘λͺ»λœ μ‚¬μš©μž 이름 λ˜λŠ” νŒ¨μŠ€μ›Œλ“œ"λΌλŠ” 였λ₯˜κ°€ λ°˜ν™˜λ©λ‹ˆλ‹€.

였λ₯˜μ˜ 경우 `HTTPException` μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€:

=== "파이썬 3.7 이상"

```Python hl_lines="3 77-79"
{!> ../../../docs_src/security/tutorial003.py!}
```

=== "파이썬 3.10 이상"

```Python hl_lines="1 75-77"
{!> ../../../docs_src/security/tutorial003_py310.py!}
```

### νŒ¨μŠ€μ›Œλ“œ ν™•μΈν•˜κΈ°

이 μ‹œμ μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ‚¬μš©μž 데이터 ν˜•μ‹μ„ ν™•μΈν–ˆμ§€λ§Œ μ•”ν˜Έλ₯Ό ν™•μΈν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

λ¨Όμ € 데이터λ₯Ό Pydantic `UserInDB` λͺ¨λΈμ— λ„£κ² μŠ΅λ‹ˆλ‹€.

일반 ν…μŠ€νŠΈ μ•”ν˜Έλ₯Ό μ €μž₯ν•˜λ©΄ μ•ˆ λ˜λ‹ˆ (κ°€μ§œ) μ•”ν˜Έ ν•΄μ‹± μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

두 νŒ¨μŠ€μ›Œλ“œκ°€ μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ λ™μΌν•œ 였λ₯˜κ°€ λ°˜ν™˜λ©λ‹ˆλ‹€.

#### νŒ¨μŠ€μ›Œλ“œ ν•΄μ‹±

"ν•΄μ‹±"은 일뢀 μ½˜ν…μΈ (이 경우 νŒ¨μŠ€μ›Œλ“œ)λ₯Ό νš‘μ„€μˆ˜μ„€ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” 일련의 λ°”μ΄νŠΈ(λ¬Έμžμ—΄)둜 λ³€ν™˜ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

μ •ν™•νžˆ λ™μΌν•œ μ½˜ν…μΈ (μ •ν™•νžˆ λ™μΌν•œ νŒ¨μŠ€μ›Œλ“œ)λ₯Ό 전달할 λ•Œλ§ˆλ‹€ μ •ν™•νžˆ λ™μΌν•œ νš‘μ„€μˆ˜μ„€μ΄ λ°œμƒν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ νš‘μ„€μˆ˜μ„€μ—μ„œ μ•”ν˜Έλ‘œ λ‹€μ‹œ λ³€ν™˜ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

##### νŒ¨μŠ€μ›Œλ“œ 해싱을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 이유

λ°μ΄ν„°λ² μ΄μŠ€κ°€ 유좜된 경우 ν•΄μ»€λŠ” μ‚¬μš©μžμ˜ 일반 ν…μŠ€νŠΈ μ•”ν˜Έκ°€ μ•„λ‹ˆλΌ ν•΄μ‹œλ§Œ κ°–κ²Œ λ©λ‹ˆλ‹€.

λ”°λΌμ„œ ν•΄μ»€λŠ” λ‹€λ₯Έ μ‹œμŠ€ν…œμ—μ„œ λ™μΌν•œ μ•”ν˜Έλ₯Ό μ‚¬μš©ν•˜λ €κ³  μ‹œλ„ν•  수 μ—†μŠ΅λ‹ˆλ‹€(λ§Žμ€ μ‚¬μš©μžκ°€ λͺ¨λ“  κ³³μ—μ„œ λ™μΌν•œ μ•”ν˜Έλ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ μ΄λŠ” μœ„ν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€).

=== "P파이썬 3.7 이상"

```Python hl_lines="80-83"
{!> ../../../docs_src/security/tutorial003.py!}
```

=== "파이썬 3.10 이상"

```Python hl_lines="78-81"
{!> ../../../docs_src/security/tutorial003_py310.py!}
```

#### `**user_dict`에 λŒ€ν•΄

`UserInDB(**user_dict)`λŠ” λ‹€μŒμ„ μ˜λ―Έν•œλ‹€:

*`user_dict`의 킀와 값을 λ‹€μŒκ³Ό 같은 ν‚€-κ°’ 인수둜 직접 μ „λ‹¬ν•©λ‹ˆλ‹€:*

```Python
UserInDB(
username = user_dict["username"],
email = user_dict["email"],
full_name = user_dict["full_name"],
disabled = user_dict["disabled"],
hashed_password = user_dict["hashed_password"],
)
```

!!! 정보
`**user_dict`에 λŒ€ν•œ μžμ„Έν•œ μ„€λͺ…은 [**μΆ”κ°€ λͺ¨λΈ** λ¬Έμ„œ](../extra-models.md#about-user_indict){.internal-link target=_blank}λ₯Ό λ‹€μ‹œ μ½μ–΄λ΄…μ‹œλ‹€.

## 토큰 λ°˜ν™˜ν•˜κΈ°

`token` μ—”λ“œν¬μΈνŠΈμ˜ 응닡은 JSON 객체여야 ν•©λ‹ˆλ‹€.

`token_type`이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” "Bearer" 토큰을 μ‚¬μš©ν•˜λ―€λ‘œ 토큰 μœ ν˜•μ€ "`bearer`"μ—¬μ•Ό ν•©λ‹ˆλ‹€.

그리고 μ•‘μ„ΈμŠ€ 토큰을 ν¬ν•¨ν•˜λŠ” λ¬Έμžμ—΄κ³Ό ν•¨κ»˜ `access_token`이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

이 κ°„λ‹¨ν•œ μ˜ˆμ œμ—μ„œλŠ” μ™„μ „νžˆ μ•ˆμ „ν•˜μ§€ μ•Šκ³ , λ™μΌν•œ `username`을 ν† ν°μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

!!! 팁
λ‹€μŒ μž₯μ—μ„œλŠ” νŒ¨μŠ€μ›Œλ“œ ν•΄μ‹± 및 <abbr title="JSON Web Tokens">JWT</abbr> 토큰을 μ‚¬μš©ν•˜μ—¬ μ‹€μ œ λ³΄μ•ˆ κ΅¬ν˜„μ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ§€κΈˆμ€ ν•„μš”ν•œ μ„ΈλΆ€ 정보에 μ§‘μ€‘ν•˜κ² μŠ΅λ‹ˆλ‹€.

=== "파이썬 3.7 이상"

```Python hl_lines="85"
{!> ../../../docs_src/security/tutorial003.py!}
```

=== "파이썬 3.10 이상"

```Python hl_lines="83"
{!> ../../../docs_src/security/tutorial003_py310.py!}
```

!!! 팁
사양에 따라 이 μ˜ˆμ œμ™€ λ™μΌν•˜κ²Œ `access_token` 및 `token_type`이 ν¬ν•¨λœ JSON을 λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ΄λŠ” μ½”λ“œμ—μ„œ 직접 μˆ˜ν–‰ν•΄μ•Ό ν•˜λ©° ν•΄λ‹Ή JSON ν‚€λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

사양을 μ€€μˆ˜ν•˜κΈ° μœ„ν•΄ 슀슀둜 μ˜¬λ°”λ₯΄κ²Œ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ 거의 μœ μΌν•˜κ²Œ κΈ°μ–΅ν•΄μ•Ό ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‚˜λ¨Έμ§€λŠ” **FastAPI**κ°€ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

## μ˜μ‘΄μ„± μ—…λ°μ΄νŠΈν•˜κΈ°

이제 μ˜μ‘΄μ„±μ„ μ—…λ°μ΄νŠΈλ₯Ό ν•  κ²λ‹ˆλ‹€.

이 μ‚¬μš©μžκ°€ ν™œμ„±ν™”λ˜μ–΄ μžˆλŠ” *κ²½μš°μ—λ§Œ* `current_user`λ₯Ό κ°€μ Έμ˜¬ κ²λ‹ˆλ‹€.

λ”°λΌμ„œ `get_current_user`λ₯Ό μ˜μ‘΄μ„±μœΌλ‘œ μ‚¬μš©ν•˜λŠ” μΆ”κ°€ 쒅속성 `get_current_active_user`λ₯Ό λ§Œλ“­λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μ˜μ‘΄μ„± λͺ¨λ‘, μ‚¬μš©μžκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šκ±°λ‚˜ λΉ„ν™œμ„±μΈ 경우 HTTP 였λ₯˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ μ—”λ“œν¬μΈνŠΈμ—μ„œλŠ” μ‚¬μš©μžκ°€ μ‘΄μž¬ν•˜κ³  μ˜¬λ°”λ₯΄κ²Œ μΈμ¦λ˜μ—ˆμœΌλ©° ν™œμ„± μƒνƒœμΈ κ²½μš°μ—λ§Œ μ‚¬μš©μžλ₯Ό μ–»μŠ΅λ‹ˆλ‹€:

=== "파이썬 3.7 이상"

```Python hl_lines="58-66 69-72 90"
{!> ../../../docs_src/security/tutorial003.py!}
```

=== "파이썬 3.10 이상"

```Python hl_lines="55-64 67-70 88"
{!> ../../../docs_src/security/tutorial003_py310.py!}
```

!!! 정보
μ—¬κΈ°μ„œ λ°˜ν™˜ν•˜λŠ” 값이 `Bearer`인 μΆ”κ°€ 헀더 `WWW-Authenticate`도 μ‚¬μ–‘μ˜ μΌλΆ€μž…λ‹ˆλ‹€.

λͺ¨λ“  HTTP(였λ₯˜) μƒνƒœ μ½”λ“œ 401 "UNAUTHORIZED"λŠ” `WWW-Authenticate` 헀더도 λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ² μ–΄λŸ¬ ν† ν°μ˜ 경우(μ§€κΈˆμ˜ 경우) ν•΄λ‹Ή ν—€λ”μ˜ 값은 `Bearer`μ—¬μ•Ό ν•©λ‹ˆλ‹€.

μ‹€μ œλ‘œ μΆ”κ°€ 헀더λ₯Ό κ±΄λ„ˆλ›Έ 수 있으며 μ—¬μ „νžˆ μž‘λ™ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ—¬κΈ°μ—μ„œλŠ” 사양을 μ€€μˆ˜ν•˜λ„λ‘ μ œκ³΅λ©λ‹ˆλ‹€.

λ˜ν•œ 이λ₯Ό μ˜ˆμƒν•˜κ³  (ν˜„μž¬ λ˜λŠ” λ―Έλž˜μ—) μ‚¬μš©ν•˜λŠ” 도ꡬ가 μžˆμ„ 수 있으며, ν˜„μž¬ λ˜λŠ” λ―Έλž˜μ— μžμ‹  ν˜Ήμ€ μžμ‹ μ˜ μœ μ €λ“€μ—κ²Œ μœ μš©ν•  κ²ƒμž…λ‹ˆλ‹€.

그것이 ν‘œμ€€μ˜ μ΄μ μž…λ‹ˆλ‹€ ...

## ν™•μΈν•˜κΈ°

λŒ€ν™”ν˜• λ¬Έμ„œ μ—΄κΈ°: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.

### μΈμ¦ν•˜κΈ°

"Authorize" λ²„νŠΌμ„ λˆŒλŸ¬λ΄…μ‹œλ‹€.

자격 증λͺ…을 μ‚¬μš©ν•©λ‹ˆλ‹€.

μœ μ €λͺ…: `johndoe`

νŒ¨μŠ€μ›Œλ“œ: `secret`

<img src="/img/tutorial/security/image04.png">

μ‹œμŠ€ν…œμ—μ„œ μΈμ¦ν•˜λ©΄ λ‹€μŒκ³Ό 같이 ν‘œμ‹œλ©λ‹ˆλ‹€:

<img src="/img/tutorial/security/image05.png">

### μžμ‹ μ˜ μœ μ € 데이터 κ°€μ Έμ˜€κΈ°

이제 `/users/me` κ²½λ‘œμ— `GET` μž‘μ—…μ„ μ§„ν–‰ν•©μ‹œλ‹€.

λ‹€μŒκ³Ό 같은 μ‚¬μš©μž 데이터λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€:

```JSON
{
"username": "johndoe",
"email": "johndoe@example.com",
"full_name": "John Doe",
"disabled": false,
"hashed_password": "fakehashedsecret"
}
```

<img src="/img/tutorial/security/image06.png">

잠금 μ•„μ΄μ½˜μ„ ν΄λ¦­ν•˜κ³  λ‘œκ·Έμ•„μ›ƒν•œ λ‹€μŒ λ™μΌν•œ μž‘μ—…μ„ λ‹€μ‹œ μ‹œλ„ν•˜λ©΄ λ‹€μŒκ³Ό 같은 HTTP 401 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

```JSON
{
"detail": "Not authenticated"
}
```

### λΉ„ν™œμ„±λœ μœ μ €

이제 λΉ„ν™œμ„±λœ μ‚¬μš©μžλ‘œ μ‹œλ„ν•˜κ³ , μΈμ¦ν•΄λ΄…μ‹œλ‹€:

μœ μ €λͺ…: `alice`

νŒ¨μŠ€μ›Œλ“œ: `secret2`

그리고 `/users/me` κ²½λ‘œμ™€ ν•¨κ»˜ `GET` μž‘μ—…μ„ μ‚¬μš©ν•΄ λ΄…μ‹œλ‹€.

λ‹€μŒκ³Ό 같은 "Inactive user" 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€:

```JSON
{
"detail": "Inactive user"
}
```

## μš”μ•½

이제 API에 λŒ€ν•œ `username` 및 `password`λ₯Ό 기반으둜 μ™„μ „ν•œ λ³΄μ•ˆ μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•  수 μžˆλŠ” 도ꡬ가 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³΄μ•ˆ μ‹œμŠ€ν…œμ„ λͺ¨λ“  λ°μ΄ν„°λ² μ΄μŠ€ 및 λͺ¨λ“  μ‚¬μš©μž λ˜λŠ” 데이터 λͺ¨λΈκ³Ό ν˜Έν™˜λ˜λ„λ‘ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

μœ μΌν•œ μ˜€μ μ€ 아직 μ‹€μ œλ‘œ "μ•ˆμ „"ν•˜μ§€ μ•Šλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‹€μŒ μž₯μ—μ„œλŠ” μ•ˆμ „ν•œ νŒ¨μŠ€μ›Œλ“œ ν•΄μ‹± λΌμ΄λΈŒλŸ¬λ¦¬μ™€ <abbr title="JSON Web Tokens">JWT</abbr> 토큰을 μ‚¬μš©ν•˜λŠ” 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

0 comments on commit d6997ab

Please sign in to comment.