[Fastapi] 보안을 위해get_token_header 설정하기

jongmin-oh·2023년 11월 10일
0

서비스 출시하기

목록 보기
6/6

배경

어느 정도 기술 개발이 완료된 상태에서 기본적인 보안 설정을 하는 방법에 대해 알아보았다.
공공 API를 사용하다 보면, Key를 같이 넣어줘야하는 경우가 종종있는데, 비슷하게 구현하고자한다.

원래는 시크릿(복호화)키를 같이 놓고 일정 주기마다 갱신을하면서, 세션을 유지하는 기법이
안전한 방법이라고 백엔드 개발자님께서 말씀해주셨지만,

현재 내가 구축한 서버는 유저가 직접 접근하진 않고, 서버간 통신이기 때문에 보안 토큰을 생성하여 고정하고, 그 보안 토큰을 가지고 통신하는 방법을 간단하게 구현했다.

토큰 발행

토큰의 종류는 여러가지가 있지만, 널리쓰이는 JWT 토큰으로 사용했다.

https://jwt.io/ 에 가면 토큰을 생성할 수 있다.

가장 앞에 나와있는 토큰으로 정했다.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

적용 방법

.env 작성

ACCESS_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

config.py 작성

from pydantic import BaseSettings

class MainConfig(BaseSettings):

    ACCESS_TOKEN: Optional[str] = None

    class Config:
        env_file: str = ".env"
        
settings = MainConfig()

dependencies.py 작성

from fastapi import Header, HTTPException
from app.config import settings


async def get_token_header(x_token: str = Header(...)):
    if x_token != settings.ACCESS_TOKEN:
        raise HTTPException(status_code=400, detail="X-Token header invalid")

Fastapi router에 적용

from fastapi import Depends, APIRouter
from app.dependencies import get_token_header

router = APIRouter(
    prefix="/chatbot",
    tags=["chatbot"],
    dependencies=[Depends(get_token_header)],
    responses={
        404: {"description": "Not found"},
        408: {"description": "Request timeout"},
    },
)

결과

Swagger에 가보면

x-token을 삽입하는 부분이 생겼고, 이 값을 채우지않으면 request를 보낼 수 없게된다.

"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"을 입력해야 가능!

profile
스타트업에서 자연어처리 챗봇을 연구하는 머신러닝 개발자입니다.

0개의 댓글