일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 생성형 AI
- kubernetes
- Python
- SpringBoot
- 생성형
- 솔루션조사
- 리트코드
- Machine Learning
- 로깅
- fast api
- LeetCode
- vue.js
- GPT
- Redis
- LLaMa
- 쿠버네티스
- vuejs
- 컨설팅
- 메세지큐
- jpa
- OpenShift
- 오픈시프트
- 컨설턴트
- BFS
- fastapi
- 도커
- 머신러닝
- Docker
- k8s
- POD
- Today
- Total
수 많은 우문은 현답을 만든다
API 서비스 개발(3) - API 본문
개요
오늘은 API 개발을 진행해보자. 1장에서 JWT 발급을 하도록 했으니 우리는 Access_Token으로 API에 접근할 수 있도록 젭근제어를 해보자.
API 목록
API는 위와 같이 3개로 나눠 구성했다.
1. Administrator : 사용자별 구분이 되도록 client를 생성하는 메소드 create_client 와 토큰을 발급하는 /token 메소드
2. User : 사용자가 access_token 만료시 refresh_token 으로 토큰 재발급을 요청할 수 있는 /token/refresh 메소드
3. Collector : Mockup API로 접근제어를 해 볼 테스트 메소드
Token 종류
1. Access Token
Access Token(엑세스 토큰)은 클라이언트가 API 요청을 할 때 서버에 인증을 위해 사용하는 토큰입니다. 이 토큰은 보통 짧은 유효 기간을 가지며, JWT(JSON Web Token) 형식을 사용하여 발급됩니다.
특징:
- 유효기간: 짧은 유효기간(몇 분에서 몇 시간)이 설정됩니다.
- 내용: 사용자 또는 클라이언트의 인증 정보를 포함하며, 이 정보를 통해 서버는 클라이언트의 신원을 확인할 수 있습니다.
- 보안: 토큰 자체에 사용자 정보와 서명이 포함되어 있어 빠르게 검증이 가능합니다. 따라서 서버는 별도의 세션 저장소를 유지할 필요가 없습니다.
- 사용 사례: API 요청 시 Authorization 헤더에 Bearer <token> 형식으로 포함되어 전송됩니다.
2. Refresh Token
Refresh Token(리프레시 토큰)은 Access Token이 만료되었을 때 새로운 Access Token을 발급받기 위해 사용하는 토큰입니다. Refresh Token은 보통 Access Token보다 더 긴 유효 기간을 가집니다.
특징:
- 유효기간: 일반적으로 Access Token보다 훨씬 긴 유효기간(몇 주에서 몇 달)이 설정됩니다.
- 내용: 클라이언트의 식별 정보가 포함되며, 보통 서버에서 별도로 관리되거나 저장됩니다.
- 보안: Access Token과 달리 클라이언트에 직접 사용되지 않고, 서버와의 통신을 통해 새로운 Access Token을 발급받기 위해 사용됩니다.
- 사용 사례: 클라이언트는 Access Token이 만료된 경우 Refresh Token을 서버에 보내 새 Access Token을 요청합니다.
3. Refresh Token Rotation
Refresh Token Rotation은 새로운 Access Token을 발급받을 때마다 기존의 Refresh Token을 폐기하고 새로운 Refresh Token을 발급하는 보안 전략입니다. 이 전략은 Refresh Token의 유출로 인한 보안 위협을 줄이기 위해 사용됩니다.
작동 방식:
- 클라이언트가 새로운 Access Token을 요청할 때 기존의 Refresh Token을 서버에 전송합니다.
- 서버는 해당 Refresh Token을 검증한 후, 새로운 Access Token과 새로운 Refresh Token을 발급합니다.
- 이때, 서버는 기존의 Refresh Token을 무효화하거나 삭제하여 재사용을 방지합니다.
- 클라이언트는 새로운 Refresh Token을 저장하고, 다음 요청 시 이 토큰을 사용합니다.
장점:
- 보안 강화: Refresh Token이 유출되더라도 이전에 발급된 토큰은 무효화되기 때문에 공격자가 이를 재사용할 수 없습니다.
- 위험 최소화: 만약 Refresh Token이 탈취되었다면, 공격자는 이를 이용해 한 번만 새로운 Access Token을 발급받을 수 있으며, 이후 토큰은 무효화됩니다.
접근제어
이제 사용자가 API 요청을 보낼때 Access_token이 유효하지 않으면 오류를 발생시키도록 접근제어를 해보자.
# jwt_common.py
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
def verify_token(token: str = Depends(oauth2_scheme)) -> dict:
try:
payload = jwt.decode(token, SECRET_KEY, algorithms = [ALGORITHM])
return payload
except JWTError:
raise HTTPException(status_code = 401, detail = "Invalid token")
# collector.py
@app.get("/collect")
def collect(payload: dict = Depends(verify_token)): # Authorization Header를 통해 Bearer <token> 형식으로 토큰을 전달받아야 API 인가.
return payload
결과
Swagger 상에서 토큰 발급을 하지 않으면 아래와 같이 동작하지 않는다.
감사합니다.
'토이 프로젝트' 카테고리의 다른 글
메세지 큐 - 1. MQ 비교 및 설치 (2) | 2024.11.06 |
---|---|
웹서비스 성능 향상 방법 (0) | 2024.10.30 |
API 서비스 개발(2) - DB (0) | 2024.08.01 |
API 서비스 개발(1) - JWT (0) | 2024.07.29 |