외부 거래 데이터를 받아 오는 연동을 손봐야 했다. 만든 사람도 담당자도 없어서 코드만 보고 파악해야 했다.
Table of contents
Open Table of contents
상황 — 세 군데서 부르고 있었다
curl 로 같은 상대를 부르는 코드를 전부 찾으니 셋이 나왔다.
첫째는 Authorization 없이 헤더에 식별자만 넣는 방식이었다.
$headers = ['X-Client-Id' => config('...app_key')];
$response = $client->get($url, ['headers' => $headers]);
X-Client-Id 에 app_key 만 넣고 토큰이 없이 읽기 접근이 된다.
둘째는 별도 서비스가 준 Bearer 토큰을 쓴다.
$token = $this->authService->getToken();
$headers = ['Authorization' => "Bearer {$token}"];
authService 가 발급과 갱신을 맡고 스케줄러가 주기적으로 돌린다.
셋째는 우리가 직접 인증하고 받은 토큰을 저장해 둔다.
$token = DB::connection('auth')->table('tokens')->where(...)->value('access_token');
access_token 을 우리 DB에 담아 두고 권한에 쓰기가 포함돼 있다.
비교 — 세 인증 체계
셋의 식별자 와 토큰 과 권한 을 나란히 놓았다.
식별자 토큰 권한
① 앱 키 없음 읽기
② (외부 서비스) Bearer 읽기/쓰기
③ 클라이언트 ID Bearer 읽기/쓰기
app_key 와 CLIENT_ID 를 서로 공유하지 않는다는 것이 가장 큰 특징이었다.
같은 상대를 부르는데 상대 쪽에서 보면 서로 다른 셋으로 보인다. 우리 쪽에서 하나로 묶으려 해도 상대가 발급한 식별자가 다르니 묶일 자리가 없다.
환경 변수도 각각이었다
환경 변수도 경로마다 따로였다.
APP_KEY → ①
(외부 서비스 관리) → ②
CLIENT_ID → ③
APP_KEY 를 바꿔도 CLIENT_ID 쪽에는 영향이 없다.
격리라는 점에서는 좋고 관리 대상이 셋이라는 점에서는 나쁜데 상대가 정책을 바꾸면 세 곳을 각각 찾아 고쳐야 한다.
격리와 관리 부담이 정확히 맞바꿔진 구조였다. 어느 쪽이 나은지는 상대가 얼마나 자주 바뀌느냐에 달렸다.
주의 — 요즘은 다 토큰이라는 가정
처음에는 X-Client-Id 쪽도 토큰을 쓸 것으로 봤는데 요즘 나오는 것이 대개 그러니 그렇게 읽었다.
지적을 받고 다시 봤다.
①도 토큰을 쓰지 않나?
다시 읽으니 X-Client-Id 에 식별자만 넣고 있었다. 앱 설치 자체가 인증 역할을 하는 비토큰 방식이다.
요즘은 다 이렇게 한다는 가정이 코드를 읽는 눈을 흐렸고 없는 것을 있는 것처럼 읽은 셈이다.
담당자가 없는 코드를 읽을 때 이런 가정이 특히 위험한데 물어볼 곳이 없으니 잘못 읽은 것이 그대로 결론이 된다.
선택지 — 통합 가능한가
셋을 하나로 합칠 수 있는지도 봤다.
①은 앱 설치 기반이라 토큰 방식으로 못 바꾼다
②는 외부 서비스가 관리해서 우리가 못 건드린다
③만 우리 것이다
셋 중 우리가 손댈 수 있는 것은 CLIENT_ID 를 쓰는 하나뿐이었다.
식별자를 공유하지 않는 이상 우리 쪽에서만 합치는 것은 불가능하고 합치려면 상대와 협의해서 식별자부터 정리해야 한다.
그래서 지금은 셋을 유지하기로 하고 어떤 조건이 되면 합칠 수 있는지를 적어 뒀다. 할 수 없는 이유를 안 적으면 다음 사람이 같은 검토를 처음부터 다시 한다.
대응 — 문서로 남긴 것
만든 사람이 없으니 파악한 것을 다음 사람을 위해 남겼다.
경로 A → 체계 ① → 토큰 불필요. 앱 설치만
경로 B → 체계 ② → 외부 서비스 토큰. 주기 갱신
경로 C → 체계 ③ → 우리 인증. 쓰기 권한
환경 변수: (각각 명시)
통합 불가: 식별자를 공유하지 않음
경로 A 부터 경로 C 가 다르다는 것을 안 적으면 다음 사람도 같은 조사를 며칠에 걸쳐 다시 한다.
확인한 것과 짐작한 것은 갈라서 적었다. 왜 셋이 됐는지는 코드에 없어서 붙인 시기가 달라서로 보인다고만 적었다.
코드는 어떻게 하는지를 정확히 말하지만 왜 그렇게 했는지는 말하지 않는다. 그 절반을 짐작으로 메운 뒤 짐작이라고 표시하지 않으면 다음 사람이 그것을 근거로 판단하게 된다.
정리
- 같은 상대에 대해 인증 체계가 여럿일 수 있다
- 복사해 쓴 것으로 짐작하지 말고 세 곳을 나란히 놓는다
- 앱 설치 기반 비토큰 방식도 있다
- 요즘은 다 토큰이라는 가정이 코드를 읽는 눈을 흐린다
- 담당자가 없으면 잘못 읽은 것이 그대로 결론이 된다
- 설정이 여러 벌이면 격리는 되고 관리 대상이 는다
- 식별자를 공유하지 않으면 우리만으로는 못 합친다
- 할 수 없는 이유를 적어야 검토가 반복되지 않는다
- 만든 사람이 없으면 코드가 유일한 문서다
- 코드는 어떻게만 말하고 왜는 말하지 않는다
- 확인한 것과 짐작한 것을 갈라서 적는다