JWT 토큰 인증 방식은 프론트 쪽에서 구글 인증 및 access token을 발급받고, 백엔드에 요청을 보낼 때 구글에서 받은 사용자 정보를 JWT 토큰으로 암호화하여 토큰을 활용해 현재 유저를 식별하도록 하였다.
카카오/구글 모두 access token으로 사용자 정보를 조회할 수 있다. access token은 일회성이라 한번 사용했다면 다시 재발급을 받아야 한다.
Client : 커뮤니티 서비스
Resource Owner : 사용자
Service Provider : 구글, 카카오, 페이스북
1. Service Provider에 Client 정보 등록
Redirect URI
Service Provider가 Client에게 Access Token과 토큰을 발급받기 위해 Authentication Code를 전해주는 경로
2. Client의 인증 요청 & 권한 부여 요청
사용자가 Client의 회원가입 페이지로 이동하여 구글로 가입하기를 선택하면
Client는 Authroization Server에 인증을 요청한다.
Service Provider는 두개의 서버가 있는데, 인증 및 권한 부여를 담당하는 Authorization Server(인증 서버)와 사용자의 데이터를 관리하는 Resource Server(리소스 서버)가 있다.
권한 인증을 요청할 때는 처음에 등록한 Client Id와 사용할 리소스의 범위를 나타내는 Scope, 그리고 Resource Owner의 리소스 사용 승인 시 임시 토큰인 Authorization Code를 전달할 Redirect Url을 함께 파라미터로 넘겨준다.
예를 들어 Client Id가 test, 접근할 정보가 email, name이고 redirect url은 /myserivce/auth/success라고 하면,
쿼리 스트링으로 https://auth.google.com/profile?clientId=test&scope=email,name&redirect_url=/myserivce/auth/success
이런식으로 보여진다.
그러면 Service Provider에서는 Resource Owner가 로그인하여 리소스 사용을 승인할 수 있는 페이지로 302 응답을 통해 Resource Owner를 이동시킨다.
이 페이지는 Client가 사용할 권한 목록을 Resource Owner에게 명시적으로 보여주며, Resource Owner는 이에 동의 시 "나는 Client가 Scope에 명시한 범위 안에 있는 내 데이터에 접근할 권한을 부여하는 것에 동의합니다"라고 말하는 것과 같다.
3. Access Token 발행 요청
Client는 서비스 제공자에게 Client Id와 Secret Key, Access Token이 발행되면 아까 Authentication Code를 발급 받을때 사용했던 Redirect Url, 그리고 아까 Resource Owner에게 받은 인가 코드를 가지고 Access Token을 발행 요청을 한다.
서비스 제공자의 인증 서버는 리소스에 접근할 수 있는 Access Token과 Refresh Token을 발행하고 Client에게 보내준다.
4. 리소스에 접근 요청
Access Token을 받고 Client는 이 토큰을 통해 Resource Server에서 사용자의 정보에 접근한다.
Access Token이 저장된 DB에 비교하여 지정된 Scope에 접근하는 게 맞는지 확인 후 돌려준다.
보통 헤더에 많이 세팅한다.
5. Access Token 재발급 요청
시간이 지나서 Access Token이 만료된다면 좀 전에 말했듯이 Refresh Token을 통해 새로 발급받을 수 있다.
Access Token을 발급받을 때 보통 expires라는 항목으로 유효시간이 같이 넘어오는데, 이를 통해 유효시간이 지났는지 확인할 수 있고 지났으면 Refresh Token으로 재발급받는다.
🍀 구글 OAuth API 프로젝트 환경 구성
구글 API를 사용하기 위해서는 우선 하단의 사이트에서 일련의 구성및 허가 과정을 거쳐야 한다.
Google 클라우드 플랫폼
로그인 Google 클라우드 플랫폼으로 이동
accounts.google.com
프로젝트를 생성 후, OAuth 클라이언트 ID를 만들어서 생성된 클라이언트 ID와 비밀코드를 따로 보관한다.
유출되지 않도록 유의하기!
웹 서버 애플리케이션용 OAuth 2.0 사용 | Authorization | Google Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 의견 보내기 웹 서버 애플리케이션용 OAuth 2.0 사용 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분
developers.google.com
클라이언트 페이지에서 구글 인증 서버로 인증 코드 발급 요청을 보낼 URL에 링크를 건다. 요청을 받는 엔드포인트는 https://accounts.google.com/o/oauth2/v2/auth 이며 상단의 파라미터들을 쿼리스트링으로 만들어, GET 요청으로 전달해야 한다.
access_type값의 경우 offline으로 넘겨야 refresh token이 발급된다.
추가로 사용할 Scope은 email, profile, openid를 설정한다.
인증 코드를 발급받을 때 넘기는 scope 파라미터에 지정을 해두지 않으면 값이 넘어오지 않는다.
사용자가 아이디를 선택해 로그인하면 인증 코드가 발급된다.
인증 코드는 인증 서버를 호출한 클라이언트를 거쳐 다시 서버로 전달되어 아까 인증코드를 요청할때 함께 넘겼던 redirect url로 요청된다.
뒤이어 계속..
'Backend > springboot' 카테고리의 다른 글
[SpringBoot] 스프링부트 구글 로그인 API REST 방식으로 구현하기 (2) | 2023.01.11 |
---|---|
[SpringBoot] 영속성 컨텍스트, 변경 감지와 병합(merge) (0) | 2023.01.06 |
[SpringBoot] @Autowired, IoC(Inversion of Control), DI(Dependency Injection) (0) | 2022.12.23 |
[SpringBoot] Controller vs RestController / RESTful 웹서비스 (0) | 2022.11.05 |
[SpringBoot] 의존성 주입 및 @RequiredArgsConstructor (0) | 2022.11.04 |