수 많은 우문은 현답을 만든다

API 서비스 개발(3) - API 본문

토이 프로젝트

API 서비스 개발(3) - API

aiden.jo 2024. 8. 3. 18:08

개요

오늘은 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