committed by
GitHub
1 changed files with 273 additions and 0 deletions
@ -0,0 +1,273 @@ |
|||
# ํจ์ค์๋ ํด์ฑ์ ์ด์ฉํ OAuth2, JWT ํ ํฐ์ ์ฌ์ฉํ๋ Bearer ์ธ์ฆ |
|||
|
|||
๋ชจ๋ ๋ณด์ ํ๋ฆ์ ๊ตฌ์ฑํ์ผ๋ฏ๋ก, ์ด์ <abbr title="JSON Web Tokens">JWT</abbr> ํ ํฐ๊ณผ ํจ์ค์๋ ํด์ฑ์ ์ฌ์ฉํด ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ํ๊ฒ ๋ง๋ค ๊ฒ์
๋๋ค. |
|||
|
|||
์ด ์ฝ๋๋ ์ค์ ๋ก ์ ํ๋ฆฌ์ผ์ด์
์์ ํจ์ค์๋๋ฅผ ํด์ฑํ์ฌ DB์ ์ ์ฅํ๋ ๋ฑ์ ์์
์ ํ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด์ ์ฅ์ ์ด์ด์ ์์ํด ๋ด
์๋ค. |
|||
|
|||
## JWT |
|||
|
|||
JWT ๋ "JSON Web Tokens" ์ ์๋ฏธํฉ๋๋ค. |
|||
|
|||
JSON ๊ฐ์ฒด๋ฅผ ๊ณต๋ฐฑ์ด ์๋ ๊ธด ๋ฌธ์์ด๋ก ์ธ์ฝ๋ฉํ๋ ํ์ค์ด๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ํํ์
๋๋ค: |
|||
|
|||
``` |
|||
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c |
|||
``` |
|||
|
|||
JWT๋ ์ํธํ๋์ง ์์ ๋๊ตฌ๋ ์ง ํ ํฐ์์ ์ ๋ณด๋ฅผ ๋ณต์ํ ์ ์์ต๋๋ค. |
|||
|
|||
ํ์ง๋ง JWT๋ ์๋ช
๋์ด ์์ต๋๋ค. ๊ทธ๋์ ์์ ์ด ๋ฐ๊ธํ ํ ํฐ์ ๋ฐ์์ ๋, ์ค์ ๋ก ์์ ์ด ๋ฐ๊ธํ๊ฒ ๋ง๋์ง ๊ฒ์ฆํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ง๋ฃ ๊ธฐ๊ฐ์ด ์ผ์ฃผ์ผ์ธ ํ ํฐ์ ๋ฐํํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. ๋ค์ ๋ ์ฌ์ฉ์๊ฐ ํ ํฐ์ ๊ฐ์ ธ์์ ๋, ๊ทธ ์ฌ์ฉ์๊ฐ ์์คํ
์ ์ฌ์ ํ ๋ก๊ทธ์ธ๋์ด ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. |
|||
|
|||
์ผ์ฃผ์ผ ๋ค์๋ ํ ํฐ์ด ๋ง๋ฃ๋ ๊ฒ์ด๊ณ , ์ฌ์ฉ์๋ ์ธ๊ฐ๋์ง ์์ ์ ํ ํฐ์ ๋ฐ๊ธฐ ์ํด ๋ค์ ๋ก๊ทธ์ธํด์ผ ํ ๊ฒ์
๋๋ค. ๋ง์ฝ ์ฌ์ฉ์(๋๋ ์ 3์)๊ฐ ํ ํฐ์ ์์ ํ๊ฑฐ๋ ๋ง๋ฃ์ผ์ ๋ณ๊ฒฝํ๋ฉด, ์๋ช
์ด ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ ์์์ฑ ์ ์์ ๊ฒ์
๋๋ค. |
|||
|
|||
๋ง์ฝ JWT ํ ํฐ์ ๋ค๋ค๋ณด๊ณ , ์๋ ๋ฐฉ์๋ ์์๋ณด๊ณ ์ถ๋ค๋ฉด <a href="https://jwt.io/" class="external-link" target="_blank">https://jwt.io</a> ์ ํ์ธํ์ญ์์ค. |
|||
|
|||
## `PyJWT` ์ค์น |
|||
|
|||
ํ์ด์ฌ์ผ๋ก JWT ํ ํฐ์ ์์ฑํ๊ณ ๊ฒ์ฆํ๋ ค๋ฉด `PyJWT` ๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค. |
|||
|
|||
[๊ฐ์ํ๊ฒฝ](../../virtual-environments.md){.internal-link target=_blank} ์ ๋ง๋ค๊ณ ํ์ฑํํ ๋ค์ `pyjwt` ๋ฅผ ์ค์นํ์ญ์์ค: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ pip install pyjwt |
|||
|
|||
---> 100% |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
/// info | ์ฐธ๊ณ |
|||
|
|||
RSA๋ ECDSA ๊ฐ์ ์ ์ ์๋ช
์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ค๋ฉด, `pyjwt[crypto]`๋ผ๋ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ์ ์ค์นํด์ผ ํฉ๋๋ค. |
|||
|
|||
๋ ์์ธํ ๋ด์ฉ์ <a href="https://pyjwt.readthedocs.io/en/latest/installation.html" class="external-link" target="_blank">PyJWT ์ค์น</a> ์์ ํ์ธํ ์ ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
## ํจ์ค์๋ ํด์ฑ |
|||
|
|||
"ํด์ฑ(Hashing)"์ ์ด๋ค ๋ด์ฉ(์ฌ๊ธฐ์๋ ํจ์ค์๋)์ ํด์ํ ์ ์๋ ์ผ๋ จ์ ๋ฐ์ดํธ ์งํฉ(๋จ์ ๋ฌธ์์ด)์ผ๋ก ๋ณํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. |
|||
|
|||
๋์ผํ ๋ด์ฉ(๋๊ฐ์ ํจ์ค์๋)์ ํด์ฑํ๋ฉด ๋์ผํ ๋ฌธ์์ด์ ์ป์ต๋๋ค. |
|||
|
|||
ํ์ง๋ง ๊ทธ ๋ฌธ์์ด์ ๋ค์ ํจ์ค์๋๋ก ๋๋๋ฆด ์๋ ์์ต๋๋ค. |
|||
|
|||
### ํจ์ค์๋๋ฅผ ํด์ฑํ๋ ์ด์ |
|||
|
|||
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ทจ๋นํ๋๋ผ๋, ์นจ์
์๋ ์ฌ์ฉ์์ ํ๋ฌธ ํจ์ค์๋ ๋์ ํด์ ๊ฐ๋ง ์ป์ ์ ์์ต๋๋ค. |
|||
|
|||
๋ฐ๋ผ์ ์นจ์
์๋ ํ์น ์ฌ์ฉ์ ํจ์ค์๋๋ฅผ ๋ค๋ฅธ ์์คํ
์์ ํ์ฉํ ์ ์์ต๋๋ค. (๋๋ค์ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ์์คํ
์์ ๋์ผํ ํจ์ค์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ๋ฌธ ํจ์ค์๋๊ฐ ์ ์ถ๋๋ฉด ์ํํฉ๋๋ค.) |
|||
|
|||
## `passlib` ์ค์น |
|||
|
|||
PassLib๋ ํจ์ค์๋ ํด์๋ฅผ ๋ค๋ฃจ๋ ํ๋ฅญํ ํ์ด์ฌ ํจํค์ง์
๋๋ค. |
|||
|
|||
๋ง์ ์์ ํ ํด์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋๊ตฌ๋ค์ ์ง์ํฉ๋๋ค. |
|||
|
|||
์ถ์ฒํ๋ ์๊ณ ๋ฆฌ์ฆ์ "Bcrypt"์
๋๋ค. |
|||
|
|||
[๊ฐ์ํ๊ฒฝ](../../virtual-environments.md){.internal-link target=_blank} ์ ๋ง๋ค๊ณ ํ์ฑํํ ๋ค์ PassLib์ Bcrypt๋ฅผ ์ค์นํ์ญ์์ค: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ pip install "passlib[bcrypt]" |
|||
|
|||
---> 100% |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
/// tip | ํ |
|||
|
|||
`passlib`๋ฅผ ์ฌ์ฉํ์ฌ, **Django**, **Flask** ์ ๋ณด์ ํ๋ฌ๊ทธ์ธ์ด๋ ๋ค๋ฅธ ๋๊ตฌ๋ก ์์ฑํ ํจ์ค์๋๋ฅผ ์ฝ์ ์ ์๋๋ก ์ค์ ํ ์๋ ์์ต๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์๋ฉด, FastAPI ์ ํ๋ฆฌ์ผ์ด์
๊ณผ Django ์ ํ๋ฆฌ์ผ์ด์
์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ๋๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ Django ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ ์๋ ์์ต๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์๋ FastAPI ์ ํ๋ฆฌ์ผ์ด์
๊ณผ Django ์ ํ๋ฆฌ์ผ์ด์
์ ๋์์ ๋ก๊ทธ์ธํ ์ ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
## ํจ์ค์๋์ ํด์์ ๊ฒ์ฆ |
|||
|
|||
ํ์ํ ๋๊ตฌ๋ฅผ `passlib`์์ ์ํฌํธํฉ๋๋ค. |
|||
|
|||
PassLib "์ปจํ
์คํธ(context)"๋ฅผ ์์ฑํฉ๋๋ค. ์ด๊ฒ์ ํจ์ค์๋๋ฅผ ํด์ฑํ๊ณ ๊ฒ์ฆํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค. |
|||
|
|||
/// tip | ํ |
|||
|
|||
PassLib ์ปจํ
์คํธ๋ ๋ค์ํ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ๋ ์ด์ ์ฌ์ฉ์ด ๊ถ์ฅ๋์ง ์๋ ์ค๋๋ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒ์ฆํ๋ ๊ธฐ๋ฅ๋ ํฌํจ๋์ด ์์ต๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด, ๋ค๋ฅธ ์์คํ
(Django ๊ฐ์)์์ ์์ฑํ ํจ์ค์๋๋ฅผ ์ฝ๊ณ ๊ฒ์ฆํ ์ ์์ผ๋ฉฐ, ์๋ก์ด ํจ์ค์๋๋ฅผ Bcrypt ๊ฐ์ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด์ฑํ ์๋ ์์ต๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ๋์์ ๊ทธ๋ฐ ๋ชจ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํธํ์ฑ์ ์ ์งํฉ๋๋ค. |
|||
|
|||
/// |
|||
|
|||
์ฌ์ฉ์๋ก๋ถํฐ ๋ฐ์ ํจ์ค์๋๋ฅผ ํด์ฑํ๋ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ์์ฑํฉ๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ๋ฐ์ ํจ์ค์๋๊ฐ ์ ์ฅ๋ ํด์์ ์ผ์นํ๋์ง ๊ฒ์ฆํ๋ ๋ ๋ค๋ฅธ ์ ํธ๋ฆฌํฐ ํจ์๋ ์์ฑํฉ๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๊ณ ๋ฐํํ๋ ๋ ๋ค๋ฅธ ํจ์๋ ์์ฑํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/security/tutorial004_an_py310.py hl[8,49,56:57,60:61,70:76] *} |
|||
|
|||
/// note |
|||
|
|||
์๋ก์ด (๊ฐ์ง) ๋ฐ์ดํฐ๋ฒ ์ด์ค `fake_users_db`๋ฅผ ํ์ธํ๋ฉด, ํด์ ์ฒ๋ฆฌ๋ ํจ์ค์๋๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง ๋ณผ ์ ์์ต๋๋ค: `"$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW"`. |
|||
|
|||
/// |
|||
|
|||
## JWT ํ ํฐ ์ฒ๋ฆฌ |
|||
|
|||
์ค์น๋ ๋ชจ๋์ ์ํฌํธ ํฉ๋๋ค. |
|||
|
|||
JWT ํ ํฐ ์๋ช
์ ์ฌ์ฉ๋ ์์์ ๋น๋ฐํค๋ฅผ ์์ฑํฉ๋๋ค. |
|||
|
|||
์์ ํ ์์์ ๋น๋ฐํค๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ญ์์ค: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ openssl rand -hex 32 |
|||
|
|||
09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7 |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
๊ทธ๋ฆฌ๊ณ ์์ฑํ ๋น๋ฐํค๋ฅผ ๋ณต์ฌํด ๋ณ์ `SECRET_KEY`์ ๋์
ํฉ๋๋ค. (์ด ์์ ์ ๋ณ์ ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ๋ง์ญ์์ค.) |
|||
|
|||
JWT ํ ํฐ์ ์๋ช
ํ๋ ๋ฐ ์ฌ์ฉ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ํ ๋ณ์ `ALGORITHM` ์ ์์ฑํ๊ณ `"HS256"` ์ผ๋ก ์ค์ ํฉ๋๋ค. |
|||
|
|||
ํ ํฐ ๋ง๋ฃ ๊ธฐ๊ฐ์ ์ํ ๋ณ์๋ฅผ ์์ฑํฉ๋๋ค. |
|||
|
|||
์๋ต์ ์ํ ํ ํฐ ์๋ํฌ์ธํธ์ ์ฌ์ฉ๋ Pydantic ๋ชจ๋ธ์ ์ ์ํฉ๋๋ค. |
|||
|
|||
์ ์ก์ธ์ค ํ ํฐ์ ์์ฑํ๊ธฐ ์ํ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ์์ฑํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/security/tutorial004_an_py310.py hl[4,7,13:15,29:31,79:87] *} |
|||
|
|||
## ์์กด์ฑ ์์ |
|||
|
|||
`get_current_user` ํจ์๋ฅผ ์ด์ ๊ณผ ๋์ผํ ํ ํฐ์ ๋ฐ๋๋ก ์์ ํ๋, ์ด๋ฒ์๋ JWT ํ ํฐ์ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. |
|||
|
|||
๋ฐ์ ํ ํฐ์ ๋์ฝ๋ฉํ์ฌ ๊ฒ์ฆํ ํ ํ์ฌ ์ฌ์ฉ์๋ฅผ ๋ฐํํฉ๋๋ค. |
|||
|
|||
ํ ํฐ์ด ์ ํจํ์ง ์๋ค๋ฉด HTTP ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/security/tutorial004_an_py310.py hl[90:107] *} |
|||
|
|||
## `/token` ๊ฒฝ๋ก ์์
์์ |
|||
|
|||
ํ ํฐ์ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํ๊ธฐ ์ํด `timedelta` ๋ฅผ ์์ฑํฉ๋๋ค. |
|||
|
|||
์ค์ JWT ์ก์ธ์ค ํ ํฐ์ ์์ฑํ์ฌ ๋ฐํํฉ๋๋ค. |
|||
|
|||
{* ../../docs_src/security/tutorial004_an_py310.py hl[118:133] *} |
|||
|
|||
### JWT "์ฃผ์ฒด(subject)" `sub`์ ๋ํ ๊ธฐ์ ์ธ๋ถ ์ฌํญ |
|||
|
|||
JWT ๋ช
์ธ์ ๋ฐ๋ฅด๋ฉด ํ ํฐ์ ์ฃผ์ฒด๋ฅผ ํฌํจํ๋ `sub`๋ผ๋ ํค๊ฐ ์์ต๋๋ค. |
|||
|
|||
์ฌ์ฉ ์ฌ๋ถ๋ ์ ํ์ฌํญ์ด์ง๋ง, ์ฌ์ฉ์์ ์๋ณ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์๋ ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
|||
|
|||
JWT๋ ์ฌ์ฉ์๋ฅผ ์๋ณํ๊ณ ์ฌ์ฉ์๊ฐ API๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์๋๋ก ํ์ฉํ๋ ๊ฒ ์ธ์๋ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉ๋ ์๋ ์์ต๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด "์๋์ฐจ"๋ "๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ"์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ "์๋์ฐจ๋ฅผ ์ด์ ํ๋ค"๋ "๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ ํ๋ค"์ฒ๋ผ ํด๋น ์ํฐํฐ์ ๋ํ ๊ถํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. |
|||
|
|||
๊ทธ ํ ์ด JWT ํ ํฐ์ ์ฌ์ฉ์(๋๋ ๋ด)์๊ฒ ์ ๊ณตํ๋ฉด, ๊ทธ๋ค์ ๊ณ์ ์ ๋ฐ๋ก ๋ง๋ค ํ์ ์์ด API๊ฐ ์์ฑํ JWT ํ ํฐ๋ง์ผ๋ก ์์
(์๋์ฐจ ์ด์ ๋๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ํธ์ง)์ ์ํํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด๋ฌํ ๊ฐ๋
์ ํ์ฉํ๋ฉด JWT๋ ํจ์ฌ ๋ ๋ณต์กํ ์๋๋ฆฌ์ค์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด ๊ฒฝ์ฐ ์ฌ๋ฌ ์ํฐํฐ๊ฐ ๋์ผํ ID๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด foo๋ผ๋ ID๋ฅผ ๊ฐ์ง ์ฌ์ฉ์, ์๋์ฐจ, ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ด ์์ ์ ์์ต๋๋ค. |
|||
|
|||
๊ทธ๋์ ID ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด, ์ฌ์ฉ์์ JWT ํ ํฐ์ ์์ฑํ ๋ ์ ๋์ฌ๋ก `sub` ํค๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด `username:` ์ ๋ถ์ด๋ ๋ฐฉ์์
๋๋ค. ์ด ์์ ์์๋ `sub` ๊ฐ์ด `username:johndoe`์ด ๋ ์ ์์ต๋๋ค. |
|||
|
|||
๊ฐ์ฅ ์ค์ํ ์ ์ `sub` ํค๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์์ ๊ณ ์ ํ ์๋ณ์๊ฐ ๋์ด์ผ ํ๋ฉฐ ๋ฌธ์์ด์ด์ด์ผ ํ๋ค๋ ์ ์
๋๋ค. |
|||
|
|||
## ํ์ธํด๋ด
์๋ค |
|||
|
|||
์๋ฒ๋ฅผ ์คํํ๊ณ ๋ฌธ์๋ก ์ด๋ํ์ญ์์ค: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>. |
|||
|
|||
๋ค์๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ณผ ์ ์์ต๋๋ค: |
|||
|
|||
<img src="/img/tutorial/security/image07.png"> |
|||
|
|||
์ด์ ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์ธ์ฆํ์ญ์์ค. |
|||
|
|||
๋ค์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ญ์์ค: |
|||
|
|||
Username: `johndoe` |
|||
Password: `secret` |
|||
|
|||
/// check |
|||
|
|||
์ฝ๋ ์ด๋์๋ ํ๋ฌธ ํจ์ค์๋ "`secret`" ์ด ์๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. ํด์๋ ๋ฒ์ ๋ง ์์ต๋๋ค. |
|||
|
|||
/// |
|||
|
|||
<img src="/img/tutorial/security/image08.png"> |
|||
|
|||
`/users/me/` ๋ฅผ ํธ์ถํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ต์ ์ป์ ์ ์์ต๋๋ค: |
|||
|
|||
```JSON |
|||
{ |
|||
"username": "johndoe", |
|||
"email": "[email protected]", |
|||
"full_name": "John Doe", |
|||
"disabled": false |
|||
} |
|||
``` |
|||
|
|||
<img src="/img/tutorial/security/image09.png"> |
|||
|
|||
๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด์ด๋ณด๋ฉด ์ ์ก๋ ๋ฐ์ดํฐ์ ํ ํฐ๋ง ํฌํจ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ํจ์ค์๋๋ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๊ณ ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธฐ ์ํ ์ฒซ ๋ฒ์งธ ์์ฒญ์๋ง ์ ์ก๋๋ฉฐ, ์ดํ์๋ ์ ์ก๋์ง ์์ต๋๋ค: |
|||
|
|||
<img src="/img/tutorial/security/image10.png"> |
|||
|
|||
/// note |
|||
|
|||
`Bearer `๋ก ์์ํ๋ `Authorization` ํค๋์ ์ฃผ๋ชฉํ์ญ์์ค. |
|||
|
|||
/// |
|||
|
|||
## `scopes` ์ ๊ณ ๊ธ ์ฌ์ฉ๋ฒ |
|||
|
|||
OAuth2๋ "์ค์ฝํ(scopes)" ๋ผ๋ ๊ฐ๋
์ ๊ฐ๊ณ ์์ต๋๋ค. |
|||
|
|||
์ด๋ฅผ ์ฌ์ฉํ์ฌ JWT ํ ํฐ์ ํน์ ๊ถํ ์งํฉ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. |
|||
|
|||
๊ทธ ํ ์ด ํ ํฐ์ ์ฌ์ฉ์์๊ฒ ์ง์ ์ ๊ณตํ๊ฑฐ๋ ์ 3์์๊ฒ ์ ๊ณตํ์ฌ, ํน์ ์ ํ์ฌํญ ํ์์๋ API์ ํต์ ํ๋๋ก ํ ์ ์์ต๋๋ค. |
|||
|
|||
**FastAPI** ์์์ ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ํตํฉ ๋ฐฉ์์ **์ฌํ ์ฌ์ฉ์ ์๋ด์** ์์ ์์ธํ ๋ฐฐ์ธ ์ ์์ต๋๋ค. |
|||
|
|||
## ์์ฝ |
|||
|
|||
์ง๊ธ๊น์ง ์ดํด๋ณธ ๋ด์ฉ์ ๋ฐํ์ผ๋ก, OAuth2์ JWT ๊ฐ์ ํ์ค์ ์ฌ์ฉํ์ฌ ์์ ํ **FastAPI** ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์์ต๋๋ค. |
|||
|
|||
๊ฑฐ์ ๋ชจ๋ ํ๋ ์์ํฌ์์ ๋ณด์ ์ฒ๋ฆฌ๋ ์๋นํ ๋ณต์กํ ์ฃผ์ ์
๋๋ค. |
|||
|
|||
์ด๋ฅผ ๋จ์ํํ๋ ๋ง์ ํจํค์ง๋ ๋ฐ์ดํฐ ๋ชจ๋ธ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ๋ค์ ๋ํด ์ฌ๋ฌ ์ ์ฝ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๋์น๊ฒ ๋จ์ํํ๋ ์ผ๋ถ ํจํค์ง๋ค์ ์ฌ๊ฐํ ๋ณด์ ๊ฒฐํจ์ ๊ฐ์ง ์๋ ์์ต๋๋ค. |
|||
|
|||
--- |
|||
|
|||
**FastAPI** ๋ ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ฐ์ดํฐ ๋ชจ๋ธ, ๋๊ตฌ๋ ๊ฐ์ํ์ง ์์ต๋๋ค. |
|||
|
|||
ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ ์ ํํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ `passlib` ์ `PyJWT` ์ฒ๋ผ ์ ๊ด๋ฆฌ๋๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํจํค์ง๋ค์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. **FastAPI** ๋ ์ธ๋ถ ํจํค์ง ํตํฉ์ ์ํด ๋ณต์กํ ๋ฉ์ปค๋์ฆ์ด ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. |
|||
|
|||
๊ทธ๋ฌ๋ ์ ์ฐ์ฑ, ๊ฒฌ๊ณ ์ฑ, ๋ณด์์ฑ์ ํด์น์ง ์์ผ๋ฉด์ ๊ณผ์ ์ ๋จ์ํํ ์ ์๋ ๋๊ตฌ๋ค์ ์ ๊ณตํฉ๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ OAuth2์ ๊ฐ์ ํ์ค ํ๋กํ ์ฝ์ ๋น๊ต์ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ ์ธ๋ถํ๋ ๊ถํ ์ฒด๊ณ๋ฅผ ์ํด OAuth2์ "์ค์ฝํ"๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ **์ฌํ ์ฌ์ฉ์ ์๋ด์**์์ ๋ ์์ธํ ๋ฐฐ์ธ ์ ์์ต๋๋ค. OAuth2์ ์ค์ฝํ๋ ์ 3์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฌ์ฉ์๋ฅผ ๋์ ํด ๊ทธ๋ค์ API์ ์ํธ์์ฉํ๋๋ก ๊ถํ์ ๋ถ์ฌํ๊ธฐ ์ํด, Facebook, Google, GitHub, Microsoft, Twitter ๋ฑ์ ๋ง์ ๋ํ ์ธ์ฆ ์ ๊ณต์
์ฒด๋ค์ด ์ฌ์ฉํ๋ ๋ฉ์ปค๋์ฆ์
๋๋ค. |
Loadingโฆ
Reference in new issue