[Spring boot] Spring boot Security를 이용한 OAuth2 인증 구현 3 - 국내 포털 인증

지난 포스트에서 기존의 User Entity 혹은 애플리케이션의 User Entity와 연동하여 OAuth2 인증을 사용하는 방법에 대해 다뤄봤습니다.

 

Spring boot Security에서는 기본적으로 Google, Facebook 등의 해외 소셜 로그인 API를 지원하며 우리는 지원해주는 메소드를 잘 이용하여 Key와 Client ID만 넣어주면 쉽게 OAuth2 인증을 구현할 수 있었습니다.

 

그런데, NAVER, Kakao 등 국내 포털 사이트의 OAuth2 인증을 구현하려면 어떻게 해야 할까요?

 

 

 

NAVER, Kakao API를 이용한 OAuth2 인증

Spring boot Security에서는 공교롭게도 국내 포털 OAuth2 인증에 대한 구현체를 제공해주지 않습니다. 따라서 이들 OAuth2 인증을 구현하기 위해서는 포털 서버에서 어떤식으로 인증이 이루어지고, 통신을 하는지에 대한 개념이 필요합니다. 우리는 이를 아래의 글에서 다뤘었습니다.

 

2020/08/07 - [Programming/Spring] - [Spring boot] Spring boot Security로 시작해보는 인증

 

[Spring boot] Spring boot Security로 시작해보는 인증

Spring Framework를 이용하여 웹 서비스나 REST API 서비스를 개발하게 되면 가장 필요로 하는 것은 바로 인증일 것입니다. 여기서 말하는 인증이란, 내가 개발한 서비스를 이용하기 위해 식별하고자 ��

blog.neonkid.xyz

간단하게 복습을 해보자면, 클라이언트가 애플리케이션을 통해 어떠한 리소스를 요청했을 경우, 그에 대해서 애플리케이션이 해당 권한을 가지고 있는지를 검사하며, OAuth2 인증 요청이 들어올 경우, 해당 벤더의 권한 서버로부터 우리 벤더의 OAuth2 인증 권한이 있는지를 확인하고, 이에 대한 리소스를 부여해주는 방식으로 동작합니다.

 

 

 

Using ClientRegistration

ClientRegistration 클래스는 Spring boot Security에서 제공하는 OAuth2 Client 클래스입니다. 우리가 지난 포스트에서 사용했던 Google OAuth2 인증 구현 역시 이 클래스로 구현된 Google OAuth2 Provider를 사용한 것입니다.

 

기본적으로 CommonOAuth2Provider에서 제공하는 소셜 로그인에는 Google, Facebook, Github가 있습니다. 그러나 네이버와 카카오 등은 제공하지 않기 때문에 우리는 이 Provider 코드를 베이스로 하여, 카카오 인증을 위한 로그인 빌더를 만들어보도록 하겠습니다.

 

위와 같이 카카오 로그인 API를 사용하기 위한 정보를 입력합니다. 우리는 여기서 카카오의 개인정보 중 닉네임과 프로필 사진만을 사용할 것이므로 scope를 profile로 설정해줍니다.

 

그런 다음, SecurityConfig에서 ClientRegistration을 저장하는 메모리 부분에 카카오 부분을 추가해줍니다. 여기서 우리가 작성한 Builder에 들어있는 인자는 카카오 로그인을 위한 Redirect URI의 마지막 부분을 나타냅니다.

 

또한 카카오 로그인을 사용하기 위해서는 Client ID가 필요하며, Google 로그인과는 다르게 Secret key가 필수적으로 필요하지는 않습니다. 그러나 ClientRegistration에서 Secret key가 NULL로 설정될 경우, 오류를 출력하므로 아무런 값을 입력해주도록 합니다.

 

Client ID는 application.yml 파일에서 원하는 값으로 설정할 수 있습니다. 위 코드에서는 "custom.oauth2.kakao.client-id"로 설정하여 값을 가져오고 있으므로 application.yml 파일에 위와 같은 네임스페이스를 선언한 후, Client ID 값을 넣으면 됩니다.

 

ArgumentResolver를 이용하여 카카오 계정으로 로그인을 시도할 경우, 가져올 데이터를 정의할 함수를 구현해줍니다. 기존의 User Entity를 만들었던 것 그대로를 사용하여 이메일 주소와 닉네임을 가져오도록 구현하면 됩니다.

 

카카오 로그인 API를 통해 이메일 주소를 가져올 때는 반드시 사용자로부터 이메일 주소 동의를 받아야 합니다. (개정 사항)이 부분을 참고하시어 이메일 주소를 서버에서 가져오지 못하는 경우를 대비하세요. 만약, 선택 동의를 하게 된다면 사용자가 동의하지 않았을 경우에 대한 핸들링이 필요합니다.

 

소셜 타입에 Kakao를 추가하여 View 구간에서 카카오 로그인을 구현하고, 권한을 분리할 수 있도록 해줍니다.

 

마지막으로 View 단에 카카오 로그인을 추가해주면 끝입니다.

 

 

 

 

Test

서버를 실행한 후 로그인 페이지에 접속합니다.

 

그런 다음 카카오 로그인을 통해 로그인하면...

 

위와 같이 게시판이 나오는 것을 확인할 수 있습니다.

 

데이터도 잘 나오는 군요 ^^;

 

 

 

마치며...

여기까지 Spring boot Security를 이용한 OAuth2 인증 구현 3번째 시간을 가져봤습니다. OAuth2 인증이 어떻게 이루어지는지 이해했다면, 이번 포스트는 그리 어려운 내용은 아니라고 생각합니다.

 

또한 매번 소셜에서 제공하는 API URI는 언제든지 바뀔 수 있으니 변경 사항에 따라 코드를 수정하는 일은 반드시 참고해야 할 것입니다.

 

https://github.com/NEONKID/Spring-OAuthExample

 

NEONKID/Spring-OAuthExample

Spring boot Security OAuth2 Example. Contribute to NEONKID/Spring-OAuthExample development by creating an account on GitHub.

github.com

마지막으로 OAuth2 인증에 대한 소스 코드는 위 Github 주소를 통해서 참고할 수 있습니다.

comments powered by Disqus

Tistory Comments 0