[Spring] 애플 로그인 구현하기

Kim Dong Hyun·2023년 3월 28일
2

Back-End

목록 보기
2/5

소셜 로그인을 구현하는 방법은 비슷하지만, Apple의 경우 방식이 조금 다르다.
Apple에서는 identity token을 사용하기 때문이다.

준비과정

1. Apple Developer 계정

먼저 애플로그인을 구현하기 위해선 Apple Developer 계정이 필요하다.

Apple Developer Program에 가입하려면 $99 (약 129,800원)이 필요하다.
혼자 연습용으로는 조금 부담되는 가격이다. 🥲

2. App ID 발급

애플 Certificates, Identifiers & Profiles 탭 - Identifiers에서 플러스 버튼을 눌러 앱ID를 만들어준다.

앱 ID를 선택하고 다음을 누른다.

App을 선택한다.

Descripttion과 Bundle ID를 입력해준다.
보통 Bundle ID에는 패키지를 쓴다. ex) com.demo

아래에서 Sign in with Apple을 선택하고 Edit를 누른다.

서버의 앤드포인트를 입력하고 완료하면 App ID가 생성된다.

3. Apple Key 발급


Keys 탭으로 와서 플러스 버튼을 눌러 새로운 키를 발급받는다.

원하는 키 이름을 쓰고, 아래 Sign in with Apple을 체크하고 Configure을 누른다.


방금 등록했던 App ID를 넣으면 된다.

이후 다음으로 넘어가면 AuthKey_[KeyID].p8 파일을 받을 텐데, 재 다운로드가 안되니
소중하게 보관해두고, 유출하지 말자. (github에 올리지 않도록 주의.)

4. Service ID 등록

다시 Identifiers탭으로 돌아와서, 새로 하나 만들어준다.


이번엔 Service IDs를 선택하고 다음을 누른다.

Description과 indentifier (Bundle ID 역순)을 입력하고 다음을 누른다.
다음엔 도메인 설정이 나오는데,

Domains and Subdomains - 서비스 도메인

Return URLs - 콜백받을 url
을 채워 넣는다.
localhost는 들어가지 않으므로 .shop등 도메인을 하나 구매하는 방법을 써도 된다.
http도 들어가지 않아서, 인증서 설정도 해줘야한다.

구현

@Configuration
@EnableOAuth2Client
public class OAuth2ClientConfig {

  @Value("${spring.security.oauth2.client.registration.apple.client-id}")
  private String clientId;

  @Value("${spring.security.oauth2.client.registration.apple.client-secret}")
  private String clientSecret;

  @Value("${spring.security.oauth2.client.registration.apple.redirect-uri}")
  private String redirectUri;

  @Bean
  public OAuth2AuthorizedClientManager authorizedClientManager(
      ClientRegistrationRepository clientRegistrationRepository,
      OAuth2AuthorizedClientRepository authorizedClientRepository) {

    OAuth2AuthorizedClientProvider authorizedClientProvider =
        OAuth2AuthorizedClientProviderBuilder.builder()
            .authorizationCode()
            .refreshToken()
            .build();

    DefaultOAuth2AuthorizedClientManager authorizedClientManager =
        new DefaultOAuth2AuthorizedClientManager(
            clientRegistrationRepository, authorizedClientRepository);

    authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);

    return authorizedClientManager;
  }

  @Bean
  public ClientRegistrationRepository clientRegistrationRepository() {
    return new InMemoryClientRegistrationRepository(this.appleClientRegistration());
  }

  private ClientRegistration appleClientRegistration() {
    return ClientRegistration.withRegistrationId("apple")
        .clientId(this.clientId)
        .clientSecret(this.clientSecret)
        .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
        .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
        .redirectUri(this.redirectUri)
        .scope("email")
        .authorizationUri("https://appleid.apple.com/auth/authorize")
        .tokenUri("https://appleid.apple.com/auth/token")
        .userInfoUri("https://appleid.apple.com/auth/userinfo")
        .userNameAttributeName(IdTokenClaim.SUB)
        .jwkSetUri("https://appleid.apple.com

Apple 로그인 페이지에서 인증 정보를 입력하면, 애플에서 발급한 인증 토큰을 받아와서 Spring Security OAuth2가 이를 사용하여 사용자 정보를 가져온다.
가져온 사용자 정보를 사용하여 로그인을 처리하거나 새로운 계정을 생성하면 된다.

2개의 댓글

comment-user-thumbnail
2023년 4월 27일

안녕하세요..
작업하다가 너무 궁금해서 질문을 드립니다.
client-secret 는 어떤 값으로 넣어주어야 하나요?
애플에서 얻은 p8 키파일이 있는데 이걸 어떻게 저기에 담아줄수있는건지..
아님 다른 걸 넣어야 하는건지 궁금합니다.

1개의 답글