oauth2

반응형

 

OAuth 2

 

OAuth 2 의 경우

 

Resource Owner : OAuth 1 의 User 와 같다. 리소스(가령 페북의 본인 사진 같은 것.) 의 개인 소유주이다. 

Client : Authorization Server 에 등록되어 사용자와의 상호작용을 위한 것. (페이스북의 앱 같은 것, App Id, App Secret 을 제공해준다. 네이버는 컨슈머라 칭한다.)

Authorization Server : 실제 인증 및 인가를 위한 기능을 한다. 이곳에 Client 가 등록을 하고 Resource Owner 가 Client 에게 기능을 위임할 수 있도록 한다.

Resource Server : API 를 통한 자원을 획득할 수 있는 실제 서비스 서버.

 

와 같은 주체들이 있다.

 

Grant Types (Flow) 에는 다음과 같은 것 들이 있다.

 

Authorization Code : 보통 백엔드 서버를 가지고 있을 때 해당 백엔드 에 Client 기능이 들어가고 해당 기능으로 Resource Owner 를 Authorization Server 에 연결시켜 주고 로그인 시킨 뒤 허락을 받아서 Client 의 리퀘스트 토큰과 Resource Owner 의 허락 정보를 통해 액세스 토큰 및 리프레쉬 토큰을 획득하여 해당 자원 정보를 사용한다. 일반적으로 페이스북 로그인 버튼이나 구글 로그인 버튼 누르면 해당 페이스북이나 구글 공식 로그인 페이지로 리다이렉트 되어 로그인하고 해당 자원 사용을 허가 하시겠습니까 라고 묻는 과정이 이 부분이다. 로그인 인증/인가 뷰가 보여지기 위해 팝업이나 리디렉션이 사용 되는데 팝업은 보통 차단 당하는 경우가 있을 수 있다. javascript 를 통해 클릭한 것 처럼 구현하게 되면 브라우저가 블록 시키므로 유의하자. 따라서 이 방식을 사용하는데 가장 정석적이고 오류없이 사용자 경험을 제공하기 위해서는 리디렉션 방식을 사용하는 것이 좋다. 따라서 Angular 나 React 같은 SPA 는 자체 자바스크립트로 이 부분을 처리하려 하지 말고 이 부분은 서버측의 URL 을 만들어서 리디렉션 하여 처리하는 게 간단하면서도 오류없이 탄탄한 플로우를 만들 수 있을 것이다. 하지만 에어비엔비나 우버는 팝업 방식을 사용하는 것으로 봐서 큰 문제는 없어보인다. 기본적으로 우버의 가입은 이메일과 비번 가입이고 소셜은 연결하는 방식이다. 페이스북으로 로그인 버튼만으로 가입이 완료되지는 않았다.

 

Implicit Grant : javascript 나 앱 상에서 직접적으로 Authorization Server 로 부터 액세스 토큰을 획득하여 사용. 만료 시간이 지나면 재요청을 해야 한다. 인증이 지속되지 않는다.

 

Resource Owner Password Credentials : Authorization Server 를 가진 서비스 제공자 스스로가 만든 공식 애플리케이션 과 같은 경우 직접적으로 자원 소유자 (즉, 사용자) 로 부터 아이디와 비번을 직접 입력 받고 액세스 토큰을 발급받아 로그인을 지속적으로 유지한다. 아이디와 비번을 통하여 로그인하여 세션을 통한 로그인 유지가 아니라 아이디와 비번을 입력하고 Authorization Server 에 요청한 뒤 엑세스 토큰 및 리프레쉬 토큰을 발급받아 해당 토큰을 통해 로그인을 유지하고 사용한다.

curl acme:acmesecret@localhost:8035/oauth/token -d grant_type=password -d username=user -d password=e1c6730c-f0d6-4034-af61-84279e9e461a

{"access_token":"1e1f4560-d170-4845-8742-ccdc56f0475d","token_type":"bearer","refresh_token":"28c36aa3-3cd4-4d71-ba1c-25b5e96cad96","expires_in":43095,"scope":"read write"}

 

Client Credentials : 클라이언트의 아이디와 시크릿을 통해 직접 Authorization Server 로 인증한다. 클라이언트 자신이 가진 자원 가령 AWS 의 S3 저장소에 파일 저장하는 기능 등을 하기 위해 사용한다.

curl acme:acmesecret@localhost:8035/oauth/token -d grant_type=client_credentials

{"access_token":"cfd52666-58c6-41e6-add2-14c7c0f48705","token_type":"bearer","expires_in":43071,"scope":"read write"}

 

그 외에  Device Profile , SAML bearer assertion, JWT Profile for Authorization Grants, Token Exchange Grant, Message Authentication Code Tokens 방식 등등 OAuth2 Extension Grants 들이 있다.

 

 

클라이언트 프로파일 에는 서버사이드 웹 애플리케이션, 웹 브라우저에서 실행되는 클라이언트 사이드 애플리케이션, 네이티브 애플리케이션 등이 존재한다.

 

 

 

* 개발을 위해 로컬 호스트에서 페이스북 앱을 위한 설정 방법

 

/etc/hosts 에 

127.0.0.1 local.example.com 을 입력하고 이 도메인을 등록한다.

 

또는 테스트용 앱을 만들면 localhost 도 동작을 한다. 테스트용 앱이 아닐 경우에는 localhost 도메인은 동작하지 않았다.

웹사이트 플랫폼 (클라이언트) 추가 를 하고 http://localhost:8035/ 와 같이 추가한다.

앱 설정 상의 앱도메인 에는 localhost 를 등록한다.

GitHub 같은 경우는 그냥 localhost 가 동작하였다.

Homepage URL : http://localhost:8035

Authorization callback URL : http://localhost:8035/

와 같이 입력하였다. 

 

 

 

 

https://tools.ietf.org/html/rfc6749

 

RFC 6749 - The OAuth 2.0 Authorization Framework

[Docs] [txt|pdf] [draft-ietf-oaut...] [Tracker] [Diff1] [Diff2] [IPR] [Errata] Updated by: 8252 PROPOSED STANDARD Errata Exist Internet Engineering Task Force (IETF) D. Hardt, Ed. Request for Comments: 6749 Microsoft Obsoletes: 5849 October 2012 Category:

tools.ietf.org

 

https://spring.io/guides/tutorials/spring-boot-oauth2/#_social_login_simple

 

Spring Boot and OAuth2

this tutorial is designed to be completed in 2-3 hours, it provides deeper, in-context explorations of enterprise application development topics, leaving you ready to implement real-world solutions.

spring.io

 

반응형

댓글

Designed by JB FACTORY