You are a developer, not a coder.

Oauth 2.0 본문

FrameWorks/Spring (Boot포함)

Oauth 2.0

Mattmk 2020. 3. 13. 17:33
SMALL

1. 개요

인증 및 권한부여를 위해서 Oauth 프레임워크의 현재 최신 버전은 2.0이며, 해당 버전의 스펙 문서는 https://tools.ietf.org/html/rfc6749에서 확인할 수 있다.

Oauth2.0은 인증 및 권한부여에 관한 기본적인 흐름뿐만 아니라 목적에 맞게 확장할 수 있도록 설계되어 있다.

Oauth2.0은 외부 서비스 (third-party application)의 인증 및 권한부여를 관리하는 범용 프레임워크 이다.

Oauth 기반 서비스의 API를 호출을 할 때에는, HTTP 헤더에 access token을 포함하여 요청을 보내게 된다.

서비스는 access token을 검사하면서 이 요청이 유효한지 판단하여 적절한 결과를 응답한다.

2. 흐름도

직접 구현하기 전, 구상한 워크 플로우

뭐 구현하기 전에는 음... Server는 Access Token 기반으로 움직이기 때문에 더이상 인증값을 Session 이나 Cookie를 이용해 상태를 유지하기 보다는 Token값을 Local Stoage에 담아 활용하는 방안이 보안이나 기능적인 면으로 간편하다는걸 이해했다.

 

 

직접 구현 한후, 워크플로우

구현한후는 용어가 색다르다는걸 느꼈다.

Oauth에서의 Client는 우리가 일반적으로 알고 있는 사용자가 아닌 내가 되는것. 즉, 직접 서비스를 운용하고 있는 대상이다.

Resource Owner가 사용자

Resource Server는 Oauth기반 (Naver, Facebook, Google 등...) SSO 인증 서비스를 대행해 주는 서비스

 

사용자 쪽에서는 내가운영하고 있는 웹사이트의 홈페이지를 보고 있을 것이다.

사용자가 데이터를 운영하고 있는 웹사이트에 던지면, (즉, 제공해주는 측면이므로 Owner)

운영하고 있는 웹사이트에서 그 정보를 받아, 사전에 Resource Server와 계약을 맺은 특정값 (SSO를 위해서는 사전신청이 필요하다) 얘 너네 회원 맞아? 맞으면 우리서버로 결과값 보내줘 하는것.

우리서버로 결과값이 오면, 로직에 맞게 해당 데이터를 가공 및 처리한 후, 사용자에게 던져 자연스럽게 화면을 구상하면 사용자 입장에서는 엥? 얘네 페이지에 로그인하는건데 간편로그인으로도 되네?신기하네? 하는것이다.

위의 워크플로우는 넓은 시야에서 봤을 때, Oauth 워크플로우의 전부라고 볼 수 있다. (핵심은 넓게 봤을때)

 

다음으로, 순차적으로 워크플로우를 아래에 그려 나아 보겠다.

 

직접 구현 한후, 워크플로우2

각각, 해당 로직에서 어떻게 워크플로우가 진행이 되는지, 좀더 자세히 적어서 그려 보았다.

여기에서 핵심은 Client가 필수요소로 보내는것 중 하나인 Redirect Uri를 Resource Server에 보내면

기존에 Resource Server가 Redirect Uri값을 기억하고 있는 값과 비교를 해서 같다면 해당 Redirect Uri로 결과값을 Return 해준다는 것. 만약, 다르다면 Resource Server Error RedirectUri값을 내뱉고, Return해줄 것이다.

 

 

직접 구현 한후, 워크플로우3

위는 각각 해당 워크플로우 동작 시, 필요로 하는 필수값을 구상해서 그린 것이다.

 

3. 정리

이번을 통해 Oauth 2.0을 완전히 이해를 했다고 보기는 어렵지만, 나름 Naver 기반의 Test Code를 짜보고, 실행하며 삽질을 조금 해 보았다.

네이버 개발센터에서 보면, 방법이 여러가지가 있다.

Javascript, Jsp, node.js 등...

처음에 JavaScript를 해보곤, 음...? 생각보다 잘되는데? 이거 뭐야 엄청 쉽네?? 라는 생각이 들다가

토큰갱신 (Reflash Token)을 구현하다 Javascript에서 지원하는 js파일의 경우 ApiUrl부분을 직접 수정이 불가 하다는걸 알았다. (JS파일을 열어보아서 분석하였으나 없었음)

그래서 JSP로 다시 테스트를 진행 한 후, JSP파일에 BackEnd 로직이 들어가는게 너무 보기 싫어서 (성격상...)

Java에 로직을 녹인 뒤, JSP에서 테스트하게끔 소스를 구현해 보았다.

 

시간이 없어 소스코드를 정리하지 못했다.

밤에 공부해서 작업하다 보니... 이상한 소스들이 있을 수 있다.

아침에 시간을 내, 작업한 소스를 보니... 음..? 하는부분이 없지않아 있었다.

그래도 참고하고 싶으신 분들은 GitHub에 Upload 하였으니, 참고하시면 될듯 하다.

향후, 소스 정리 및 고도화?를 할 예정이다.

 

 

https://github.com/MattMinKyu/Oauth2.0_Sample_Naver.git

 

MattMinKyu/Oauth2.0_Sample_Naver

Contribute to MattMinKyu/Oauth2.0_Sample_Naver development by creating an account on GitHub.

github.com

 

 

* 4가지 타입의 OAuth 인증방식 나열

  • Authorization Code Grant.

       - Resource Owner 가 Client에 ClientId, ClientSecret, AuthType,redirectUrl을 넘겨 인증코드를 Return 받고 인증코드, ID,              Password를 Client로 다시 전송 -> Client가 인증서버에 로그인을 요청하는 방식

  • Implicit Grant.

       - Resource Owner가 Client에 ClientId, AuthType, redirectUrl을 넘기면 인증서버가 Token을 넘겨주는 방식 

  • Resource Owner Password Credentials Grant.

       - Resource Owner가 Client에 ClientId, ClientSecret, ID, Password, AuthType을 넘기면 Client가 인증서버에 로그인을 거쳐           Token을 다시 주는 방식

  • Client Credentials Grant.

       - ResourceOwner가 직접 인증서버에 ClientId, ClientSecret, ID, Password, AuthType을 요청하여 Token을 받아오는 방식

LIST
Comments