13장. REST API 와 FastAPI
권한: 무엇을 해도 되나
사원증으로 건물에 들어와도, 서버실은 IT 팀만, 금고는 재무팀만 들어갑니다. 누구인지 확인한 뒤에 "이 사람이 이 일을 해도 되나"를 정하는 것이 권한입니다. 사람마다 일일이 정하지 않고 역할(role)을 정해 역할에 할 수 있는 일을 붙입니다.
세 카드는 실습 6의 역할입니다. 상담원은 주문 하나의 예측만, 분석가는 묶음 예측까지, 관리자는 모델 정보 보기까지 할 수 있습니다. 토큰에 담긴 역할을 보고, 그 엔드포인트에 허락된 역할이 아니면 403 을 돌려줍니다. 여기서 서버실과 금고가 엔드포인트, 들어갈 수 있는 팀이 역할입니다.
엔드포인트와 역할
| 엔드포인트 | 상담원 | 분석가 | 관리자 |
|---|---|---|---|
POST /predict | O | O | O |
POST /predict/batch | X | O | O |
GET /model | X | X | O |
역할 확인의 꼴
FastAPI 에서는 "역할을 확인하는 함수"를 Depends 로 경로 함수에 붙입니다. 아래는 그 판단만 떼어 낸 예입니다.
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장의 문서 등급처럼, 권한은 데이터에도 걸 수 있습니다(프로젝트).