OAuth2 flow

ᄋᄌᄒ·2023년 12월 19일
1

Spring_Security

목록 보기
2/5
post-thumbnail

글을 쓰기 전에

진행하는 프로젝트에서는 두가지의 인증방식을 구현할 생각이다. 하나는 서버에서 직접 인증을 거쳐 토큰을 주는 형식과, 하나는 인증을 대리로 해주도록 타 서버를 이용하는 것이다. 전자는 jwt 토큰을 사용하면서 이미 구현완료되어있다. 후자의 방식을 구현할 예정인데, OAuth2를 이용하는 것이다.

본론

flow diagram

[OAuth2 + JWT flow]

[PAYCO OAuth 2.0 프로세스]
payco oauth2

처음 사진은 인증을 받아오는 과정과 인증을 서버에서 처리하는 과정까지 디테일하게 보여주고 두번째 사진은 인증 서버와 서비스, 사용자간의 흐름만을 보여주고 있다. 우선 이번 글에서는 payco oauth2 프로세스 그림을 위주로 설명을 할 예정이다.

용어 정리

  • Authorization Server : authorization service를 대행해주는 네이버, 카카오, 구글 등의 서버
  • Resource Owner : client(서비스를 이용하는 사용자)
  • Client : service, authorization server로부터 인증대행을 받는 서버

1. 로그인 요청과 Authorization서버의 로그인 페이지 제공

요새 웬만한 웹&앱 서비스를 보면 아래 사진(ex.inflearn login service)과 같이 카카오,구글,네이버,깃허브 등등의 서버를 통해 인증과정을 거치는 경우가 많다. 아래 버튼들이 각 Authorization server에게 로그인 페이지를 제공하는 url로 이동하는 상호작용 버튼들인 것이다.

요청 URL example

http://nid.naver.com/oauth2.0/~&client_id=1&scope=email,name&redirect_uri=http://localhost:8080/login/oauth2/code/naver

여기서 client_id는 authorization server들로부터 로그인 서비스 기능 권한을 발급받을 때 client ID & password 이다. 따라서 Client(서비스), resource owner가 아닌 auth를 대여중인 서버를 뜻하는 것이다!

[inflearn login service]
inflearn login service
[apple login]
apple login
authorization_uri이다. 회원정보를 authorization server에 보내는 것이다.Resource Owner(사용자)가 입력한 ID/PW와Authorization Server(네이버 인증 서버)에 등록된 ID/PW를 비교해서 일치 여부를 확인한다.

일치하면, Client(서비스)가 사용하려는 Resource Server(네이버 API 서버)의 Scope(기능)에 사용을 동의하는지, Resource Owner(사용자)의 동의를 요청하는 페이지를 제공한다.

Resource Owner(사용자)가 동의를 눌렀다는 것의 의미는,Client(서비스)에 Resource Owenr(사용자)가해당 기능 사용을 위임(delegation)했다는 것을 의미한다.

따라서, 동의를 누르면 Client(내 서비스)에 Resource Owner(사용자)가 권한을 위임했다는 승인이 Authorization Server(네이버 인증 서버)에 전달된다.

2. AuthorizationCode 발급 및 redirect

위의 과정을 거친다면 authorization server는 인증과정을 거쳐 Client(서비스)에게 해당 resource Owner(사용자)가 사용할 권한을 가진 유저임을 authorizationCode를 넘김으로써 승인하게된다. 이때 바로 Client와 통신을 하는 것이 아닌 resourceOwner에게 AuthorizationCode를 담은 redirect_URL을 보내게된다.

example

http://localhost:8080/login/oauth2/code/naver?code=3

3. AccessToken요청&발급

사용자는 redirect한 url에서 authorizationServer에게 다시 Token을 발급받는 request를 요청하게된다.

access token request example

https://nid.naver.com/oauth2.0/token?grant_type=authorization_code&code=3&redirect_uri=http://localhost:8080/login/oauth2/code/naver&client_id=1&client_secret=A

authorization Server가 넘겨받은 정보는 아래와 같다.

  • code(authorization code)
  • redirect_uri
  • client_id(oauth2를 사용하기 위해 발급받은 서비스의 아이디)
  • client_password(oauth2를 사용하기 위해 발급받은 서비스의 비밀번호)

이제 이 정보들을 모두 비교한 뒤 일치한다면 다시 client(서비스)에게 accessToken을 발급하여 response에 담아 넘겨준다. authorizationCode는 accessToken을 발급받았기 때문에 지워준다.

4. 인증 완료 후 서비스 이용

위 페이코 oauth2 프로세스 과정을 보면 accessToken을 통해 payco의 api를 요청하는 과정이 있지만 단순히 oauth2를 통해 Client의 인증 요청만 할것이기 때문에 사실 accessToken은 크게 필요없다.

따라서 가져오는 데이터 중 accessToken보다 email에 집중할 생각이다. 왜냐하면 우리 프로젝트에서는 email을 고유값으로 사용할 예정이며, 서버 내에서도 이메일 인증 기능이 구현이 되어있다. 따라서 Authorization server에서 필수적으로 resource Owner의 이메일 데이터를 가져와 client에서 활용할 수 있도록 할 것이다.

oauth2를 통해 인증 이후 과정은 jwt Token을 사용하는 것과 유사하고 자세한 부분은 다음 글에서 코드와 함께 다룰 예정이다.

글을 마치면서

생각해보면 이미 oauth2를 구현한게 3번째다. 토이프로젝트, aws, 그리고 이번 프로젝트에서 공부를 해봤는데, 이번에야 제대로 이해한 기분이 든다. 토이프로젝트때는 다른 방식으로 구현을 했고, aws때는 oauth2보다 서버 배포 공부가 시급했기에 단순히 클론만했었기에 기억이 남지 않았다.
다음 글은 다음 글에서 작성할 코드 내용들과 관련이 있기 때문에 비교하면서 보면 도움이 되지 않을까?싶다

reference

https://europani.github.io/spring/2022/01/15/036-oauth2-jwt.html#h-applicationyml
https://ksh-coding.tistory.com/62

0개의 댓글