LabHub
배우기 러닝패스 코스

통합과 배포 · 만료는 사고가 아니다 · 실습

야간 배치가 매번 몇 건씩 401 로 죽는다

LabHub 에서 이어서 보기

목표

짧은 수명의 접근 토큰을 들고 남의 API 를 계속 부르는 클라이언트를 만든다. 만료 전에 미리 갱신하고, 시계 오차 여유를 두고, 401 을 한 번만 받고 갱신 후 재시도하며, 워커가 여럿이어도 갱신이 한 번만 일어나게 한다.

왜 중요한가

"야간 배치가 매번 두세 건씩 401 로 실패합니다" 의 원인은 거의 언제나 같다. 토큰을 한 번 받아 두고 401 이 오면 그때 새로 받는 구조는 만료 순간마다 반드시 한 번은 실패한다.
토큰이 짧게 사는 것은 결함이 아니라 설계다. 수명이 짧아야 새어 나갔을 때 쓸 수 있는 기간이 짧다. 그래서 고쳐야 하는 쪽은 서버가 아니라 우리 클라이언트다.
그리고 고칠 때 세 가지를 함께 봐야 한다. 시계는 정확히 같지 않으므로 여유가 필요하고, 401 이 토큰 문제가 아닐 수도 있으므로 재시도 횟수에 상한이 필요하고, 워커가 여럿이면 만료 순간에 갱신이 한꺼번에 몰리므로 갱신을 한 번으로 묶어야 한다.
채점기는 여러분의 문장을 믿지 않는다. 인증 서버를 채점기가 고른 포트에 직접 띄우고 발급 횟수와 자원 호출 횟수를 서버 쪽에서 세어, 여러분의 클라이언트가 실제로 몇 번 갱신하고 몇 번 다시 걸었는지 대조한다.

단계

1. /root/token/authsrv.py 를 만들어 포트 8015 에 띄우고, 토큰 하나를 받아 /root/token/token.json 에 저장하세요.
2. /root/token/decode.py 를 만들어 토큰 안의 헤더와 페이로드를 읽어 /root/token/claims.json 에 적으세요.
3. /root/token/should_refresh.py 를 만들어 만료·미도래·임박·정상 네 갈래를 시계 오차 여유까지 감안해 가려내게 하세요.
4. /root/token/client.py 를 만들어 만료 전에 미리 갱신하며 여러 번 호출해도 401 이 한 건도 나지 않게 하세요.
5. client.py 가 401 을 받으면 갱신 후 딱 한 번만 다시 걸게 하세요.
6. client.py 가 워커 여럿이 동시에 시작해도 토큰 발급이 한 번만 일어나게 하세요.
7. /root/token/token_policy.json 에 정책 표를 적으세요.
8. /root/token/token_report.md 에 네 절로 보고하세요.

참고

단계 8개

  1. 짧게 사는 토큰 받아 보기
  2. 토큰 안을 열어 보기
  3. 언제 갈아야 하는가
  4. 만료 전에 미리 갈기
  5. 401 은 한 번만 받는다
  6. 만료 순간에 스무 개가 한꺼번에 갱신한다
  7. 정책 표로 못박기
  8. 토큰 점검 보고서