의존성 주입과 인증
공유 로직과 JWT 기반 인증에 FastAPI의 DI 시스템을 사용합니다.
의존성 주입과 인증은(는) CoddyKit의 무료 Python Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Python Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
의존성 주입이란 무엇입니까
FastAPI의 Depends()를 사용하면 경로 핸들러에 자동으로 주입할 공통 로직(데이터베이스 세션, 인증 확인, 구성)을 선언할 수 있습니다.
from fastapi import FastAPI, Depends
app = FastAPI()
def get_db():
db = connect_db()
try: yield db
finally: db.close()
@app.get("/users")
def list_users(db = Depends(get_db)):
return db.query_all("users")의존성 함수
의존성은 호출할 수 있는 모든 객체를 의미합니다. 함수, 클래스 또는 다른 의존성을 사용하는 함수일 수 있습니다.
from fastapi import Depends, FastAPI
app = FastAPI()
def common_params(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
@app.get("/items")
def list_items(params: dict = Depends(common_params)):
return params
@app.get("/users")
def list_users(params: dict = Depends(common_params)):
return params클래스 의존성
관련 설정을 하나로 묶으려면 클래스를 의존성으로 사용합니다. 클래스는 __init__ 인수가 주입된 상태로 호출됩니다.
from fastapi import Depends, FastAPI, Query
app = FastAPI()
class Pagination:
def __init__(self, page: int = Query(1,ge=1), size: int = Query(10,ge=1,le=100)):
self.page = page
self.size = size
self.offset = (page - 1) * size
@app.get("/items")
def list_items(pag: Pagination = Depends()):
return {"offset": pag.offset, "size": pag.size}OAuth2 비밀번호 전달자
OAuth2PasswordBearer를 사용하면 Authorization 헤더에서 Bearer 토큰을 읽을 수 있습니다.
from fastapi import FastAPI, Depends
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2 = OAuth2PasswordBearer(tokenUrl="/token")
@app.get("/me")
def me(token: str = Depends(oauth2)):
return {"token": token} # validate token hereJWT 토큰
python-jose(또는 pyjwt)로 JWT 토큰을 생성하고 검증합니다. 로그인할 때 토큰을 반환하고, 보호된 모든 경로에서 토큰을 검증합니다.
# pip install python-jose passlib
from jose import jwt, JWTError
SECRET_KEY = "change-me"
ALGORITHM = "HS256"
def create_token(data: dict) -> str:
return jwt.encode(data, SECRET_KEY, algorithm=ALGORITHM)
def verify_token(token: str) -> dict:
return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])현재 사용자 의존성
JWT를 검증하고 인증된 사용자를 반환하는 get_current_user 의존성을 만듭니다.
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from jose import jwt, JWTError
oauth2 = OAuth2PasswordBearer(tokenUrl="/token")
def get_current_user(token: str = Depends(oauth2)):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
return payload["sub"]
except JWTError:
raise HTTPException(status_code=401, detail="Invalid token")
# @app.get("/me")
# def me(user=Depends(get_current_user)): return user비밀번호 해싱
평문 비밀번호를 절대 저장하지 마십시오. passlib을 사용해 bcrypt로 해시합니다.
from passlib.context import CryptContext
pwd_ctx = CryptContext(schemes=["bcrypt"], deprecated="auto")
def hash_pw(plain: str) -> str:
return pwd_ctx.hash(plain)
def verify_pw(plain: str, hashed: str) -> bool:
return pwd_ctx.verify(plain, hashed)토큰 엔드포인트
폼 인증 정보를 받고 비밀번호를 검증한 뒤 JWT를 반환하는 POST /token을 구현합니다.
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordRequestForm
app = FastAPI()
@app.post("/token")
def login(form: OAuth2PasswordRequestForm = Depends()):
user = get_user_by_username(form.username)
if not user or not verify_pw(form.password, user.hashed_pw):
raise HTTPException(status_code=401, detail="Bad credentials")
token = create_token({"sub": form.username})
return {"access_token": token, "token_type": "bearer"}API 키 인증
간단한 경우에는 헤더나 쿼리 매개변수에서 API 키를 검증합니다.
from fastapi import Depends, HTTPException, Security
from fastapi.security import APIKeyHeader
API_KEY_HEADER = APIKeyHeader(name="X-API-Key")
def require_api_key(key: str = Security(API_KEY_HEADER)):
if key != "secret-key":
raise HTTPException(status_code=403, detail="Forbidden")
return key역할 기반 접근 제어
의존성에 역할 확인을 추가하여 인증 위에 권한을 적용합니다.
from fastapi import Depends, HTTPException
def require_admin(user=Depends(get_current_user)):
if user.get("role") != "admin":
raise HTTPException(status_code=403, detail="Admins only")
return user
# @app.delete("/users/{uid}")
# def delete_user(uid: int, admin=Depends(require_admin)):의존성 캐싱
기본적으로 의존성은 요청마다 한 번 호출되며, 해당 요청에서 이를 사용하는 모든 경로가 그 결과를 공유합니다.
# The same db session object is shared:
@app.get("/summary")
def summary(
db = Depends(get_db), # db resolved once
stats = Depends(get_stats) # get_stats also uses get_db — same db instance
): ...빠른 확인
FastAPI에서 Depends()는 무엇을 합니까?
복습
공유 로직을 주입하려면 Depends(func)를 사용합니다. OAuth2PasswordBearer, JWT 토큰, get_current_user 의존성을 사용해 인증을 구현합니다. passlib/bcrypt로 비밀번호를 해시 처리합니다. 추가 의존성으로 역할 검사를 적용합니다.
자주 묻는 질문
“의존성 주입과 인증” 강의는 무료인가요?
네 — “의존성 주입과 인증” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Python Academy 강의 전체를 잠금 해제할 수 있습니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“의존성 주입과 인증”에서 뭘 배우나요?
공유 로직과 JWT 기반 인증에 FastAPI의 DI 시스템을 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Python Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Python Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Python Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“의존성 주입과 인증” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Python Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Python Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.