이전 포스팅에서 이제 OAuth2.0 을 추가로 사용해보고자한다.
OAuth란?
OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다.
더욱 자세하게 설명하자면,
사용자들이 모든 어플리케이션마다 일일이, 아이디와 비밀번호를 제공하기 귀찮거나,
아이디와 비밀번호를 입력하다 피싱당할 위험이 있으니,
이미 등록해둔 거대 플랫폼(EX: Google, Twitter , KaKao, Naver..) 에서 인증과 토큰을받아서
원클릭 회원가입 And 원클릭 로그인 같은 기능을 구현할수있다.
설명보단 바로 코드로 한번 보자!
0.OAuth2.0 밑준비 (Google)
구글에 "구글 오픈 콘솔" 를 입력하여 다음과 같은 주소로 들어가자
https://cloud.google.com/cloud-console?hl=ko
다음 주소를 클릭해서 '콘솔' 로 들어가자.
프로젝트가없다면, 새프로젝트라고 나올것이다.
필자 같은경우 지금 Security-Oauth를 사용하기에 표시되어있다.
처음 만드시는분은 새 프로젝트를 만들고 이름을 정하자.
생성한뒤에 API 및 서비스 탭으로 이동한다.
OAuth 클라이언트 ID 를 하나 생성을 해주자. 생성을하고 해당 ID를 들어가면,
이런 창이 뜰것이다. 승인된 리다렉션 URI는
필자는 http://localhost:8080/login/oauth2/code/google 를 지정했다.
이렇게 정한이유는 다음과같다.
시큐리티 컨피그에서 OAuth2 리다이렉트의 디폴트값이 /login/ouath2/code/ 이다. 여기서 Google이 들어오면
/login/ouath2/code/google 이라고 지정해준다. 즉 , 따로 설정안해줘도되게 했다.
마음에 들지않는다면 .redirectEndpoint().baseUri() 를 통해서 커스텀설정해주자.
-----------------------------
그런다음, 클라이언트 ID와 보안 비밀이 나온다 이거 꼭 기억해두자.
1. Oauth2 구글 내 어플리케이션에 적용하기
1-1 .Applications.yml 설정을 하자!
구글 오픈 콘솔에서 받은 클라이언트 ID 와 시크릿키를 입력하자.
이걸 통해서 구글 로그인 OAuth를 사용할수있다.
scope는 구글로부터 받는 토큰정보의 범위를 정한다. email, profile를 설정하면 이메일, 프로필정보를 반환받는다.
1-2. 시큐리티 컨피그(security config) 추가
.oauth2Login() : Oauth2 로그인 사용
.loginPage() : 로그인을 진행할 경로설정
.userInfoEndpoint(): 만약, 로그인 인증을 완료했다면, 후처리를 할 클래스를 설정하는 메소드다.
.userService(클래스명) : 서비스 클래스명을 설정하면 설정한 클래스에서 로그인 후처리를 진행한다.
2.PrincipalOauth2UserService 만들기
시큐리티 설정에서 지정한 클래스로 로그인 후처리를 하기로하였으니,
OAuth2 만의 로그인 후처리 클래스를 만들어야한다.
여기서 로그인 후처리 클래스로 자동 회원가입을 만들어볼라고한다.
시큐리티의 DefaultOauth2UserService를 참조한다.
CustomBCryptPassword Encoder는 패스워드 암호화를 담당하는 클래스다. 암호화 하기위해서 하나 만들었다.
암호화 클래스는 이렇게 구성되어있다.
2-1. 로그인 후처리
로그인을 후처리하기위해선, loadUser를 @Override를 받아야한다.
받아오는 정보를 한번 확인해보고싶으면, super.loadUSer(userRequest).getAttributes()로 확인해보자.
받아와서 찍어보면 이런 데이터가 나온다.
userRequest = {sub=102719974891070110569, name=김태홍, given_name=태홍, family_name=김, picture=https://lh3.googleusercontent.com/a/ALm5wu1fVTrSi2p1C9aV727inqrsg6cxx7AQE4z6S2z7=s96-c, email=ajtwu1235@gmail.com, email_verified=true, locale=ko}
tempProvider는 토큰제공자의 회사이름을 저장한다.
회사마다, 데이터 반환이 다르기때문에, 그 규격에맞게 데이터 튜닝을 해줘야한다.
우리는 "google"만 볼거니 GoogleUserInfo클래스를 하나 만들자.
필자는 원클릭 자동회원가입을 지원할것이기 때문에,
구글에서 받아온 정보 4가지를 선정했다.
1. Name : 유저 이름
2. Email: 유저 이메일
3.Provider : 제공자
4.ProviderId: 제공된 유저의 Id (식별자)
요렇게다.
Name은 attributes.get( "name" ) 을 받아오면 이름이 나온다.
email은 attributes.get("email")을 받아오면 이메일이 나온다.
ProviderId는 구글에서 "sub"로 데이터를 반환하기에 sub로 받는다.
provider는 구글임을 이미 클래스에서 선언햇으니 그냥 "google" 로 반환하자.
2-2. 로그인 후처리 2
구글에서 받아온 provider , providerId , username ,email 을 가져와 변수로 저장한다.
유저만들기 위해 필요한 Password는 UUID로 완전한 랜덤한값을 설정하던가,
또는 앱 개발자가 아무렇게 설정한뒤 암호화를 하자.
그뒤, user중복검사를 해준뒤, user가 새로운 유저라면 유저클래스를 만든뒤
JPA저장소에 저장한다.
3. 로그인 시연
구글로그인으로 이동
원클릭 으로 계정하나 선택하자
잘 입력된걸 확인할수있다.
실제로 MySQL 에서도 잘 입력이 된걸 확인할수가있다.
'자바 > 스프링(Spring)' 카테고리의 다른 글
XSS , CORS, CSRF 의 차이점 (0) | 2022.09.28 |
---|---|
스프링 시큐리티 + OAuth2.0 (Kakao편) (0) | 2022.09.25 |
스프링 시큐리티를 사용해보자!! (0) | 2022.09.23 |
자바(Spring) OpenAPI를 통한 JSON Parser 코드 (0) | 2022.09.08 |
ArgumentResovler 와 Interceptor에 대하여 (0) | 2022.08.23 |