[부록] 매쉬 클라이언트
인증, 토큰 관리, 데이터 요청 기능을 수행할 수 있는 클라이언트 코드 스니펫입니다.
Python
class MashClient:
def __init__(self, base_url="https://api.mash-board.io"):
"""
Mash 서버와 통신하기 위한 클라이언트 모듈입니다.
:param base_url: Mash API의 기본 URL
"""
self.base_url = base_url
self.access_token = None
self.refresh_token = None
def _request(self, method, path, params=None, **kwargs):
"""
보호된 엔드포인트에 대한 요청을 보냅니다.
만약 토큰이 만료된 경우 자동으로 갱신 후 다시 시도합니다.
:param method: HTTP 메소드 (GET, POST 등)
:param path: 엔드포인트 경로
:param params: 쿼리 파라미터 (딕셔너리 형태)
:param kwargs: requests 라이브러리의 추가 인자
:return: requests 라이브러리의 Response 객체
"""
if not self.access_token:
raise ValueError("인증이 필요합니다. 먼저 authenticate 메소드를 호출해주세요.")
# path가 완전한 URL인지 확인하여 처리
if path.startswith("https://"):
url = path
else:
url = f"{self.base_url}{path}"
headers = {"Content-Type": "application/json", "Authorization": f"Bearer {self.access_token}"}
response = requests.request(method, url, headers=headers, params=params, **kwargs)
if response.status_code == 401: # 토큰 만료 시 인증 토큰 갱신 후 다시 요청
self._refresh_token()
headers["Authorization"] = f"Bearer {self.access_token}"
response = requests.request(method, url, headers=headers, params=params, **kwargs)
response.raise_for_status()
return response
def authenticate(self, email, password):
"""
사용자를 인증하고 인증 토큰을 가져옵니다.
:param email: 사용자 이메일
:param password: 사용자 비밀번호
"""
response = requests.post(
f"{self.base_url}/api/token/",
headers={"Content-Type": "application/json"},
json={"email": email, "password": password}
)
response.raise_for_status()
data = response.json()
self.access_token = data["access"]
self.refresh_token = data["refresh"]
def _refresh_token(self):
"""
새로고침 토큰을 사용하여 인증 토큰을 갱신합니다.
"""
response = requests.post(
f"{self.base_url}/api/token/refresh/",
headers={"Content-Type": "application/json"},
json={"refresh": self.refresh_token}
)
response.raise_for_status()
data = response.json()
self.access_token = data["access"]
def get_data(self, endpoint, params=None):
"""
데이터를 요청합니다. 토큰이 만료된 경우 자동으로 갱신 후 다시 요청합니다.
:param endpoint: 요청할 엔드포인트
:param params: 쿼리 파라미터 (딕셔너리 형태)
:return: 요청에 대한 응답 (JSON 형식)
"""
response = self._request(method="GET", path=endpoint, params=params)
return response.json()
클라이언트 활용 예시
if __name__ == "__main__":
# 클라이언트 모듈 초기화
client = MashClient()
# 사용자 인증 및 토큰 획득
client.authenticate(email="user@example.com", password="password123")
# 데이터 요청 파라미터 설정
params = {
"start_date": "2023-01-01",
"end_date": "2023-01-31",
"page_size": 10
}
# 데이터 요청
data = client.get_data(endpoint="/event/place-visit", params=params)
# 데이터 출력
print(data)
주의 사항
MashClient 코드 스니펫을 사용할 때 주의해야 할 몇 가지 사항이 있습니다
-
보안 주의: 코드 스니펫에는 토큰 관리, 비밀번호 하드코딩 등 보안적으로 취약한 부분이 있습니다. 실제 프로덕션 코드에서는 이러한 부분을 개선하고, 보안 관련 모범 사례를 따르는 것이 중요합니다.
-
에러 처리 강화: 현재 코드에서는 주로 HTTP 상태 코드를 확인하여 예외를 처리하고 있습니다. 실제 서비스에서는 더 다양한 예외 상황을 고려하고 적절한 에러 핸들링을 구현해야 합니다.
-
페이지네이션 관리: 현재 코드에서는 페이지네이션에 대한 처리가 이루어지지 않았습니다. 페이징된 데이터를 처리하는 방법에 대한 추가 로직이 필요할 수 있습니다.
-
API 버전 관리: 만약 Mash API에 새로운 엔드포인트가 추가되거나 API가 변경된 경우, 클라이언트 코드를 업데이트해야 합니다. API 버전 관리를 고려하고 필요할 경우 클라이언트 코드를 수정해야 합니다.
-
유효성 검사: 사용자로부터 입력 받는 값들에 대한 유효성 검사가 부족합니다. 입력 값의 형식이나 범위 등을 체크하여 안전하게 처리하는 로직을 추가해야 합니다.