본문 바로가기

개발/Spring

#1) Spring Security Oauth2 Client + Apple 로그인 연동하기

이번에 인증 서버를 구축하면서 총 5개의 SNS 연동을 진행했다. (카카오, 네이버, 페이스북, 구글, 애플)

카카오, 네이버, 페이스북, 구글은 Spring Security Oauth2 Client로 연동하는 레퍼런스가 많아서 수월하게 진행했는데

애플은 다른 Provider(제공자 : 예를 들면 카카오, 네이버)의 OAuth2 인증방식과 다른 방식으로 사용자 정보를 넘기고 있어서

레퍼런스도 없고 해외에도 연동 예제가 없었다. 그래서 그냥 라이브러리를 분석해서 나의 방식대로  애플을 연동했는데

애플 로그인을 Spring Security Oauth2 Client에 연동하고자 하는 이들이 있으면 도움이 되고 싶어서 그 과정을 기록하고자 한다.

 

먼저 대부분의 Provider는 다음 그림과 같은 방식으로 동작한다.

마지막 회원여부 검증 및 특정 페이지로 redirect 부분은 제가 적용한 애플리케이션의 경우이므로 무시해도 된다.

 

 

Spring Security Oauth2 Client에 애플을 연동할 때 막히는 부분

1. 만료시간이 있는 Secret Key 

다른 provider는 secret key를 제공한다. 그래서 oauth를 설정한 yml에 secret key를 그냥 붙여 넣으면 된다.

그러나 애플은 secret key를 Team Id, Key Id, client ID 이용해 JWT를 만들고 발급한 키의 .p8파일로 서명한 값이다. 아주 복잡하다...!! 그리고 무엇보다 만료시간이 최대 6개월이다. 그래서 secret key를 만들어서 yml에 넣는다 해도 6개월마다 다시 시크릿 키를 만들어서 배포해야 되고 만료 시간을 신경 써야 된다. 그렇다면 동적으로 사용자가 애플 로그인을 할 때마다 secret Key를 만드는 게 좋은데 Spring Security Oauth2 Client 라이브러리를 써서 registration bean에 있는 apple의 secret key를 동적으로 호출마다 세팅하려면 라이브러리를 커스텀을 해야 한다.

 

2. 회원 정보를 호출하는 rest api가 존재하지 않음 

Apple은 액세스 토큰으로 사용자 정보를 얻어오는 Rest API를 제공하지 않는다.

Code로 Access Token을 요청하면 Access Token과 함께 id_token이라는 키 값을 가진 JWT 함께 넘겨주는데

이를 디코드 해서 유저 정보를 가져올 수 있다. 그래서 loadUser 메서드에서 에러가 발생한다. (뒤편에서 자세하게 다룰 예정)

 

 

이 두개를 해결하면 Spring Security Oauth2 Client에 Apple을 붙일 수 있다.

 

애플 로그인을 위해 사전작업이 있다.

Apple Developer 사이트에 가입하고 앱을 만든 후 Identifiers에 추가하고 redirect uri를 설정하는 등의 과정이 있는데

난 이미 애플 애플리케이션이 등록되어 있는 상태였기 때문에 이 부분에 대해선 다루지 않을 예정이다.

 

다음 장에서 구현 소스 및 설명을 할 예정이다.

반응형