자체 로그인 및 회원가입 기능 구현을 완료하고 구글 로그인을 적용하게 되었다


들어가기 전에 변명부터 하자면....

우리 서비스는 JWT를 통해 로그인이 필요한 페이지(각 유저의 대시보드 페이지)에 접근할 수 있다

구글 로그인을 도입하면서 많은 문제가 발생하게 되었다

원래 생각하던 로직은 Applicatioin과 Google Server간에 인증 코드를 요청하고, 인증 코드로 토큰을 요청하고, 그 토큰으로 API를 요청하는 것을 생각했다

하지만 스프링 시큐리티를 사용하면 기대했던 로직과는 다르게 그냥 바로 로그인 되어버린다

이 문제를 해결하기 위해 아직도 고군분투 중이다 (살려줘.....)

 

따라서 지금 작성하는 글은 그냥 스프링 시큐리티의 OAuth2 로그인을 어떻게 적용하였는가?에 대한 글이다


우선 구글 OAuth 서비스를 등록하였다

서비스를 등록하기 위해 Snacks 팀 계정을 생성하였다

내 계정을 사용해도 되지만, 그렇게 되면 사용자 지원 이메일은 나의 계정이 되기 때문이다

 

팀 생성일에 맞게 2022년생으로 가입을 하니 미성년자라고 부모님의 동의를 받아야 한단다

그래서 다시 내 생년월일로 가입을 하니..... 계속 안된다....!

이유인즉슨, 한번 미성년자로 가입을 해버리면 그 기기에서는 계속 미성년자라고 여겨진다고..

그래서 시크릿 모드로 들어가서 가입했다

1950년생으로.

 

 

SecurityConfig파일의 configure부분이다

oauth2Login을 사용하기 위해 다음과 같이 설정한 모습이다

customOAuth2UserService는 OAuth2 로그인 성공 시, 작업을 진행할 service이고,

defaultSuccessUrl은 OAuth2 로그인 성공 이후에 redirect 시킬 url이다

 

다음은 CustomOAuth2UserService의 loadUser부분이다

registrationId는 OAuth2의 이름을 담고있다 (ex) google, naver..)

userNameAttributeName은 OAuth2 로그인의 PK값이다 

OAuth 에서 가져온 유저정보를 받아서 arributes 객체로 만들어 준다

생성된 attributes를 saveOrUpdate를 통해 Snacks DB에 저장한다

 

saveOrUpdate란 말 그대로 findByEmail을 통해 DB에 값이 없으면 값을 save한다

만일 구글 계정에서 계정의 이름, 프로필 사진을 바꾸는 경우가 있기에 Snacks DB에도 변경된 정보를 update한다

 

OAuthAttributes 파일은 OAuth정보를 담는 객체를 만드는 곳이다

of 메서드를 보면 지금은 구글 로그인밖에 사용하지 않아 바로 return ofGoogle을 하는데, 만일 다른 OAuth2 서비스를 이용할 경우 of 메소드에서 각 서비스에 따라 값을 넘겨준다

 

 

여기까지만 등록하면 http://localhost:8080/oauth2/authorization/google에 접근했을 때

다음과 같은 화면이 뜨면서 로그인이 이루어진다

 

구현하는 부분은 어렵지 않고 오히려 기존의 Entity를 변경하느라 시간이 많이 걸렸다

 

다만 정말 문제는 위에서 서술했듯이 어떻게 JWT와 연동하는가.....그것이 문제이다

화이팅......

복사했습니다!