LLM 엔지니어링13장 · REST API 와 FastAPI11 / 22← 이전목차다음 →MetaContents

13장. REST API 와 FastAPI

권한: 무엇을 해도 되나

사원증으로 건물에 들어와도, 서버실은 IT 팀만, 금고는 재무팀만 들어갑니다. 누구인지 확인한 뒤에 "이 사람이 이 일을 해도 되나"를 정하는 것이 권한입니다. 사람마다 일일이 정하지 않고 역할(role)을 정해 역할에 할 수 있는 일을 붙입니다.

상담원은 예측 하나, 분석가는 묶음 예측까지, 관리자는 모델 정보까지 할 수 있다는 것을 견준 세 카드

세 카드는 실습 6의 역할입니다. 상담원은 주문 하나의 예측만, 분석가는 묶음 예측까지, 관리자는 모델 정보 보기까지 할 수 있습니다. 토큰에 담긴 역할을 보고, 그 엔드포인트에 허락된 역할이 아니면 403 을 돌려줍니다. 여기서 서버실과 금고가 엔드포인트, 들어갈 수 있는 팀이 역할입니다.

엔드포인트와 역할

엔드포인트상담원분석가관리자
POST /predictOOO
POST /predict/batchXOO
GET /modelXXO

역할 확인의 꼴

FastAPI 에서는 "역할을 확인하는 함수"를 Depends 로 경로 함수에 붙입니다. 아래는 그 판단만 떼어 낸 예입니다.

Python
ALLOWED = {"/predict": {"상담원", "분석가", "관리자"}, "/predict/batch": {"분석가", "관리자"}, "/model": {"관리자"}}

def decide(user_role, path):
    """허락된 역할이면 200, 아니면 403"""
    return 200 if user_role in ALLOWED[path] else 403

print([decide("상담원", p) for p in ALLOWED], [decide("관리자", p) for p in ALLOWED])

코드에 나오는 함수

코드쉬운 뜻
ALLOWED = {"/predict": {...}, ...}주소마다 허락된 역할의 집합(set)을 적은 사전이다
user_role in ALLOWED[path]그 주소의 허락 집합에 사용자의 역할이 들어 있는지 본다
200 if ... else 403조건이 참이면 200, 거짓이면 403 을 고른다
[decide("상담원", p) for p in ALLOWED]사전을 돌면 키(주소)가 차례로 나온다. 주소마다 판단을 모은다

이 코드가 뜻하는 것

회사 건물의 출입 등급표에는 문마다 들어갈 수 있는 팀이 적혀 있습니다. 경비는 사원증의 팀을 보고 표에 있으면 열어 주고, 없으면 막습니다. 여기서 출입 등급표가 ALLOWED, 문이 엔드포인트, 사원증의 팀이 user_role, 열어 주기와 막기가 200 과 403 입니다.

줄하는 일쉽게 말하면
ALLOWED = {...}주소마다 들어갈 수 있는 역할을 적는다출입 등급표
def decide(user_role, path): ...역할이 표에 있으면 200, 없으면 403경비의 판단
print([... "상담원" ...], [... "관리자" ...])두 역할로 세 주소를 모두 시험한다두 사람이 문 세 개를 차례로 지나 본다

실행하면 [200, 403, 403] [200, 200, 200] 이 나옵니다. 차례는 /predict, /predict/batch, /model 입니다. 상담원은 첫 주소만 통과하고, 관리자는 세 주소를 모두 통과해 위의 역할 표와 같습니다.

주의할 점

  • 권한은 늘 서버에서 확인합니다. 화면에서 단추를 숨기는 것만으로는 막을 수 없습니다. 요청은 화면을 거치지 않고도 보낼 수 있기 때문입니다.
  • 역할은 꼭 필요한 만큼만 줍니다(최소 권한). 11장의 문서 등급처럼, 권한은 데이터에도 걸 수 있습니다(프로젝트).
← 이전 절13장 · 인증: 누구인가다음 절 →13장 · 오류 처리와 요청 기록