개발 기록Dev Log
← 목록

push 한 번에 Vercel이 자동 배포되는 이유

push 한 번에 Vercel이 자동 배포되는 이유를 GitHub App 설치, webhook, private key 서명 검증 과정으로 파봤다.


왜 이걸 팠나

나만의 블로그를 웹사이트로 만들었다. 그리고 유명한 vercel로 배포를 했는데 하다보니 'vercel에서 레포를 import만 했는데 어떻게 자동으로 배포가 될까' 싶어서 찾아보게 됐다.

Vercel은 어떻게 내 repo에 접근하나 — GitHub App

GitHub App은 vercel이 만든 웹서버고 GitHub 플랫폼 위에 등록한 앱이다. vercel에서 깃헙 레포를 import 하면 vercel의 GitHub App이 내 계정에 설치가 되고 해당 레포에 대한 접근 권한을 얻는다.

push 하면 벌어지는 일 (webhook)

레포에 push가 발생하면 GitHub이 vercel의 GitHub App으로 webhook을 보낸다. 정확히는 POST로 요청을 보낸다. webhook을 받은 GitHub App은 vercel 서버에서 해당 레포를 clone 받고 build까지 진행한다. 이게 마무리되면 CDN에 배포까지 진행해준다.

앱이 "나 진짜 그 앱이야"를 증명하는 법 — private key로 서명

앱은 private key로 JWT에 서명을 하는데 서명 과정은 header+payload 데이터를 해싱해서 이 해시값을 private key로 암호화하는걸 의미한다. 'header+payload -> hash -> private key로 암호화'

private key는 앱만 갖고 있기 때문에 이 서명은 이 앱만 만들 수 있는 값이 되고 이후 신원 증명을 하는데 사용된다.

GitHub은 어떻게 검증하나

GitHub은 검증을 하기 위해 JWT에 담긴 header+payload 데이터를 해싱하여 해시값을 얻는다. (hash_A) 그리고 서명을 public key로 복호화를 하면 앱이 암호화하기 전 해시값을 얻을 수 있다. (hash_B) 이 두개의 해시값을 비교하여 (hash_A == hash_B) 같은 경우 두가지가 확인된다. 데이터가 변조되지 않았다는 것과 서명이 private key로 만들었다는 것. 이 과정을 통해 그 앱의 신원을 검증한다.

header+payload를 해싱한 값 === 서명을 public key로 복호화한 값 => private, public key가 짝임을 의미!

client id/secret은 어디 쓰나 — OAuth 흐름

앱이 GitHub 레포에 접근하는 등의 작업을 하기 위해선 private key와 함께 앱 자격 증명이 필요하다. 반면 유저 정보나 활동에 대해 조회하기 위해선 유저에 대한 신원 증명이 필요하다. 이를 위해 앱 등록 시 발급받은 client id/secret을 사용한다.

  1. 앱이 유저를 GitHub 인증 URL로 보내 앱이 유저 계정 접근 요청을 한다.
  2. 유저가 승인을 하면
  3. GitHub이 앱으로 리다이렉트를 하면서 임시 code를 발급한다.
  4. 앱은 code + client_id + client_secret 을 이용해 GitHub에 유저가 승인한 앱임을 증명한다.
  5. GitHub이 유저 토큰을 발급한다.

이를 통해 유저 정보에 대해 접근을 할 수 있게 된다.