committed by
GitHub
1 changed files with 315 additions and 0 deletions
@ -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": "[email protected]", |
|||
"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> ํ ํฐ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. |
Loadingโฆ
Reference in new issue