Programing

OAuth 2는 보안 토큰을 사용한 재생 공격과 같은 것을 어떻게 보호합니까?

lottogame 2020. 10. 4. 10:13
반응형

OAuth 2는 보안 토큰을 사용한 재생 공격과 같은 것을 어떻게 보호합니까?


내가 이해하는 바와 같이에서 사용자 정보 Site-A에 액세스 하기 위해 OAuth 2에서 다음과 같은 일련의 이벤트가 발생합니다 .Site-B

  1. Site-A에 등록 Site-B하고 Secret과 ID를 얻습니다.
  2. 사용자가Site-A액세스 Site-B, 사용자가 전송됩니다 Site-B그들이 말해 어디에 Site-B그들이 것 참 좋아하는 줄 것을 Site-A특정 정보에 대한 권한을.
  3. Site-B사용자Site-A인증 코드와 함께로 다시 리디렉션 합니다.
  4. Site-A그런 다음 Site-B보안 토큰에 대한 대가 로 해당 인증 코드를 암호와 함께 다시 전달합니다 .
  5. Site-A그런 다음 요청 과 함께 보안 토큰을 번들로 묶어 사용자Site-B 를 대신하여 요청합니다.

이 모든 것이 보안 및 암호화 측면에서 높은 수준에서 어떻게 작동합니까? OAuth 2는 보안 토큰을 사용한 재생 공격과 같은 것을 어떻게 보호합니까?


실생활에서 OAuth 2.0이 작동하는 방식 :

출근길에 올라프의 제과점에서 운전하던 중 창가에서 가장 맛있는 도넛을 보았을 때-제 말은 초콜릿 맛이 떨어지는 것이 었습니다. 그래서 안으로 들어가서 "저 도넛이 있어야합니다!"라고 물었습니다. 그는 "30 달러가 될 것입니다"라고 말했습니다.

그래 알아, 도넛 한 개당 30 달러! 맛있겠 네요! 갑자기 요리사가 "안돼! 도넛은 안돼"라고 외치는 소리를 들었을 때 지갑에 손을 댔다. 나는 물었다 : 왜? 그는 은행 송금 만받는다고 말했습니다.

정말? 네, 그는 진지했습니다. 거의 다 걸어 갈 뻔했지만 도넛이 내게 소리 쳤다. "먹어봐, 맛있어 ..." 도넛의 명령에 불복종하는 나는 누구입니까? 나는 괜찮다고 말했다.

그는 나에게 자신의 이름이 적힌 메모를 건넸습니다 (도넛이 아닌 요리사) : "올라프가 당신을 보냈다고 전 해주세요." 그의 이름은 이미 메모에 적혀있어서 그게 무슨 말인지 모르겠지만 괜찮습니다.

나는 한 시간 반을 내 은행으로 운전했습니다. 나는 은행원에게 쪽지를 건네 주었다. 나는 그녀에게 올라프가 나를 보냈다고 말했다. 그녀는 저에게 "나는 읽을 수 있습니다"라고 말하는 종류의 외모 중 하나를주었습니다.

그녀는 내 메모를 가지고 내 신분을 물었고, 그에게 얼마를 줄 수 있는지 물었다. 나는 그녀에게 $ 30 달러를 말했다. 그녀는 낙서를하고 나에게 또 다른 쪽지를 건네 주었다. 이것은 많은 숫자를 가지고 있었는데, 그것이 그들이 노트를 추적하는 방법이라고 생각했습니다.

그 시점에서 나는 굶주리고 있습니다. 나는 그곳에서 서둘러 나갔고, 한 시간 반 후에 나는 노트를 펴고 올라프 앞에 서 있었다. 그는 그것을 가져다가 살펴보고 "나는 돌아올 게"라고 말했다.

나는 그가 내 도넛을 받고 있다고 생각했지만 30 분 후에 나는 의심스러워지기 시작했다. 그래서 나는 카운터 뒤에있는 남자에게 "올라프는 어디 있지?"라고 물었다. 그는 "돈을 얻으 러 갔다"고 말했다. "무슨 말이야?". "그는 은행에 메모".

허 ... 그래서 올라프는 은행이 나에게 준 메모를 가지고 은행으로 돌아가서 내 계좌에서 돈을 얻었습니다. 그가 은행에서 나에게 준 메모를 가지고 있었기 때문에 은행은 그가 내가 말하는 사람이라는 것을 알았고, 내가 은행과 이야기했기 때문에 그들은 그에게 30 달러 만 주겠다는 것을 알고있었습니다.

내가 고개를 들었을 때 올라프가 마침내 내 도넛을 나에게 건네주고 있었기 때문에 그것을 알아내는 데 오랜 시간이 걸렸을 것 입니다. 떠나기 전에 "올라프, 항상 이런 식으로 도넛을 팔았나요?"라고 물어야했습니다. "아니, 나는 다른 일을 했어요."

허. 차로 돌아갈 때 전화가 울렸다. 나는 대답하지 않았고, 아마도 나를 해고하라는 내 직업이었을 것입니다. 게다가 내가 방금 겪은 과정에 대해 생각하고 있었다.

생각해보십시오. Olaf가 제 계좌 정보를 제공하지 않고도 제 은행 계좌에서 30 달러를 빼앗을 수있었습니다. 그리고 은행에 이미 $ 30 만받을 수 있다고 말했기 때문에 그가 너무 많은 돈을 인출 할 것이라고 걱정할 필요가 없었습니다. 그리고 은행은 그가 올라프에게 줄 쪽지를 주었기 때문에 그가 올바른 사람이라는 것을 알고있었습니다.

좋아요, 제 주머니에서 30 달러를 주 겠어요. 하지만 이제 그는 그 메모를 가지고 있었기 때문에 매주 30 달러를 받도록 은행에 말하고 빵집에 나타나서 더 이상 은행에 갈 필요가 없었습니다. 원하면 전화로 도넛을 주문할 수도 있습니다.

물론 나는 그렇게하지 않을 것입니다. 그 도넛은 역겨 웠습니다.

이 접근 방식이 더 광범위한 응용 프로그램이 있는지 궁금합니다. 그는 이것이 그의 두 번째 접근 방식이라고 언급했으며 Olaf 2.0이라고 부를 수 있습니다. 어쨌든 집에가는 게 좋을 텐데, 새 직장을 찾아야 해요. 하지만 마을 건너편에있는 새로운 장소에서 딸기 쉐이크를 받기 전에는 그 도넛의 맛을 씻어 낼 무언가가 필요합니다.


내가 읽은 것을 바탕으로 다음과 같이 작동합니다.

질문에 설명 된 일반적인 흐름이 정확합니다. 2 단계에서 사용자 X는 인증되고 사이트 B에있는 사용자 X의 정보에 대한 사이트 A의 액세스 권한도 부여합니다. 4 단계에서 사이트는 사이트 B에 자신의 비밀을 다시 전달하고 인증 코드와 함께 인증 코드를 전달합니다. (사용자 X의 액세스 토큰)을 요청합니다.

전반적으로 OAuth 2는 실제로 매우 간단한 보안 모델이며 암호화는 직접 작동하지 않습니다. 대신 비밀과 보안 토큰은 모두 기본적으로 암호이며 모든 것은 https 연결의 보안에 의해서만 보호됩니다.

OAuth 2는 보안 토큰 또는 비밀의 재생 공격에 대한 보호 기능이 없습니다. 대신 사이트 B가 이러한 항목을 담당하고 항목이 빠져 나가지 못하게하고 전송 중에 https를 통해 전송되는 것에 전적으로 의존합니다 (https는 URL 매개 변수를 보호 함).

인증 코드 단계의 목적은 단순히 편리하며 인증 코드는 그 자체로 특별히 민감하지 않습니다. 사용자 X의 액세스 토큰을 사이트 B에 요청할 때 사이트 A에 대한 사용자 X의 액세스 토큰에 대한 공통 식별자를 제공합니다. 사이트 B에서 사용자 X의 사용자 ID 만 작동하지 않았을 것입니다. 동시에 다른 사이트로 전달되기를 기다리는 많은 미결 액세스 토큰이있을 수 있기 때문입니다.


OAuth는 타사 앱이 계정과 비밀번호없이 다른 웹 사이트에 저장된 데이터에 액세스 할 수있는 프로토콜입니다. 보다 공식적인 정의는 Wiki 또는 사양을 참조하십시오.

다음은 사용 사례 데모입니다.

  1. LinkedIn에 로그인하여 Gmail 연락처에있는 친구를 연결하고 싶습니다. LinkedIn이이를 지원합니다. Gmail에서 보안 리소스 (내 Gmail 연락처 목록)를 요청합니다. 그래서이 버튼을 클릭합니다.
    연결 추가

  2. 내 계정과 비밀번호를 입력하면 웹 페이지가 나타나고 Gmail 로그인 페이지가 표시됩니다.
    연결 추가

  3. 그러면 Gmail에 "동의"를 클릭하는 동의 페이지가 표시됩니다. 연결 추가

  4. 이제 LinkedIn에서 Gmail의 내 연락처에 액세스 할 수 있습니다. 연결 추가

아래는 위 예의 순서도입니다.

연결 추가

1 단계 : LinkedIn은 Gmail의 인증 서버에서 토큰을 요청합니다.

2 단계 : Gmail 인증 서버가 리소스 소유자를 인증하고 사용자에게 동의 페이지를 표시합니다. (사용자가 아직 로그인하지 않은 경우 Gmail에 로그인해야 함)

3 단계 : 사용자가 LinkedIn에 Gmail 데이터 액세스 요청을 허용합니다.

4 단계 : Gmail 인증 서버가 액세스 토큰으로 응답합니다.

5 단계 : LinkedIn은이 액세스 토큰으로 Gmail API를 호출합니다.

6 단계 : 액세스 토큰이 유효한 경우 Gmail 리소스 서버가 연락처를 반환합니다. (토큰은 Gmail 리소스 서버에서 확인됩니다.)

여기 에서 OAuth에 대한 자세한 내용을 확인할 수 있습니다 .


RFC6750 에서 가져온 그림 1 :

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+

이것이 Oauth 2.0이 작동하는 방식이며이 문서 에서 잘 설명되어 있습니다.

여기에 이미지 설명 입력


이것은 보석입니다.

https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2

아주 간단한 요약 :

OAuth는 네 가지 역할을 정의합니다.

  1. 리소스 소유자
  2. 고객
  3. 리소스 서버
  4. 인증 서버

귀하 (자원 소유자)는 휴대폰을 가지고 있습니다. 여러 이메일 계정이 있지만 하나의 앱에서 모든 이메일 계정을 원하므로 계속 전환 할 필요가 없습니다. 따라서 귀하의 Gmail (클라이언트)은 귀하의 Yahoo 이메일 (리소스 서버)에 대한 액세스 (Yahoo의 인증 서버를 통해)를 요청하므로 Gmail 애플리케이션에서 두 이메일을 모두 읽을 수 있습니다.

The reason OAuth exists is because it is unsecure for GMail to store your Yahoo username and password.

여기에 이미지 설명 입력


The other answer is very detailed and addresses the bulk of the questions raised by the OP.

To elaborate, and specifically to address the OP's question of "How does OAuth 2 protect against things like replay attacks using the Security Token?", there are two additional protections in the official recommendations for implementing OAuth 2:

1) Tokens will usually have a short expiration period (http://tools.ietf.org/html/rfc6819#section-5.1.5.3):

A short expiration time for tokens is a means of protection against the following threats:

  • replay...

2) When the token is used by Site A, the recommendation is that it will be presented not as URL parameters but in the Authorization request header field (http://tools.ietf.org/html/rfc6750):

Clients SHOULD make authenticated requests with a bearer token using the "Authorization" request header field with the "Bearer" HTTP authorization scheme. ...

The "application/x-www-form-urlencoded" method SHOULD NOT be used except in application contexts where participating browsers do not have access to the "Authorization" request header field. ...

URI Query Parameter... is included to document current use; its use is not recommended, due to its security deficiencies


Here is perhaps the simplest explanation of how OAuth2 works for all 4 grant types, i.e., 4 different flows where the app can acquire the access token.

Similarity

All grant type flows have 2 parts:

  • Get access token
  • Use access token

The 2nd part 'use access token' is the same for all flows

Difference

The 1st part of the flow 'get access token' for each grant type varies.

However, in general the 'get access token' part can be summarized as consisting 5 steps:

  1. Pre-register your app (client) with OAuth provider, e.g., Twitter, etc. to get client id/secret
  2. Create a social login button with client id & required scopes/permissions on your page so when clicked user gets redirected to OAuth provider to be authenticated
  3. OAuth provider request user to grant permission to your app (client)
  4. OAuth provider issues code
  5. App (client) acquires access token

Here is a side-by-side diagram comparing how each grant type flow is different based on the 5 steps.

This diagram is from https://blog.oauth.io/introduction-oauth2-flow-diagrams/

여기에 이미지 설명 입력

Each have different levels of implementation difficulty, security, and uses cases. Depending on your needs and situation, you will have to use one of them. Which to use?

Client Credential: If your app is only serving a single user

Resource Owner Password Crendential: This should be used only as last resort as the user has to hand over his credentials to the app, which means the app can do everything the user can

인증 코드 : 사용자 인증을 얻는 가장 좋은 방법

암시 적 : 앱이 모바일 또는 단일 페이지 앱인 경우

여기에 선택에 대한 자세한 설명이 있습니다 : https://blog.oauth.io/choose-oauth2-flow-grant-types-for-app/

참고 URL : https://stackoverflow.com/questions/4727226/how-does-oauth-2-protect-against-things-like-replay-attacks-using-the-security-t

반응형