Apple Login 사용자 인증 요청 로직

KIM JEONG DONG·2023년 12월 23일
post-thumbnail

오늘은 Apple Login을 하고나서 유저의 검증을 Apple 공식 API에 요청해 사용자 인증을 받고,

Jwt 검증 로직을 성공 할 수 있게 하는 내용을 포스팅 해보겠습니다.

🏃‍♂️ 실행 단계

1. 토큰 생성 및 검증

2. Client Secret 생성

3. Apple API 요청으로 authorization Token 받기

4. Apple API 요청으로 Refresh Token 받기

시작하기에 앞서 해당 포스팅은 클라이언트에서 Apple Login이 구현 완료된 전제가 깔려있는 상태입니다.

  • 즉, 해당 포스팅은 백엔드 관점이 중점적입니다.
  • Apple Login을 구현 하셨다면, 앱에 인증 부여 코드 ( AuthorizationCode ) 가 앱에 전달 됩니다.

1. ✔️ 토큰 생성 및 검증

  • Apple Login을 통해 받은 AuthCode로 토큰 생성 및 검증을 Apple에 요청 합니다.

Apple Sign in With Apple 공식 문서

위 공식 문서를 보면 아래와 같이 Body에 담아 요청을 할 수 있다고 합니다.

필수적으로 Client_id, Client_Secret, Grant Type을 본문에 담아야하고, Response 받고자 하는 것에 따라 각각 다르게 요청을 할 수 있습니다.

여기서 Client_Secret은 서버에서 직접 서명하고 생성해야 하는 로직이 반드시 필요합니다.

  • Apple 공식 기능을 쓰려면 보안 때문에 이것저것 해줄게 참 많은거 같습니다.

2. 💡 Client Secret 생성

  • 그럼 먼저 토큰 생성 및 검증 요청을 하기 위해 필요한 Client Secret을 만들어 봅시다.

Client Secret 만들기 Apple 공식 문서

위 공식 문서를 보면 아래와 같이 Header와 Payload를 생성하여 Jwt를 서명해야 합니다.

kid에는 Apple Devloper에 있는 Keys 값 10자리를 입력해주세요.

iss에는 Apple Devloper의 Team Id를 입력해주세요.

sub에는 Apple Devloper의 Identifiers 항목에 있는 Bundle ID를 입력해주세요. ( Client_Id 라고도 불립니다. )

그 외 나머지 값들도 문서를 보시고 알맞은 프로퍼티 설정을 해주시면 될거 같습니다.

💻 코드 작성

해당 내용을 진행하려면 PrKey를 생성하여, 로컬 경로에 저장해야합니다.

Private Key 만들기 Apple 공식 문서

위 공식 문서를 바탕으로 PrKey를 경로에 저장하여 해당 파일을 불러와야 올바르게 진행 할 수 있습니다.

appleHear와 applePayload를 생성하고 Key까지 담아서 jwt.sign을 통해 Jwt을 return 받습니다.

이 return 된 값이 바로 Client Secret 입니다. 한 번 확인해 볼까요?

Jwt.io에서 확인하기

Jwt 검증을 해보니 Apple 공식 문서에 나온 API 결과 값이 잘 나오는군요!

이제 이 값을 가지고 Apple에다가 Jwt 사용자 검증을 요청하면 됩니다.

해당 결과는 단순히 Apple 사용자 Jwt 검증을 위해 필요한 ClinetSecret 값입니다.

3. 🛠️ Apple API 요청으로 authorization Token 받기

  • ClientSecret와 클라이언트에서 전달 해준 AuthCode를 담아서 해당 Id_toekn을 받아봅시다.

💻 코드 작성

일단 먼저 클라이언트한테 받은 AuthCode를 Apple API에 요청하는 코드를 작성합니다.

ClientSecret은 createSecretKeyApple()을 통해 값을 return 받아 Body에 담아 줍니다.

그러고나서 grant_type을 "authorization_code" 로 설정하고 AuthCode를 실어 보내면 아래와 같은 결과가 나옵니다.

여기서 Res된 id_token 해당 유저의 Jwt이며, refresh_token은 만료된 id_token을 재발급 하기 위해 필요한 token입니다.

4. 🔰 Apple API 요청으로 Refresh Token 받기

  • 위에 결과의 refresh_token을 담아서 id_token 재발급을 Apple한테 요청 할 수 있습니다.

💻 코드 작성

이 때 여기서 받은 refresh_token을 다시 담아서 요청하면 refresh_token을 다시 받을 수 있습니다.

getToken()을 통해 Body에 담아서 먼저 1번째로 요청한 Data를 받아, refresh_toekn을 변수에 할당해서 다시 2번째 요청을 하는 로직입니다.

이렇게 총 2번에 걸쳐서 연속적으로 refresh_token을 요청하면 새로운 id_token을 받을 수 있습니다.

grant_type을 "refresh_token" 로 설정하고 위에서 받은 refreshToken을 담아서 요청하면 id_token을 다시 재발급 받을 수 있게 됩니다.

그럼 이제 id_token을 다시 검증해 볼까요?

id_token을 다시 검증하면 역시 Apple에서 잘 주고 있고 검증도 무사히 잘 되는걸 볼 수 있습니다.

정리하자면,클라이언트에서 로그인 시 AuthCode 전송 받은 것을 Body에 담고 추가적으로 ClientSecret을 생성한 뒤에, Apple API요청하면 refresh_token까지 받을 수 있는 것입니다.

마치며

  • Apple에서 발급하는 Jwt를 갖고 사용자를 검증하고 refresh_token까지 받는 로직을 알아봤습니다.
  • 전달받은 refresh_token을 갖고 다시 내부에서 Jwt 검증 전략을 알맞게 구성해야 합니다.
    • 어떤 값으로 유저를 식별할 것인지? 등 말입니다.

0개의 댓글