Spring/Security

[Security] 시큐리티 프로젝트 로그인 - OAuth 로그인_google

석석's 2021. 12. 1. 12:33

https://oneseok.tistory.com/63

 

[Security] 시큐리티 프로젝트 로그인 - 회원가입 및 기본로그인

https://oneseok.tistory.com/62 [Security] 시큐리티 프로젝트 로그인 - Security 설정 클래스 파일 생성 https://oneseok.tistory.com/61 [Security] 시큐리티 프로젝트 로그인 - 생성 및 프로젝트 설정 이번에..

oneseok.tistory.com

지난 시간에는 로그인 처리를 위해 필요한 클래스들을 몇개 만들어 보았고 실질적인 로그인 처리까지 해보았다.

이번시간에는 google, facebook , naver 와 같이 소셜 로그인 방식인 OAuth2.0 을 이용하여 로그인 처리를 해볼것이다.

 

 * OAuth?

   ▶ 간단하게 얘기하면 인증처리를 대신해준다는 것이다.

       누가 대신해주냐면 google, facebook , naver 같은 서비스에서 대신해준다는 것이다.

       인증처리를 대신해줬을때 장점은 우리가 회원의 정보를 따로 관리할 필요가없다. 회원이 비밀번호를 몰라

       찾는다던지 정보를 바꾸고 싶다던지 그럴경우 그러한 서비스를 안만들어 둬도 괜찮다는 것이다.

 

 

1. 라이브러리 준비

https://mvnrepository.com/로 이동하여 라이브러리를 받을 것이다.

mavenRepository 사이트 검색창에 "OAuth2 Client" 라고 검색 후 "Spring Boot Starter OAuth2 Client" 를 클릭한다.

 

mavenrepository

 

 

    - 최신 버전 아무거나 클릭 후 들어간다.

    - 나는 2.6.0 버전을 사용했다.

버전 선택

 

    - gradle 프로젝트 이기때문에 "Gradle" 선택후 내용을 복사한다.

라이브러리 내용복사

 

    - 프로젝트 내부에 gradle 설정부에서 복사한 내용을 붙혀넣고 gradle을 재 빌드 시킨다.

    - 인텔리제이 2021.2월 버전의 경우 오른쪽 상단에 코끼리 모양을 누르면 재 빌드 된다.

 

라이브러리 추가

   

    - 라이브러리가 받아질때 까지 대기한다.

다운로드 상태

 


2. google Api console 프로젝트 생성 

   - 구글 api console 에서 프로젝트 생성 후 redirect uri 설정에 사진과 같이 설정한다.

   - OAuth-Client 라이브러리가 구글 , 페이스북 , 트위터 의 경우 "provider" 를 제공하는데 이 안에는 redirect-uri 설정이 고정값으로 되어있다.  그래서 내가 마음데로 설정하면 안되고 라이브러리가 적용한데로 설정해야한다.

   - "provider"가 redirect-uri에 대한 설정을 제공하므로 내가 따로 Controller를 만들 필요가 없다.

      (일반 스프링의 경우 내가 redirect-uri 에 대한 컨트롤러 메소드도 만들었고 다했었다..)

 

redirect-Uri 설정

 

 


3. application.yml 설정

    - oauth2 로그인을 위해 내용을 추가한다.

    - client-id , client-secret 는 구글 api 에서 자신의 것을 가져와야한다.

구글 로그인을 위한 설정


4. SecurityConfig 에 OAuth 로그인 관련 설정 추가 및 후처리 클래스 생성

    - OAuth 로그인  처리를 위한 설정을 추가한다.

OAuth 로그인 처리 설정

 

.userService(principalOauth2UserService)

여기서 눈여겨 봐야하는 부분은 이부분인데 , 로그인 이후 후처리를 진행할 곳이다.

"PrincipalOauth2UserService" 는 일반로그인에서 보았던 "PrincipalUserService" 와 같이 로그인 처리를 진행하는 역활을 한다.

단, PrincipalOauth2UserService 는 구글로부터 로그인 이후 받아온 정보로 처리하는 후처리 역활을 할것이다.

(우리 사이트에 가입 안되어있으면 가입시키고 로그인 할것이고 , 가입되어있으면 우리사이트에 로그인만 시킬것이다.)

 

 

  - 후처리를 위한 "PrincipalOauth2UserService" 클래스를 만들자

 

PrincipalOauth2UserService  클래스 생성

 

 

    - DefaultOauth2UserService 클래스를 상속받아 "loadUser"  메소드를 재정의 하자

    - OAuth 로그인도 일반로그인과 마찬가지로 로그인 이후 "DefaultOauth2UserService" 타입의 객체를 찾고 

       "loadUser" 메소드를 자동으로 실행시킨다.

 

    - 이렇게 내용을 일단 추가한 후 로그인 하고 각각 어떤정보들을 나타내는지 로그로 확인해보자

 

    - loginForm.html 파일에 구글 로그인을 위한 버튼을 추가해보자

    - 여기서 주의 할점은 href 안에 있는 주소는 내가 컨트롤러안에 만들어야 하는게 아니다. OAuth-Client 라이브러리가 구글로그인 시 이 Url 로 이동해야된다고 고정시킨값 이기에 내가 마음데로 바꿔서 하면안된다.!!!!

    - "/oauth2/authorization/google" 주소를 들어가면 provider가 제공하는 "authorization-uri" 로 연결이 된다!! 

 

구글 로그인 버튼 추가

 

 

    - 로그인 한 후 로그가 어떻게 찍혔나 확인해보자

개인정보로 인해 부득이하게 가렸음

 

결과적으로 받은 정보에 getAttributes 메소드를 통해 회원의 정보를 추출할 수가 있다.

우리는 이 회원정보를 추출하여 회원가입만 시키면된다.

 

 


5. 구글 로그인을 위한 User 도메인 수정

      - 소셜 로그인을 한 유저인지 일반로그인한 유저인지 판단하기 위해 domain 내용을 수정할 것이다.

      - 생성자를 직접 만들어 사용하게 되면 기본생성자가 필요하여 "@NoArgsConstructor" 를 추가했다.

      - 무분별한 객체생성을 막기위해 기본생성자는 protected 레벨로 만들었다.

 

 


6. PrincipalOauth2UserService 내용 변경

 

     - 회원가입 과 로그인 처리를 위해 내용을 변경해보자

     - 받아온 정보로 회원을 조회하여 존재하면 로그인을 진행하고 없으면 회원가입 후 로그인을 진행 할 것이다.

     - 회원가입시

  • username은 OAuth주체 + 해당OAuth의 가입되어있는 회원의pk값
  • pawword는 아무 임의값을 암호화한값
  • provider는 OAuth 주체
  • providerId는 OAuth의 가입이되어 있는 회원의 PK값
  • email은 받아온 정보에서 추출한 이메일
  • 권한은 "ROLE_USER" 로 설정한다.
  •     

 

 

이번시간에는 여기서 마치고 다음시간에는 네이버 로그인을 해보며 OAuth 관련 인터페이스를 만들어 통합할 것이다.