OAuth2.0 로그인 정보

소셜 로그인을 구현하면서 고민점이 생겼다.
우선 자체 로그인의 경우 컨트롤러에서 토큰과 유저 정보를 반환해줬다.
하지만 소셜로그인의 경우 컨트롤러 없이 필터와 리다이렉션 방식으로 로그인이 진행되기 때문에 유저의 정보를 담기가 애매했다.
ObjectMapper를 사용하면 가능하지만 이게 좀 애매해다는 생각이 들어서 다른 방식을 찾아 해결한 내용이다.

 

문제점

 

앞서 설명했던 것처럼 유저의 정보를 담기가 애매하다.

ObjectMapper를 사용하면 담아서 반환할 수 있겠지만 너무 어거지로 반환하는 거라고 생각되어 다른 방법을 찾기로 했다.

 

첫 번째 시도

 

처음에는 갑자기 이런 생각이 들었다

this.getRedirectStrategy().sendRedirect(request, response, REDIRECT_URI)의 역할이 클라이언트를 REDIRECT_URI로 리다이렉트하는 용도라면  백엔드 서버의 특정 엔드포인트로 보내주는 역할로 사용하면 되지 않나? 라는 생각을 했다

그래서 시도한 방법이 밑에 코드이다.

 

 

이 방식은 SecurityContext에 유저의 정보를 저장하고 /oauth/success 엔드포인트로 리다이렉트 시켜준 다음 컨트롤러에서 SecurityContext에 저장된 유저의 정보를 가져와서 반환시켜주는 방식이다.

 

하지만 이 방식은 조금만 더 생각해보면 완전 틀린 방식이다.

onAuthenticationSuccess에서 SecurityContextHolder에 저장을 해도 리다이렉트 후에는 새로운 요청이기 때문에 기존에 저장된 인증 정보가 유지되지 않는다.

 

그렇게 첫 번째 시도를 허무하게 실패하고 다시 생각해낸 두 번째 방식은 클라이언트에서 다시 요청을 보내는 방식이다.

 

두 번째 시도

먼저 onAuthenticationSuccess 메서드 에서는 기존 맨 처음 방식과 같이 토큰만 보내준다.

 

그리고 유저 정보에 대한 건 따로 요청을 받아 그 요청에서 처리하는 것이다.

 

순서를 따져보면

1. 소셜로그인 요청시 기존 회원인지 확인

2. 회원이면 토큰 발급 회원이 아니면 회원가입 후 토큰 발급

3. 발급받은 토큰으로 서버에 유저 정보 요청

4. 유저 정보 반환

 

이렇게 하게되면 프론트 서버에선 2개의 요청을 보내야하지만 백엔드 서버에서는 로그인 구조가 간단해진다. 

 

이렇게 유저 정보를 반환하는 과정속에서 생긴 고민을 해결했는데 여기서 또 눈에 밟히는 건 비지니스 로직에서 http 처리까지 하고 있는 것이다.

이젠 저 http 로직만 깔끔하게 하면 어느정도 완성된 코드라고 생각할 수 있을 거 같다.