스프링 시큐리티와 OAuth 2.0으로 로그인 기능 구현하기 3편

Zerodin·2021년 11월 8일
1
post-thumbnail
post-custom-banner

네이버 로그인

이번에는 국내 포탈사이트 네이버에 대한 로그인 연동을 구현하려 한다.

우선 네이버에서 구글에서 할때와 비슷한 API 관련 정보 발급이 필요하다.

네이버 API 등록

https://developers.naver.com/apps/#/wizard/register
주소로 접근해야 한다.(로그인 필요.)

로그인 후 약관 화면이 나온다.
수락하고 진행을 해보자.

인증관련 화면이 나왔다.
회사는 없어서 일단 공란으로 작성하도록 하겠다.

등록할 어플리케이션 정보를 기입하는 화면이 나왔다.
크게 두가지 정보를 다루고 있는데,
사용할 API에 대한 항목 설정과 해당 API 호출,콜백 관련 URL 정보 기입이 핵심 내용이였다.

사용항목으로는 이름, 이메일, 프로필 사진을 선택했다.

구글 정보를 작성할때와 비슷하게 우선 로컬기준의 환경에 대해서만 설정하도록 하자.

정상적으로 작성이 완료되면 다음과 같다.

application-oauth 작성

네이버에서는 스프링 시큐리티를 공식 지원하지 않는다고 한다.
그래서 CommonOAuth2Provider가 해주는 역할을 수동으로 작성해야 한다.

작성하는 것이 너무 불편하여 아직도 지원하지 않는지를 확인하기 위해 웹상에서 추가적으로 조사를 해보았는데 미지원인 것으로 보여서 책의 기준에 따라 properties를 작성했다.

스프링 시큐리티 설정 등록

이제 연동시 사용하는 Dto에 Naver에 대한 항목을 추가해야한다.

OAuthAttributes에 아래와 같이 코드라인을 추가하자.

Google 로그인 정보를 생성할때 와는 다른 부분이 보일 것이다.
Google은 파라메터인 attributes에서 꺼낸 값 자체를 바로 사용했었다.

하지만 Naver는 키가 response 인 Map 콜랙션을 꺼내서 사용한다.
네이버의 API JSON구조가 아래와 같기 때문이다.

그런데 여기서 한가지 문제가 발생했다.
(Map<String, Object>)attributes.get("response")을 사용하면 unchecked castwarnning이 발생한다.
타입에 대한 안정성을 보장하지 못해서 발생하는 warnning인데,
꺼낸 Object가 타입이 Map<String,Object>인지를 보장하지 못한다는 것이다.

사용하는 코드에 대한 안정성 문제로 생각될 수 있으나, 이미 기존에 많은 레퍼런스 코드들이 케스팅을 하여 서비스를 제공하는데 문제가 없는 것을 알고 있기 때문에 warnning해결하기 위해 @SuppressWarnings("unchecked") 를 선언해주었다.

화면 버튼 추가

이제 네이버 로그인 버튼을 index.mustache에 추가하자.

실행결과

첫 로그인 시도를 해보았다.

API를 발급받을때 나왔던 체크항목 3가지가 보인다.

실행 결과 에러가 발생했다.

Missing attribute 'response //' in attributes
'response //'를 찾지 못한다는 것인데, 에러 발생 시점이 OAuthAttributes 생성 이전이다.

CustomOAuth2UserService 에서
OAuth2User oAuth2User = delegate.loadUser(userRequest);
를 할때 발생하고 있는데, 이건 리스폰스 문제여서 혹시나 하는 마음에 oauth properties부터 다시 점검해 보았다.

그리고 원인을 찾을 수 있었다.

문제점은 두가지였다.
하나는 redirect-uri 에 들어가는 정보가 틀려서 발생한 것으로 확인되었다.
API에 등록했던 http://localhost:8000/login/oauth2/code/naver
주소로 수정하자.

두번째는 spring.security.oauth2.client.provider.naver.user-name-attribute 항목에 값에 복사하면서 기입된 '//'문자열이 추가되서
'response //' 를 찾게 하고 있었다.
이 부분은 너무 사소한 부분이라 미쳐 생각도 못하고 있었다.

정형화된 설정관련 코드여서 복사하고 별다른 검증을 하지 않은 것이 실수의 큰 원인이 되었다. 꼼꼼하게 코드를 보는 버릇을 들여야 하는데 사소하다고 생각하는 마음이 빈틈을 제공하고야 말았다. 다음부터는 사소한 것에도 방심하지 말도록 하자.

다시 한번 로그인을 시도하자.

정상적으로 로그인에 성공했다.


권한도 정상적으로 적용되고 있다.

DB에서 권한을 'USER'로 변경하고 글이 작성되는지 확인해보자.

정상적으로 작성에 성공하였다.

마무리

장장 3부의 걸친 로그인 연동에 대한 포스트를 마무리하려 한다.

구글과 네이버를 이용한 연동 로그인 샘플을 구현했다.
연동하기 위한 로그인 API를 각각 발급도 받아봤고,
이를 별도의 properties에 작성하여 관리를 하고 Git에 반영되지 않기 위한 gitignore도 작성해 봤다.

스프링 시큐리티의 OAuth 2.0를 이용해서 구현을 했는데,
얼마나 편리하고 강력했는지를 체감할 수 있었다.

WebSecurityConfigurerAdapter를 상속받아서 간편하게 URL 패턴에 대해서 체이닝으로 정의할 수 있었고
이를 통해 연동되는 서비스는 OAuth2UserService를 상속받음으로써 편리하게 작성할 수 있었다.

그리고 여기서 생성된 로그인정보를 세션에 담고 이를 컨트롤러에서 꺼내쓰기 편리하게 하기 위핸 커스텀 어노테이션 작성을 HandlerMethodArgumentResolver 상속을 통해서 구현해 볼 수 있었다.

나는 이러한 구현 코드를 스프링 구버전에서 수작업으로 만들어 본 기억이 있어서
그 끔찍한 고통의 코드를 떠올리면 스피링 시큐리티는 천사같은 존재로 보인다.
(심지어 기능은 시큐리티로 구현한 내용보다 더 조악했다. 난이도는 더 높고 성능은 열화 버전인 프로그램을 생성한 것이다.)

거기서 조금더 나아가, 스프링 시큐리티를 지원하지 않는 sns와 지원하는 sns의 구현 난이도도 체감할 수 있었다.

네이버는 대체 왜 스프링 시큐리티를 정식 지원하지 않는 걸까?
사용자층이 개발자여서 알아서 잘 연결하라는 그런 의미인지 모르겠지만 그래도 국내 탑급 IT 회사가 제공하는 API치고는 다소 부실한 느낌을 감출 수 는 없었다.

Git hub : https://github.com/kdh85/spring-aws-study.git

profile
멈추지 않는 사람이 되고 싶어요!
post-custom-banner

0개의 댓글