본문 바로가기

spring/security

Oath2 로그인 구현 - 구글

Spring Oauth2 client를 이용하여 구글 로그인을 구현해 보자.

 

구현 절차

 

1. 구글 api 콘솔 프로젝트 등록

https://console.cloud.google.com/apis/dashboard?project=natural-reserve-315509 

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

프로젝트 생성

OAuth 동의 화면 설정하기

 

사용자 인증정보 > + 사용자 인증 정보 만들기 > OAuth 클라이언트 ID 만들기

 

"/login/oauth2/code/google" 이 디폴트 설정이라서 그대로 작성하면 되지만 중간에 url을 매핑 처리하는 어플리케이션 라우터 Kong을 운영하고 있어서 백엔드로 리디렉션을 요청할 수 있도록 "/api"를 추가해서 설정을 해주었다.

 

+ 시큐리티를 강의로 공부할 때는 이 주소를 설정하면 구글에서 이것을 기반으로 리다이렉트를 해주는 줄 알았지만 이는 착각이었다. 구글에서는 설정한 주소의 리다이렉션 요청을 승인해 주겠다는 것으로 승인할 리다이렉트 요청주소를 적는 것! 그래서 여러 개의 주소를 적을 수가 있던 것이었다.

 

2. spring boot 설정

 

- build.gradle 의존성 추가

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-oauth2-client

 

- application.yml 수정

보통 아이디랑 비밀번호만 설정하면 되지만 나는 redirectUri까지 설정을 해주어야 했다. 나중에 서버에서 인증 토큰을 리다이렉트 할 주소를 알려줄 때 쓰이는 정보임을 알고 가자.

 

 

세션을 통한 로그인 정보 등록 이후 토큰 발급, 발급하고 세션 정보 삭제 -> 세션을 redis로 변경해서 msa 구조에 맞게 변경예정

 

3. 코드 구현

구현할 Principal 객체

인증받은 유저의 정보를 담을 클래스를 구현해한다.

구글로 전달받은 사용자 정보를 가지고 유저 정보를 조회하는 서비스 인터페이스

유저 정보를 읽는 OAuth2UserService를 구현해야 한다.

 

4. 테스트

http://localhost:8080/oauth2/authorization/google
로그인 요청 주소로 로그인 테스트해보자.

 


구글 로그인 인증 과정이 무엇일까?

구글 로그인 인증 흐름이 구현만 했을 때는 이해가 가지 않아서 흐름을 추적해 보았다.

 

1. 구글 로그인 요청 url로 브라우저는 서버에 로그인 시도를 한다.

2. 서버는 구글 인증 서버 주소로 리다이렉션 시킨다.

  • 이때 location 헤더에 구글 서버의 주소와 인증 성공 시 리다이렉션 시킬  서버의 주소를 포함시킨다.

1, 2과정

3. 브라우저는 location 헤더 값을 읽어 구글 서버 로그인 url을 통해 구글 로그인 페이지에 접속한다.

4. 사용자는 로그인 페이지에서 로그인 정보를 입력하여 로그인 요청을 구글에 한다.

3, 4과정

5. 구글은 로그인 결과를 담아서 브라우저에 전달한다.

이때 상태 코드는 302로 백엔드 서버로 리다이렉션 시킨다. 2번 과정에서 구글에 넘겨준 location헤더에 리다이렉션 주소를 활용한다. 

 

6. 서버에서는 전달받은 인증 정보를 기반으로 후처리를 진행하고 그 결과를 브라우저에 전송한다.

 


 

구글은 시큐리티에서 지원하는 기본적인 인증 등록자이기 때문에 설정이 복잡하지 않고 단순했다. 서비스 아키텍처 구조에 따라서 리다이렉션 할 주소를 커스텀해야 정상적으로 작동하는 경우도 있기 때문에 인증 절차를 알고 있는 것이 중요할 것 같다.

 

 

다음으로는 시큐리티에서 지원하지 않지만 서비스는 제공하고 있는 카카오 인증을 구현해 보자.