0Pricing
Python Academy · 강의

의존성 주입과 인증

공유 로직과 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 here

JWT 토큰

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. FastAPI 프로젝트 설정과 첫 엔드포인트
  2. 경로 매개변수, 쿼리 매개변수 및 요청 본문
  3. 의존성 주입과 인증
  4. 비동기 엔드포인트와 데이터베이스 통합
← Python Academy(으)로 돌아가기