봄 보안 OAuth2를 프로필

개요

도움말을 신속 봄 보안 OAuth2를 봄 시작이 섹션의 목적은 내장 효과적으로 통합 로그인, 권한 부여 및 자원 보호 여러 서비스를 제어 할 수있는 마이크로 엔터프라이즈 서비스 아키텍처에 도움 사람들에 대한 액세스 서비스 및 리소스에 대한 권한을 확인 세트를 제공합니다 작업
의 OAuth 무엇
의 OAuth 프로토콜은 보안 권한이 부여 된 사용자 리소스, 개방하지만 단순한 기준을 제공합니다. 타사 (예 : 사용자 이름 및 암호) 계정 정보에 OAuth를 터치 권한이없는 것을 제외하고 이전의 인증 방법으로 해당 사용자 이름과 사용자가 리소스를 적용 할 수있는 비밀번호를 사용하지 않고 타사 권한은 OAuth는 안전합니다.
어떤 보안 봄이다
봄 보안은 이전에 봄 선언 엔터프라이즈 애플리케이션에 대한 안전한 액세스 제어를 제공하기 위해 Acegi Security는 알려진 보안 프레임 워크입니다. 봄 보안 필터 서블릿이 기반하고 AOP IOC의 및 전화 식별 및 인증 처리 코드를 웹 요청을 제공하는 방법을 피할 결합 작업의 코드 중복의 양을 감소시켰다.

왜 OAuth2를

시나리오
우리는 당신이 "클라우드 노트"제품이 있다고 가정하고, "클라우드 노트 기록 서비스"사용자가 다른 장치 (PC, 안드로이드, 아이폰, TV 필요 "클라우드 앨범 서비스"를 제공 , 시계) 이 액세스 최대 "자원"(메모, 사진)

그래서 사용자는 그들에게 속한 자원의 일부를 액세스 할 수있는 방법? 이 때, 기존의 접근 방식은 자원을 얻을 수 성공적으로 로그인 한 후 "클라우드 노트"우리 자신의 계좌 번호와 비밀번호를 제공하는 것입니다. 그러나 이러한 접근 방식은 다음과 같은 질문을해야합니다 :

"클라우드 노트 기록 서비스"와 "클라우드 앨범 서비스"를 각각 배포됩니다 우리는 차이를 기록하는 건가요?
타사 응용 프로그램이 우리의 액세스하려는 경우 "클라우드 노트,"마 그에게 그것을 기록하고 우리의 자원에 액세스 할 수 있도록, 타사 응용 프로그램에 계정과 암호를 제공하기 위해 사용자가 필요하지?
우리의 방법은 사용자 제한 타사 응용 프로그램 "클라우드 노트,"위임 및 사용 기간? 그것은이해야 할 모든 정보가 영구적으로 노출되어 있습니까?
당신이 권한을 복구 할 수있는 비밀번호를 변경 한 경우, 모든 타사 응용 프로그램은 모두 실패합니다.
한은 금이 된 타사 응용 프로그램에 대한 액세스가있는 한 후, 사용자의 암호가 손상되고, 그 결과는 재앙이 될 수있다.
위의 문제, 우리의 OAuth 응용 프로그램을 해결하기 위해.
용어집
타사 응용 프로그램 (응용 프로그램 타사) 또한 클라이언트 (클라이언트), 장비 (PC, 안드로이드, 아이폰, TV로 알려진 : , 시계) 이전 섹션에서 언급 한 바와 같이, 우리가 이러한 장치에 설치됩니다 같은 우리의 자신의 연구 및 APP 개발. 우리의 제품의 또 다른 예는 타사 로그인 QQ, 미세 문자를 사용하고 싶습니다. 우리의 제품은 타사의 등록 시스템을 로그 QQ, 마이크로 채널이다. 우리는 타사 사인온 (SSO) 시스템 리소스 (아바타, 별명 등)가 필요합니다. QQ, 미세 문자와 다른 시스템의 경우, 우리는 또한 타사 응용 프로그램입니다.
HTTP 서비스 공급자 (HTTP 서비스) : 우리의 클라우드 노트와 제품 QQ, 마이크로 채널과 소위 할 수있다 "서비스 제공."
자원 소유자 (리소스 소유자) : 또한 사용자 (사용자)라고도합니다.
사용자 에이전트 (사용자 에이전트) : 같은 브라우저, 대신 이러한 리소스에 액세스 할 수있는 사용자로.
인증 서버 (인증 서버): 로그인 기능은 핸들 인증, 간단한 포인트로 디자인 된 ISP 서버 (사용자 계정 암호가 올바른지 확인하고 적절한 권한을 할당)
리소스 서버 (서버 리소스) : 저장하는 사용자가 생성 한 자원에 대한 서비스 제공 서버. 동일한 서버 일 수있다 또한 인증 서버는, 그것을 다른 서버 일 수있다. 단순히 자원 서버를 호출 할 수 같은 "클라우드 노트 기록 서비스"와 "클라우드 앨범 서비스"에서 언급 한 부분과 같은 리소스에 액세스, 입구입니다했습니다.
상호 작용
은 "클라이언트"와 "서비스 제공자"사이의 OAuth는 인증 (인증 층) 층을 설정합니다. "클라이언트"는 "서비스 제공자"에 직접 로그인 할 수 있습니다 만 로그인 권한 부여 층, 사용자와 클라이언트 영역을 구분하기 위해서입니다. 다른 사용자 (토큰) 토큰 및 암호와 "클라이언트"등록 기관 층. 사용자는 시간이 로그인 권한의 권한 수준을 지정하고 토큰이 유효 할 수 있습니다. 개방에 저장된 "클라이언트"사용자 데이터에 대한 범위 및 토큰의 유효성의 권한 하에서 "클라이언트"로그인 인증 층 "서비스 제공자"후.
그림 삽입 설명 여기

개방형 플랫폼

상호 작용 모델
의 상호 작용 모델은 세 개의 정당을 포함한다 :

자원 소유자 : 사용자
클라이언트 : APP의
서비스 제공 업체 : 두 개의 문자가 포함되어
인증 서버
리소스를 서버
인증 서버
인증 서버는 사용자 인증을 담당하고, 클라이언트에 부여 된 권한을. 인증은 (확인 계정 암호)를 구현하기 쉽고, 문제는 어떻게 인증입니다. 예를 들어, 우리는 당신이 낱말과 올바른 정보 "는 다음과 같은 권한을 받게됩니다 윤리 클라우드 노트 'QQ 로그인 페이지의 허가 된 사용에가 볼 수 있듯이", 윤리 클라우드 노트'에 타사 로그를 사용하여
그림 삽입 설명 여기
클라이언트의 요청 권한을 알고 인증 서버 요구 사항을 정체성과 클라이언트 요청의 권리. 우리는 각 클라이언트 사전 할당 된 ID 및 대응 이름 및 각 ID에 대한 권리 정보를 종료 할 수 있습니다. 이 정보는 서버 인증의 구성 파일에 기록 할 수 있습니다. 클라이언트는 때마다 당신은 ID가 같은 자신의 개방형 인증 페이지를 통해 통과 할 때 :

http://www.funtl.com/login?client_id=yourClientId

시간이 지남에 따라 성장에 걸쳐 비즈니스, 당신은 찾을 구성 작업이 소비에게 너무 많은 인력을 수정합니다. 지루한 수동 작업에서 해방,이 과정을 자동화 할 수있는 방법이 있습니까? 당신은 자연 일 오픈 플랫폼을 형성,이 단계를 고려하기 시작합니다.
OAuth2를 개방형 플랫폼
오픈 플랫폼은 계약 OAuth2.0에 제품에서 파생됩니다. 의 역할은 클라이언트가 자동으로 양수인이 CLIENT_ID 시스템, 자동 업데이트의 채택 후, 위의이 사항을 적용하고 구성 (일반적으로 데이터베이스에 기록)를 완료하기 위해 자신을 등록 할 수 있도록하는 것입니다.

클라이언트는 일반적으로 클라이언트 프로그램 (웹, 앱 등), 사업 설명, 라이센스, 권한의 유형을 작성해야하고, 그래서 정보를 얻으려면, 신청서를 작성합니다. 수동 검토에 의한 정보 서비스 제공을받은 후, 개발 플랫폼은 자동으로 클라이언트에 CLIENT_ID을 할당합니다.

여기, 우리는 로그인 인증, 권한 부여 정보 프리젠 테이션 페이지를 달성했다. 그러므로, 사용자가 성공적으로 인증 후, 인증 서버는 클라이언트, 다음의 프로그램에 따라 생산 access_token이 전송해야합니다 :

让客户端在开放平台申请的时候,填写一个 URL,例如:http://www.funtl.com
每次当有用户授权成功之后,认证服务器将页面重定向到这个 URL(回调),并带上 access_token,例如:http://www.funtl.com?access_token=123456789
客户端接收到了这个 access_token,而且认证服务器的授权动作已经完成,刚好可以把程序的控制权转交回客户端,由客户端决定接下来向用户展示什么内容

令牌的访问与刷新

Access Token
Access Token 是客户端访问资源服务器的令牌。拥有这个令牌代表着得到用户的授权。然而,这个授权应该是 临时 的,有一定有效期。这是因为,Access Token 在使用的过程中 可能会泄露。给 Access Token 限定一个 较短的有效期 可以降低因 Access Token 泄露而带来的风险。

然而引入了有效期之后,客户端使用起来就不那么方便了。每当 Access Token 过期,客户端就必须重新向用户索要授权。这样用户可能每隔几天,甚至每天都需要进行授权操作。这是一件非常影响用户体验的事情。希望有一种方法,可以避免这种情况。

于是 oAuth2.0 引入了 Refresh Token 机制

Refresh Token
Refresh Token 的作用是用来刷新 Access Token。认证服务器提供一个刷新接口,例如:

http://www.funtl.com/refresh?refresh_token=&client_id=

传入 refresh_token 和 client_id,认证服务器验证通过后,返回一个新的 Access Token。为了安全,oAuth2.0 引入了两个措施:

oAuth2.0 要求,Refresh Token 一定是保存在客户端的服务器上 ,而绝不能存放在狭义的客户端(例如 App、PC 端软件)上。调用 refresh 接口的时候,一定是从服务器到服务器的访问。

oAuth2.0 引入了 client_secret 机制。即每一个 client_id 都对应一个 client_secret。这个 client_secret 会在客户端申请 client_id 时,随 client_id 一起分配给客户端。客户端必须把 client_secret 妥善保管在服务器上,决不能泄露。刷新 Access Token 时,需要验证这个 client_secret。

实际上的刷新接口类似于:

http://www.funtl.com/refresh?refresh_token=&client_id=&client_secret=

以上就是 Refresh Token 机制。Refresh Token 的有效期非常长,会在用户授权时,随 Access Token 一起重定向到回调 URL,传递给客户端。

客户端授权模式

概述
客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。oAuth 2.0 定义了四种授权方式。

implicit:简化模式,不推荐使用
authorization code:授权码模式
resource owner password credentials:密码模式
client credentials:客户端模式

简化模式
简化模式适用于纯静态页面应用。所谓纯静态页面应用,也就是应用没有在服务器上执行代码的权限(通常是把代码托管在别人的服务器上),只有前端 JS 代码的控制权。

这种场景下,应用是没有持久化存储的能力的。因此,按照 oAuth2.0 的规定,这种应用是拿不到 Refresh Token 的。其整个授权流程如下:
그림 삽입 설명 여기
该模式下,access_token 容易泄露且不可刷新

授权码模式

授权码模式适用于有自己的服务器的应用,它是一个一次性的临时凭证,用来换取 access_token 和 refresh_token。认证服务器提供了一个类似这样的接口:

https://www.funtl.com/exchange?code=&client_id=&client_secret=

需要传入 code、client_id 以及 client_secret。验证通过后,返回 access_token 和 refresh_token。一旦换取成功,code 立即作废,不能再使用第二次。流程图如下:

그림 삽입 설명 여기
这个 code 的作用是保护 token 的安全性。上一节说到,简单模式下,token 是不安全的。这是因为在第 4 步当中直接把 token 返回给应用。而这一步容易被拦截、窃听。引入了 code 之后,即使攻击者能够窃取到 code,但是由于他无法获得应用保存在服务器的 client_secret,因此也无法通过 code 换取 token。而第 5 步,为什么不容易被拦截、窃听呢?这是因为,首先,这是一个从服务器到服务器的访问,黑客比较难捕捉到;其次,这个请求通常要求是 https 的实现。即使能窃听到数据包也无法解析出内容。

有了这个 code,token 的安全性大大提高。因此,oAuth2.0 鼓励使用这种方式进行授权,而简单模式则是在不得已情况下才会使用。

密码模式
密码模式中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向 “服务商提供商” 索要授权。在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分。

전형적인 예는 기업의 기업 사용에 OAuth2.0에 시스템 내에서 다른 제품입니다. 어떤 경우에는, 제품은 희망의 인증 페이지를 사용자 정의 할 수 있습니다. 이 사용자를 표시 할 필요가있는 사업이기 때문에 다른 단어 "xxx는 다음과 같은 권리를 얻을 것이다"하고 권한을 부여 할 수있는 사용자의 의도를 요청하지만 사용자 인증을 할 수 있습니다합니다. 이 시간, 특정 제품 팀 사용자 인터페이스의 개발은 사용자가 입력 한 계정 암호를 수신 할 수있는 권한 및 권한 부여에 대한 인증 서버에 직접 전달할 수 있습니다.
그림 삽입 설명 여기
주의 할 점은 2 단계에서, 인증 서버는 클라이언트가 신뢰 보장하기 위해 클라이언트의 ID를 확인해야한다는 것입니다.

클라이언트 모드
호출자가 백 엔드 모듈의 경우 신뢰 관계가 더욱하거나, 사용자 인터페이스가 없을 때, 당신은 클라이언트 모드를 사용 할 수 있습니다. 반환 토큰에 의해 검증 후 인증하기 위해 클라이언트에 직접 인증 서버.
그림 삽입 설명 여기

게시 45 개 원래 기사 · 원 찬양 한 · 전망 1062

추천

출처blog.csdn.net/lqq404270201/article/details/104412865