HyeLog

Spring Boot - OAuth2 소셜 로그인 본문

웹 개발/Spring Boot

Spring Boot - OAuth2 소셜 로그인

shj718 2022. 3. 12. 22:37

- 생활코딩 OAuth 강의 내용을 정리한 글입니다. 편의를 위해서 Authorization서버도 리소스서버라고 묶어서 칭합니다!

 

- 사용자가 이용하는 큰 서비스(구글,네이버,카카오)에 등록된 사용자의 아이디와 비번을 나의 앱이 갖고, 큰 서비스에 접근한다면? 너무 위험함! 그래서 아이디와 비번 대신에 '엑세스 토큰'이라는 걸 큰 서비스들이 발급해줌. 나는 그걸 갖고 큰 서비스들에 접근할 수 있음! 대신에 모든 기능을 사용할 수 있는건 아님. 일부 기능만 사용 가능!

 

- 용어 정리: 나의 앱은 클라이언트👧 / 사용자는 리소스 오너🙋‍♂️ / 구글, 카카오 같은 큰 서비스는 리소스 서버(데이터 처리)🧝(+Authorization 서버: 인증 관련 처리)

 

- 클라이언트가 토큰을 사용하려면 구글, 카카오에 '등록'을 해야함. 이때 주는 3가지 정보가 Client ID, Client Secret, Redirect URL임. Client Secret은 절대 외부에 노출되면 안됨! Redirect Url은 나중에 구글, 카카오가 권한 부여 코드(Authorized code)를 줄때 저기로 줌! (Ex. https://rtflix.site)

 

- 사용자3이 [카카오로 로그인하기]를 누르면,

http://리소스서버주소(Ex.구글)/?clientId=2&scope=B,C&redirectURI=http://내가설정한서버주소 로 연결됨

 

- 그러면 유저3이 리소스 서버로 가게 되고, 로그인을 하게 됨. 그러면 리소스 서버가 개인정보제공동의 할건지 유저3한테 묻고, 유저3이 동의하면 Authorized code를 유저3한테 주고 내 앱으로 redirect 시킴!

그럼 내가 그 권한부여코드를 받게됨. 그럼 이제 내 앱이 리소스 서버한테 직접 가서, 내 Client ID, 권한부여코드, Client Secret, Redirect URL 다 보여주고 확인 받음. 리소스 서버는 이 모든 정보가 다 자신이 갖고있는것과 일치한다면, scope에 해당하는 일들을 할 수 있게 해줌! → 클라이언트인 내 앱이 액세스 토큰을 받을 준비가 된것!

그럼 이제 리소스 서버는 나한테 '액세스 토큰 5번' 이런식으로 액세스 토큰을 줌. → 내가 DB에 저장해뒀다가 나중에 내가 액세스 토큰 5번을 갖고 리소스 서버에 접근하면, 리소스 서버는 "이 클라이언트는 유저3에 대해서 scope B,C에 해당하는 일을 할 권한을 갖고 있구나~"하고 인지함!!

 

- 그런데 내 앱이 구글의 scope B, C에 해당하는 작업을 하려면 그들(구글)의 사용 매뉴얼을 따라야함! 그 사용 매뉴얼이 바로 API! 내가 서버이고 유저가 클라이언트일때 그 사이에 있던 것이 API였던 것과 똑같다! 이번에는 내 앱이 클라이언트이고, 구글이 서버이기 때문에 이 사이에도 API가 있는 것이다! 예를 들어, 내 앱이 구글 캘린더의 일정 리스트를 가져오는 작업을 하고 싶다면, GET users/me/calenderList 이렇게 요청해야함! (이렇게 정해진 작업 요청 방식이 바로 API다.)

 

- 그리고 나(의 앱)는 리소스 서버에 접근해서 API 대로 작업하려면, 내가 가진 액세스 토큰을 전달해줘서 내가 자격이 있다는 것을 인증해야함! (액세스 토큰을 리소스 서버로부터 구하는 방법은 각 개발 프레임워크마다 다름!) 이미 구했다고 가정하고, 리소스 서버에 액세스 토큰을 전달해서 나를 인증하는 방법은 2가지가 있음! 하나는 요청의 Authorization Bearer라는 헤더에 액세스 토큰을 넣어서 리소스 서버에 주는 것이고, 다른 하나는 API의 query parameter 즉, users/me/calenderList/?token=5 방식으로 주는 것! 둘 중 전자의 방식이 더 안전하고 선호됨!

 

- 두 방식 모두 curl 을 이용해서 확인할 수 있음! (curl은 Postman이랑 기능은 같은데 커맨드창 버전) 당연히 Postman으로도 확인 가능! (윈도우는 윈도우용 curl을 다운로드 받아야한다💻)

 

📌 아래 사진은 구글에 'Google api access token Oauth 2.0'을 검색하면 나오는 공식 문서의 일부이다.

 

 

갑자기 Postman으로 확인하는 방법이 궁금해져서 구글링해봤는데 재밌고 쉽게 쓴 글을 발견했다.

👀링크: https://velog.io/@d-h-k/Oauth-%EC%B0%8D%EB%A8%B9%ED%95%B4%EB%B3%B4%EA%B8%B0-with-POSTMAN%EC%8B%A4%EC%8A%B5

 

OAuth 찍먹해보기 (with POSTMAN실습 )

Authorizing OAuth Apps 이거 따라한건데, 막연할꺼같아 POSTMAN으로 실습까지 곁들어 봄OAuth Application 등록하기client_id client_secret 발급받기code 발급받기access_token발급먼저 깃허브에 로그인해주세요우

velog.io

 

- 이렇게 액세스 토큰에 대해 알아보았는데, 리프레시 토큰이라는 것도 존재한다! 이건 왜 있냐면, 액세스 토큰의 유효기간이 대개 매우 짧기 때문이다. 1~2시간인 것도 있고 길어봤자 90일이다. 그런데 이 유효기간이 끝날때마다 유저한테 [카카오톡으로 로그인하기]를 시키는 것은 너무 번거롭기 때문에 리프레시 토큰이라는게 존재하는 것이다.

 

- 리프레시 토큰의 작동 원리는 아래 그림처럼 간단하다. 처음에 리소스 서버(사실은 Authorization 서버)가 우리한테 액세스 토큰을 줄 때, 리프레시 토큰도 같이 준다. 그럼 우리는 평소에 리소스 서버에 자원을 요청할 때는 액세스 토큰으로 요청을 보낸다. 그러다가 어느날 (액세스 토큰의 유효기간이 끝난 날) Invalid 토큰이라면서 에러가 뜨면 이때 우리는 리프레시 토큰을 통해서 다시 액세스 토큰을 재발급 받는 것이다! (참고로 이때 리프레시 토큰도 다시 갱신해주는 곳도 있고 액세스 토큰만 갱신해주는 곳도 있다.)

 

 

- 이제 OAuth 의 개념과 원리를 모두 익혔다! 우리가 액세스 토큰으로 할 수 있는 가장 핵심적인 일은 구글 같은 리소스 서버에서의 유저의 식별자(유저가 구글에서 쓰는 지문 같은 것!)를 얻을 수 있다는 것이다. 이 식별자는 일반 앱에서의 아이디와 비밀번호 같은 강력한 역할을 한다!