애플 소셜로그인 ECPrivateKeyImpl 이슈 해결

Melonader·2022년 10월 5일

배경

애플의 앱스토어 심사를 통과하기 위해 애플 소셜로그인을 넣기로 했다. 사실 대부분의 사람들이 카카오톡 소셜로그인을 쓰지만, 카톡만 있으면 애플이 삐져서 리젝을 때리기 때문에...

소셜로그인 구현 원리

현재 구현중인 프로젝트는 서버리스 환경에서 프론트는 React, 백엔드는 Spring(boot)을 이용하는데, 액세스 토큰을 프론트에서 받아 백엔드로 보내주는 프로세스 자체는 유사하지만 애플에선 보안때문인지 암호화 과정을 추가로 거쳐야 한다.

레퍼런스 참고

구글에 스프링 애플로그인 검색하면 위와 같이 다양하게 나온다! 그러나..

다양한 유저 정보를 받아올 수 있는 카카오톡 API와는 달리 애플은 정보가 한정된다. 때문에 별도 정보들은 앱 내에서 받도록 하고 유저 식별자 만 받는 것을 목표로 구현을 시작했다. DB상에 애플 식별자 전용 컬럼을 만들고 로그인 과정을 추가 작성해주면 되기 때문이다. (어차피 내부ID나 카톡이나 애플이나 단일 유저테이블에서 관리되고, 내부 유저 식별자를 JWT로 보내주기 때문)
이전에 구현하셨던 분들이 많아서 처음엔 순조롭게 구현되나 싶었다.
하지만...

ECPrivateKeyImpl 오류 발생


JDK 버전문제인지 몰라도 현재 내가 사용중인 OpenJDK버전인 17.0.2에서는 ECPrivateKeyImpl를 사용이 불가능한 상태였던것!
여러번 서칭을 했는데 바로 해결 가능한 답변은 없었다. 여러 블로그에서 이 함수를 이용해서 애플 로그인의 client secret을 만들었는데 댓글들을 보니 이 문제가 발생한 분들이 다수 계셨는데 마땅한 답변을 찾을 수 없었다.

문제 해결

타원곡선암호
애플에 보내는 client secret을 만들 때 사용하는 암호화 알고리즘은 공개키 알고리즘! 따라서 암호화 알고리즘에 맞는 별도의 라이브러리를 사용하면 될 것이라 생각하고 탐색해 문제를 해결했다. 개인키가 필요했으므로 이에 해당하는 라이브러리를 탐색했다.

PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(readPrivateKey(keyPath));
KeyFactory kf = KeyFactory.getInstance("EC");
 try {
            ECPrivateKey ecPrivateKey = (ECPrivateKey) kf.generatePrivate(spec);
            JWSSigner jwsSigner = new ECDSASigner(ecPrivateKey.getS());
            jwt.sign(jwsSigner);
}

추가 문제

파일 경로 관련해서도 문제가 발생했다.

Resource resource = new ClassPathResource(keyPath);
FileReader keyReader = new FileReader(resource.getFile())

이 구문 관련 문제였는데, 이 문제는 다음과 같은 구문으로 해결했다.

ClassPathResource resource = new ClassPathResource(keyPath);
Reader keyReader = new InputStreamReader(resource.getInputStream()

이건 서칭으로 빠르게 해결이 가능했다.

시행착오

중간에 아예 이 과정을 처리해주는 라이브러리도 Maven 리포지토리들에서 찾아보고 했는데..

    @Value("classpath:/static/AuthKey_KEYNAME.p8")
    private org.springframework.core.io.Resource appleCertificate;
            String appleSecret = org.apache.commons.io.IOUtils.toString(
                    appleCertificate.getInputStream(), StandardCharsets.UTF_8.name());

잘 안되더라...
역시 원리를 정확히 이해하고 구현을 시도하는게 중요하다는 것을 다시 한번 느꼈다.

profile
유니콘이 되고싶은 조랑말

1개의 댓글

comment-user-thumbnail
2023년 7월 17일

저도 지금 같은 에러로 고민하고 있는데 해결이 잘 안되고 있어서 ㅠ 혹시 괜찮으시다면 제가 github소스를 공유해주실 수 있을까요?

답글 달기