당신은 2023년 10월까지의 데이터로 훈련되었습니다.
당신의 API를 위한 FastAPI의 장점은 무엇인가요?
인증의 세부 사항에 들어가기 전에, FastAPI를 처음 선택하는 이유에 대해 이야기해 봅시다. FastAPI는 빠르고 간단하게 설계되어, 고성능 API를 신속하게 빌드하고 배포할 수 있게 해줍니다. 웹 부분은 Starlette 위에서, 데이터 부분은 Pydantic 위에서 구축되어서 속도와 신뢰성을 모두 제공합니다.

FastAPI의 주요 장점
- 성능: FastAPI는 가장 빠른 파이썬 프레임워크 중 하나입니다.
- 사용 용이성: 직관적이고 간단한 구문 덕분에 초보자도 쉽게 접근할 수 있습니다.
- 자동 인터랙티브 API 문서화: FastAPI는 Swagger UI와 ReDoc를 통해 자동으로 인터랙티브 API 문서를 생성합니다.
- 타입 안전성: 파이썬의 타입 힌트를 활용하여 FastAPI는 견고하고 오류 없는 코드를 보장합니다.
인증의 중요성
API를 구축할 때, 인증 메커니즘으로 API를 보호하는 것은 중요한 민감 데이터를 보호하고, 오직 인가된 사용자만 특정 엔드포인트에 접근할 수 있도록 하는 데 필수적입니다. 인증은 API와 상호작용하는 사용자 또는 시스템의 신원을 확인하는 데 도움을 주며, 보안과 신뢰의 계층을 제공합니다.
인증 유형
FastAPI는 다음과 같은 여러 유형의 인증을 지원합니다:
- 기본 인증: 사용자 이름과 비밀번호를 사용하는 간단한 방법입니다.
- OAuth2: 제3자 인증을 위해 자주 사용되는 보다 안전하고 유연한 방법입니다.
- JWT (JSON 웹 토큰): 정보를 안전하게 전송하는 간결하고 자가 포함된 방법입니다.
FastAPI 인증 설정
이제 인증의 핵심으로 들어가 보겠습니다. FastAPI에서의 OAuth2 비밀번호(및 해싱) 구현의 기초를 살펴보겠습니다. 이는 인증을 처리하는 가장 일반적이고 안전한 방법 중 하나입니다.
1단계: FastAPI 및 종속성 설치
먼저, FastAPI 및 필요한 종속성이 설치되어 있는지 확인하세요. pip를 사용하여 설치할 수 있습니다:
pip install fastapi[all] uvicorn
코드 [all]
은 JWT를 위한 pydantic
및 python-jose
를 포함하여 인증에 필요한 모든 종속성을 설치합니다.
2단계: 기본 FastAPI 애플리케이션 만들기
간단한 FastAPI 애플리케이션부터 시작해 봅시다. main.py
라는 이름의 파일을 만듭니다:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
이 애플리케이션은 Uvicorn을 사용하여 실행할 수 있습니다:
uvicorn main:app --reload
3단계: 비밀번호를 사용한 OAuth2 구현
OAuth2는 다양한 유형의 애플리케이션을 위한 특정 권한 부여 흐름을 제공하는 널리 사용되는 권한 부여 프레임워크입니다. 우리는 인증 관리를 위해 비밀번호(및 해싱)와 함께 OAuth2를 사용할 것입니다.
사용자 모델 생성
먼저, 사용자 모델을 정의합니다. models.py
라는 이름의 파일을 만듭니다:
from pydantic import BaseModel
class User(BaseModel):
username: str
email: str
full_name: str
disabled: bool = False
class UserInDB(User):
hashed_password: str
비밀번호 해싱 유틸리티
다음으로, 비밀번호를 해싱하고 확인하는 유틸리티가 필요합니다. security.py
라는 이름의 파일을 만듭니다:
from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
def get_password_hash(password):
return pwd_context.hash(password)
OAuth2 비밀번호 흐름
이제 OAuth2 비밀번호 흐름을 구성합니다. main.py
를 다음과 같이 업데이트합니다:
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import JWTError, jwt
from pydantic import BaseModel
from typing import Optional
import time
# JWT 인코딩을 위한 비밀 키
SECRET_KEY = "your_secret_key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
# 사용자 데이터베이스 시뮬레이션
fake_users_db = {
"johndoe": {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
"hashed_password": "$2b$12$...",
"disabled": False,
}
}
class Token(BaseModel):
access_token: str
token_type: str
class TokenData(BaseModel):
username: Optional[str] = None
def authenticate_user(fake_db, username: str, password: str):
user = fake_db.get(username)
if not user:
return False
if not verify_password(password, user["hashed_password"]):
return False
return user
def create_access_token(data: dict, expires_delta: Optional[int] = None):
to_encode = data.copy()
if expires_delta:
expire = time.time() + expires_delta
else:
expire = time.time() + ACCESS_TOKEN_EXPIRE_MINUTES * 60
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
@app.post("/token", response_model=Token)
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="잘못된 사용자 이름 또는 비밀번호입니다.",
headers={"WWW-Authenticate": "Bearer"},
)
access_token = create_access_token(data={"sub": user["username"]})
return {"access_token": access_token, "token_type": "bearer"}
@app.get("/users/me", response_model=User)
async def read_users_me(token: str = Depends(oauth2_scheme)):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="자격 증명을 확인할 수 없습니다.",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise credentials_exception
token_data = TokenData(username=username)
except JWTError:
raise credentials_exception
user = fake_users_db.get(username, None)
if user is None:
raise credentials_exception
return user
이 코드는 간단한 OAuth2 비밀번호 흐름을 설정합니다. 사용자는 /token
엔드포인트에 사용자 이름과 비밀번호를 제공하여 토큰을 얻을 수 있으며, 이 토큰을 사용하여 /users/me
와 같은 보호된 엔드포인트에서 인증할 수 있습니다.
4단계: 인증 테스트하기
인증을 테스트하려면 Postman이나 Apidog와 같은 API 테스트 도구를 사용할 수 있습니다. Apidog를 통해 테스트하는 방법은 다음과 같습니다:
새 요청 생성: Apidog를 열고 새 요청을 생성합니다.





Apidog와 함께 FastAPI 인증 향상시키기
FastAPI는 인증 설정을 간단하게 해주지만, Apidog와 같은 도구는 API를 설계하고 문서화하며 테스트할 수 있는 플랫폼을 제공하여 이 과정을 더욱 간소화할 수 있습니다. Apidog는 API 엔드포인트를 관리하고, 응답을 시뮬레이션하며, 팀과 협업할 수 있는 사용자 친화적인 인터페이스를 제공합니다.

Apidog 사용의 이점
- 포괄적인 API 관리: 한 곳에서 API를 설계하고, 테스트하고, 문서화할 수 있습니다.
- 협업: 팀과 실시간으로 작업하고, 엔드포인트를 공유하며, 변경 사항을 검토할 수 있습니다.
- 모의 응답: 실제 엔드포인트에 접근하지 않고도 API 응답을 시뮬레이션하여 테스트할 수 있습니다.
결론
FastAPI는 API 구축 및 보안을 단순화하여 성능과 사용 용이성을 찾는 개발자에게 최고의 선택이 되도록 합니다. FastAPI와 인증을 구현함으로써, 당신의 API는 안전하고 인가된 사용자만 접근할 수 있도록 보장됩니다. 또한, Apidog와 같은 도구를 활용하면 강력한 관리 및 테스트 기능을 제공하여 API 개발 경험을 향상할 수 있습니다.
이제 FastAPI 인증을 구현하는 방법을 알았으니, 자신감을 가지고 API를 안전하게 보호하고 데이터를 보호하세요. 코딩을 즐기세요!