Coding History/project

구글로그인 JWT와 OAuth2 인증 병합해서 로그인시키기.

BlackBirdIT 2024. 9. 16. 01:57

뭔가 좀 꽃히면 뒤도 안돌아보고 돌진하는 스타일이라 다 만들어 놓고 깨달았는데 OAuto2부터 인증 받고 JWT를 해야되는데 이거 망한건 아닌가 잘 모르겠네;;

여튼 간에 어떤 방식인지 정리부터 필요할 것 같다.

사족이긴 한데 이미한걸 뭐 어떡하겠냐 일단 넣어봐야지.

JWT와 OAuto2인증을 함께 사용할 때 장점

  • OAuth2를 통해 외부 제공자의 인증을 신뢰할 수 있고,
  • JWT를 통해 이후 요청에 대해 별도의 인증 절차 없이 사용자 인증이 가능합니다.
  • 서버가 세션을 관리할 필요가 없으니 Stateless 환경에서 유리합니다.

근데 생각해보면 내 사이트는 Stateless하지는 않을 것 같단 말이지? 그럼 보안 강화를 목적에 두고 로그인을 할 때 만 JWT와 OAuto2 인증 둘 다 사용하고 이후에는 JWT는 버리고 OAuto2의 세션 유지를 사용하는게 더 적합할 듯 하다.

그래서 어떻게 동작할건데?

  1. 로그인 시 OAuth2 + JWT 발급:
  • 사용자가 OAuth2 제공자를 통해 로그인하고, 서버가 JWT를 발급해서 클라이언트에 반환함.
  • 이 과정에서 JWT는 주로 처음 로그인 인증을 위해 사용되고, 이후 서버는 사용자 세션을 유지하기 위한 세션 쿠키를 사용할 수 있음.
  1. 이후 요청에서는 JWT 사용하지 않음:
  • 로그인이 완료된 후, 서버는 세션을 통해 인증된 사용자를 식별하고 관리함.
  • 세션 기반으로 작동하므로 서버는 각 요청마다 클라이언트가 제공하는 세션 정보를 바탕으로 사용자를 인증함. 이때 JWT는 필요없음.

이 일단 계획이다.

일단 OAuto2 관련 기본적인 설정은 애진작에 다 해놨었기 때문에 handler로 JWT를 받급 받아 전달하는 로직부터 시작해보자.

때문에 변동 사항은

  • OAuth2AuthenticationSuccessHandler 도입으로 토큰 전송
  • JwtAuthenticationFilter 도입으로 서비스와 JWT 검증 로직 명확하게 분리
  • 더이상 login.jsp 에서 idToken 전달하지 않고 OAuth2에서 토큰을 가져옴.

이게 제일 중요한 변동사항이다.

그래서 지금 일단 다 해놓고 프론트에서 OAuth2로 전달하게끔 하려고 하는데 엑세츠 차단됨이 뜨는걸 보니, 다시 설정들어가서 url등록을 하고 와야될 것 같다.

이 주소가 처리하는 주소였는데 여태 따로 만들어서 하려니 힘들었지.. 이래서 글을 똑바로 읽었어야했다. 여튼간에 이 주소가
http://localhost:8081/login/oauth2/code/google 이렇게 치환되니, 이 주소로 등록을 하고 와보자고.

등록하고난 이후 로그인 시도를 해봤다.

일단은 만들어 놓은 로직까지 도달하는거 보니까 여기서 제대로 토큰 추출만 하면 될 것 같다.

아니다!!! 다른 로그까지 다 찬찬히 살펴보니까 회원가입 시키는 로직에서도 null을 반환하고 있고 여러가지로 문제가 조금 있다. 크게 전면적으로 수정을 거칠 필요가 있어보인다.

CustomOAuth2UserService 클래스를 선언해줘서 기존의 firebaseUserService의 역할을 하도록 수정했다.
그리고 CustomOAuth2User로 Member Entity에 전달해주도록 했다.

그래서 firebaseUserServicefirebaseUserController는 제 역할을 하지 못하게 되니 코드만 지우고 클래스는 남겼다. (나중에 파일 업로드 다운로드 할 때 혹시나 해서 그냥 메서드들만 지웠다.)

일단 이렇게 하고 DB초기화 이후 로그인 시도를 해봤다.

오케이!!! DB에 정상적으로 들어오고 메인 페이지 리다이렉트까지 됐다.

로그를 살펴봤을 때, JWT와 OAuth2가 유기적으로 잘 작동한다..

다행이다. 이제 세션문제만 해결하면 될 것 같다.

그건 다음 포스팅으로 하겠다.