애플 로그인 (OAuth) 도입: 백엔드가 해야할 일
애플 oauth 를 서비스에 적용시키기 위해서 백엔드 파트에서 해줘야하는 플로우를 정리해보려고 합니다
친절하지 않은 애플 공식문서를 보며 "뭔 소리지?-__-...." 하는 경우가 계속 생겼기 때문에
저와 같은 동지들을 구원하기 위해 이 글을 바칩니다..
전체 프로세스
간단 요약을 하자면
1. 앱이 앱 서버(*캡쳐에서 API Server 라고 칭한 부분)에게 authorization code 를 보냄
2. 앱 서버는 Apple 서버에게 authorization code 에 대한 검증 요청을 하면서 access token 을 발급 받음
이 중 백엔드 파트가 구현해야 하는 파트는 2번.. 즉, 위 다이어그램에서 노란색 박스 부분입니다
2번 파트는 이 문서를 참고해서 애플 서버에 API 를 호출해서 받아오면 되는데요
제가 다시 열심히 끄적이며 정리를 해보았는데요..
그림에 나타난 것처럼 "client_secret" 을 만드는 과정이 까다로워요..
이를 위해 #1, #2 번 과정을 잘 따라와 주세요
#1. private key 발급 받기
문서 에 나와 있듯이 Apple Developer 콘솔창에서 쉽게 발급 가능합니다
이 Key 가 Apple 의 어떤 서비스를 사용하기 위해 발급하는 키인지 선택해주는 칸이 있습니다
애플 로그인을 구현하고 싶은 것이니 [Sign in with Apple] 에 체크해 줍니다
이때, Configure 버튼을 눌러서 본인의 앱 ID 와 연결해 주는 과정이 필요합니다
#2. client secret 생성하기
애플에서 명칭하는 client secret 이라는 것은 결국은 jwt 입니다.
즉, 우리 서버 내에서 알아서 jwt 를 생성하면 되는 거에요.
이 문서가 가이드하는 대로 client secret 을 생성해 줄겁니다,
저는 jsonwebtoken 라이브러리 이용했는데 jwt 만들 수 있는 아무 라이브러리 사용하시면 됩니다
여기서 유의할 점은, jwt 를 만들 때 sign (서명) 을 해야한다는 점을 아실텐데요
이때 사용하는 signing key 로 위에서 발급한 private key 를 사용합니다
⭐️이 과정은 Apple Server 랑 우리 서버랑 네트워크 통신 해야하는게 아니라, 그냥 우리 서버 내에서 자체적으로 jwt 만들면 끝이에요
#3. Apple Server 로 부터 사용자 인증하고 토큰 받아오기
드디어 access token 을 발급 받기 위한 재료는 모두 준비가 되었고요,
이 문서를 참고해서 드디어 access token 을 받아올 API 를 호출합니다
정상적으로 호출이 됐다면, Apple Server 로부터 받은 응답 데이터에 access_token 뿐만 아니라 id_token 도 있을텐데요,
이 id_token 에 대한 검증이 우리 서버 내에서 추가적으로 필요합니다
#4. id_token 검증하기
이 문서를 참고해서 id_token (=jwt) 에 대한 자체 검증을 진행해야 하는데요,
애플 서버는 id_token 에 대해서 비대칭 암호화 방식을 사용하고 있기 때문에
애플 서버로부터 공개 키를 받아와서 이 jwt 를 검증해야합니다..;ㅅ;
이 문서를 참고해서 jwks-rsa 라이브러리를 이용해 공개 키를 가져온 후 서명을 검증합니다,
서명을 검증하라는 말은 jwt.verify(...) 를 하라는 뜻입니다!
작동 테스트를 위한 간단 TIP
제가 참여하고 있는 프로젝트는 웹사이트가 아니라 ios 앱을 개발하는거였는데요.
프론트에서 애플 로그인 구현이 완료되지 않은 상태라면,
백엔드 파트가 제대로 구현되었는 지 확인하기 위해서
GPT 를 이용해서 웹페이지에 넣을 애플 로그인 부분만 빠르게 짜달라고 하면 됩니다. (30초면 짜줌)
웹이든 앱이든 백엔드쪽 구현 코드는 동일하니까 이것으로 검증하시면 됩니다.