]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Add Korean translation for `docs/ko/docs/tutorial/security/simple-oauth2.md` (...
authorDoHyun Kim <tnghwk0661@gmail.com>
Tue, 2 Apr 2024 22:37:23 +0000 (07:37 +0900)
committerGitHub <noreply@github.com>
Tue, 2 Apr 2024 22:37:23 +0000 (17:37 -0500)
docs/ko/docs/tutorial/security/simple-oauth2.md [new file with mode: 0644]

diff --git a/docs/ko/docs/tutorial/security/simple-oauth2.md b/docs/ko/docs/tutorial/security/simple-oauth2.md
new file mode 100644 (file)
index 0000000..1e33f57
--- /dev/null
@@ -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> ν† ν°μ„ μ‚¬μš©ν•˜λŠ” λ°©λ²•을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.