어느 정도 기술 개발이 완료된 상태에서 기본적인 보안 설정을 하는 방법에 대해 알아보았다.
공공 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"을 입력해야 가능!