Skip to content
isdnetworks
Go back

한 상대에 인증 체계 셋

외부 거래 데이터를 받아 오는 연동을 손봐야 했다. 만든 사람도 담당자도 없어서 코드만 보고 파악해야 했다.

Table of contents

Open Table of contents

상황 — 세 군데서 부르고 있었다

curl 로 같은 상대를 부르는 코드를 전부 찾으니 셋이 나왔다.

첫째는 Authorization 없이 헤더에 식별자만 넣는 방식이었다.

$headers = ['X-Client-Id' => config('...app_key')];
$response = $client->get($url, ['headers' => $headers]);

X-Client-Idapp_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_keyCLIENT_ID 를 서로 공유하지 않는다는 것이 가장 큰 특징이었다.

같은 상대를 부르는데 상대 쪽에서 보면 서로 다른 셋으로 보인다. 우리 쪽에서 하나로 묶으려 해도 상대가 발급한 식별자가 다르니 묶일 자리가 없다.

환경 변수도 각각이었다

환경 변수도 경로마다 따로였다.

APP_KEY          →  ①
(외부 서비스 관리) →  ②
CLIENT_ID        →  ③

APP_KEY 를 바꿔도 CLIENT_ID 쪽에는 영향이 없다.

격리라는 점에서는 좋고 관리 대상이 셋이라는 점에서는 나쁜데 상대가 정책을 바꾸면 세 곳을 각각 찾아 고쳐야 한다.

격리와 관리 부담이 정확히 맞바꿔진 구조였다. 어느 쪽이 나은지는 상대가 얼마나 자주 바뀌느냐에 달렸다.

주의 — 요즘은 다 토큰이라는 가정

처음에는 X-Client-Id 쪽도 토큰을 쓸 것으로 봤는데 요즘 나오는 것이 대개 그러니 그렇게 읽었다.

지적을 받고 다시 봤다.

①도 토큰을 쓰지 않나?

다시 읽으니 X-Client-Id 에 식별자만 넣고 있었다. 앱 설치 자체가 인증 역할을 하는 비토큰 방식이다.

요즘은 다 이렇게 한다는 가정이 코드를 읽는 눈을 흐렸고 없는 것을 있는 것처럼 읽은 셈이다.

담당자가 없는 코드를 읽을 때 이런 가정이 특히 위험한데 물어볼 곳이 없으니 잘못 읽은 것이 그대로 결론이 된다.

선택지 — 통합 가능한가

셋을 하나로 합칠 수 있는지도 봤다.

①은 앱 설치 기반이라 토큰 방식으로 못 바꾼다
②는 외부 서비스가 관리해서 우리가 못 건드린다
③만 우리 것이다

셋 중 우리가 손댈 수 있는 것은 CLIENT_ID 를 쓰는 하나뿐이었다.

식별자를 공유하지 않는 이상 우리 쪽에서만 합치는 것은 불가능하고 합치려면 상대와 협의해서 식별자부터 정리해야 한다.

그래서 지금은 셋을 유지하기로 하고 어떤 조건이 되면 합칠 수 있는지를 적어 뒀다. 할 수 없는 이유를 안 적으면 다음 사람이 같은 검토를 처음부터 다시 한다.

대응 — 문서로 남긴 것

만든 사람이 없으니 파악한 것을 다음 사람을 위해 남겼다.

경로 A  →  체계 ①  →  토큰 불필요. 앱 설치만
경로 B  →  체계 ②  →  외부 서비스 토큰. 주기 갱신
경로 C  →  체계 ③  →  우리 인증. 쓰기 권한

환경 변수: (각각 명시)
통합 불가: 식별자를 공유하지 않음

경로 A 부터 경로 C 가 다르다는 것을 안 적으면 다음 사람도 같은 조사를 며칠에 걸쳐 다시 한다.

확인한 것과 짐작한 것은 갈라서 적었다. 왜 셋이 됐는지는 코드에 없어서 붙인 시기가 달라서로 보인다고만 적었다.

코드는 어떻게 하는지를 정확히 말하지만 왜 그렇게 했는지는 말하지 않는다. 그 절반을 짐작으로 메운 뒤 짐작이라고 표시하지 않으면 다음 사람이 그것을 근거로 판단하게 된다.

정리


Share this post on:

Previous Post
계산값이던 화면의 날짜
Next Post
서버마다 다르던 런타임 버전