액세스 토큰이 만료되는 이유는 무엇입니까?


209

Google API 및 OAuth2 작업을 시작했습니다. 클라이언트가 내 앱을 승인하면 "새로 고침 토큰"과 짧은 "액세스 토큰"이 제공됩니다. 이제 액세스 토큰이 만료 될 때마다 새로 고침 토큰을 Google에 게시하면 새 액세스 토큰이 제공됩니다.

내 질문은 액세스 토큰 만료의 목적이 무엇입니까? 새로 고침 토큰 대신 오래 지속되는 액세스 토큰이없는 이유는 무엇입니까?

또한 새로 고침 토큰이 만료됩니까?

Google OAuth2 워크 플로에 대한 자세한 내용은 OAuth 2.0을 사용하여 Google API액세스를 참조하십시오 .

답변:


226

이는 구현에 따라 다르지만 일반적인 아이디어는 공급자가 장기 새로 고침 토큰으로 단기 액세스 토큰을 발급 할 수 있도록하는 것입니다. 왜?

  • 많은 공급자가 보안 측면에서 매우 약한 베어러 토큰을 지원합니다. 그것들을 단명하게 만들고 새로 고침을 요구함으로써 공격자가 도난당한 토큰을 남용 할 수있는 시간을 제한합니다.
  • 대규모 배포는 모든 API 호출마다 데이터베이스 조회를 수행하지 않으려는 대신 암호 해독으로 확인할 수있는 자체 인코딩 액세스 토큰을 발급합니다. 그러나 이는 또한 이러한 토큰을 취소 할 수있는 방법이 없어서 짧은 시간 동안 발행되어 새로 고쳐 져야합니다.
  • 새로 고침 토큰에는 더 강력한 클라이언트 인증이 필요합니다. 위의 액세스 토큰과 달리 일반적으로 데이터베이스 조회로 구현됩니다.

4
두 가지 질문 : 1) 모바일 앱의 경우 클라이언트 인증 요구 사항이 더 강력합니까? client_secret은 응용 프로그램 소스 코드의 일부이므로 전혀 비밀이 아닙니다. 액세스 토큰이 TLS를 통해서만 공유되고 첫 번째 글 머리 기호가 적용되지 않는다고 가정하면 추가 보안이 있습니까? 2) 우리 시나리오 에서이 모든 것을 보유한다고 가정하면 (TLS 만 자체 인코딩 불가능한 토큰이 없음) 만료되지 않은 액세스 토큰을 발행해도됩니까?
Thilo

4
베어러 토큰이란 무엇이며 새로 고침 및 액세스 토큰과 어떤 관계가 있습니까?
allyourcode

7
@Thilo 액세스 토큰을 변경할 필요가 없다고 생각합니다. Eran이 지적한 것처럼, 이것은 요청 된 서비스가 <em> 일부 데이터베이스에서 액세스 토큰을 조회하지 않고도 </ em> 요청을 서비스할지 여부를 결정할 수있게합니다. AFAICT는 새로 고침 토큰과 액세스 토큰을 분리하면 얻을 수있는 실질적인 이점입니다.
allyourcode

5
액세스 (소지자) 토큰은 어떻게 수명이 짧습니까? 만료 된 베어러 토큰으로 요청하면 새로 고침 토큰이 새로운 베어러 토큰을 반환합니다. 마찬가지로, 쿠키에서 누군가의 토큰을 훔치고 해당 토큰으로 내 쿠키를 스푸핑하면 서버로 보내면 새로 고쳐지고 새 것이 나옵니다. 그게 뭐야? IP 주소 나 MAC이라고 말하지 마십시오. 그것은 합리적이지 않기 때문입니다.
Suamere

3
@Suamere는 이미 설명되었습니다. 베어러 토큰은 인증 데이터베이스를 건드리지 않는 암호화 프로세스에 의해 유효성이 검사되므로 빈번한 리소스 액세스에 훨씬 효율적입니다. 새로 고침 토큰은 데이터베이스가 여전히 유효한지 확인하는 프로세스에서 유효성이 검사됩니다. 이제 gmail 작동 방식에 대해 생각해보십시오. 누군가 예상치 못한 지리적 위치에서 계정에 로그인하면 경고를받을 수 있습니다. 현재 유효한 새로 고침 토큰이있을 수있는 모든 위치를 볼 수 있습니다. 다른 모든 새로 고침 토큰을 무효화하여 모든 위치에서 로그 아웃 할 수 있습니다.
Bon

33

몇 가지 시나리오는 oauth2 (또는 다른 인증) 시스템을 설계 할 때 액세스 및 새로 고침 토큰의 목적과 엔지니어링 트레이드 오프를 설명하는 데 도움이 될 수 있습니다.

웹앱 시나리오

웹앱 시나리오에는 몇 가지 옵션이 있습니다.

  1. 자체 세션 관리가있는 경우 세션 상태 서비스의 세션 상태에있는 세션 ID에 대해 access_token 및 refresh_token을 모두 저장하십시오. 사용자가 리소스에 액세스해야하는 페이지가 요청되면 access_token을 사용하고 access_token이 만료 된 경우 refresh_token을 사용하여 새 페이지를 가져 오십시오.

누군가가 세션을 도용한다고 가정 해 봅시다. 가능한 유일한 것은 페이지를 요청하는 것입니다.

  1. 세션 관리가없는 경우 access_token을 쿠키에 넣고이를 세션으로 사용하십시오. 그런 다음 사용자가 웹 서버에서 페이지를 요청할 때마다 access_token을 보내십시오. 필요한 경우 앱 서버가 access_token을 새로 고칠 수 있습니다.

1과 2 비교

1에서 access_token 및 refresh_token은 권한 부여 서버 (귀하의 경우 Google)와 앱 서버 사이의 경로를 통해서만 이동합니다. 이것은 보안 채널에서 수행됩니다. 해커는 세션을 가로 챌 수 있지만 웹 앱과 만 상호 작용할 수 있습니다. 2에서 해커는 access_token을 가져 와서 사용자가 액세스 권한을 부여한 리소스에 대한 자체 요청을 구성 할 수 있습니다. 해커가 access_token을 보유하더라도 리소스에 액세스 할 수있는 짧은 창만 있습니다.

refresh_token 및 clientid / secret은 서버에만 알려 지므로 웹 브라우저에서 장기간 액세스 할 수 없습니다.

oauth2를 구현하고 액세스 토큰에 시간 초과를 설정했다고 가정 해 봅시다.

1) 짧은 액세스 토큰과 긴 액세스 토큰은 앱 서버에 숨겨져 있기 때문에 큰 차이가 없습니다. 2) 누군가는 브라우저에서 access_token을 가져 와서 오랫동안 사용자의 리소스에 직접 액세스 할 수 있습니다.

모바일 시나리오

모바일에는 내가 아는 몇 가지 시나리오가 있습니다.

  1. 장치에 clientid / secret을 저장하고 장치가 사용자의 리소스에 액세스하도록 조정합니다.

  2. 백엔드 앱 서버를 사용하여 clientid / secret을 보유하고 오케스트레이션을 수행하십시오. access_token을 일종의 세션 키로 사용하여 클라이언트와 앱 서버간에 전달하십시오.

1과 2 비교

1) 장치에 clientid / secret이 있으면 더 이상 비밀이 아닙니다. 물론 사용자의 허가를 받아 누구나 디 컴파일 한 다음 자신처럼 행동 할 수 있습니다. access_token 및 refresh_token도 메모리에 있으며 손상된 장치에서 액세스 할 수 있습니다. 즉, 사용자가 자격 증명을 제공하지 않고도 앱으로 작동 할 수 있습니다. 이 시나리오에서는 refresh_token이 access_token과 같은 위치에 있기 때문에 access_token의 길이는 해킹 가능성에 영향을 미치지 않습니다. 2) clientid / secret 또는 refresh 토큰이 손상되었습니다. 여기서 access_token 만기 시간은 해커가 사용자 리소스를 얼마나 오래 액세스 할 수 있는지를 결정합니다.

만료 길이

여기서는 access_token 만기 시간이 얼마나되는지에 대해 인증 시스템으로 무엇을 보호하고 있는지에 달려 있습니다. 사용자에게 특히 가치가 있으면 짧아야합니다. 덜 가치있는 것, 더 길 수 있습니다.

Google과 같은 일부 사람들은 refresh_token을 만료하지 않습니다. stackflow와 같은 것들이 있습니다. 만료에 대한 결정은 사용자 편의와 보안 간의 절충입니다. 새로 고침 토큰의 길이는 사용자 반환 길이와 관련이 있습니다. 즉, 새로 고침을 사용자가 앱으로 얼마나 자주 반환하는지 설정합니다. 새로 고침 토큰이 만료되지 않으면 명시 적으로 취소하는 것입니다. 일반적으로 로그온은 취소되지 않습니다.

오히려 길이 게시물이 유용하기를 바랍니다.


MOBILE SCENARIO에 대해 서버에 클라이언트 ID를 저장하면 문제가되지 않습니다. 따라서 다른 앱은 서버에 요청을 보낼 수 있으며 서버를 통해 사용자 리소스에 액세스 할 수 있습니다.
Amir Bar

사실이지만 기본 토큰에 대한 전체 액세스 권한이 아닌 사용자가 제공 한 시설에만 액세스 할 수 있습니다. 즉, 앱을 가장 할 수 있습니다. 종종 토큰에는 광범위한 권한이있을 수 있지만 하위 집합 만 있으면됩니다. 백엔드에서 토큰을 보유하면 필요한 경우 추가 제한이 제공됩니다.
Ed Sykes

11

다른 응답 외에도 :

일단 액세스 토큰은 일반적으로 클라이언트의 모든 요청과 함께 보호 된 리소스 서버로 전송됩니다. 이는 액세스 토큰 도용 및 재생의 위험을 유발합니다 (물론 액세스 토큰이 "베어러"유형 인 경우 (초기 RFC6750에 정의되어 있음).

실생활에서 이러한 위험의 예 :

  • 리소스 서버는 일반적으로 분산 응용 프로그램 서버이며 일반적으로 권한 부여 서버에 비해 보안 수준이 낮습니다 (SSL / TLS 구성이 낮거나 강화 수준이 낮음 등). 반면에 권한 부여 서버는 일반적으로 중요한 보안 인프라로 간주되며보다 심각한 보안 강화가 적용됩니다.

  • 액세스 토큰은 리소스 서버 또는 클라이언트에서 진단 목적으로 합법적으로 수집 된 HTTP 추적, 로그 등에 나타날 수 있습니다. 이러한 추적은 공공 또는 준 공공 장소 (버그 추적기, 서비스 데스크 등)를 통해 교환 할 수 있습니다.

  • 백엔드 RS ​​애플리케이션은 다소 신뢰할 수있는 타사에 아웃소싱 할 수 있습니다.

반면, 새로 고침 토큰은 일반적으로 유선을 통해 번만 전송되며 항상 클라이언트와 권한 부여 서버간에 전송됩니다 . 한 번은 클라이언트가 획득 한 경우 한 번, 새로 고치는 동안 클라이언트가 사용하는 경우 한 번 (이전 새로 고침의 "만료") 토큰). 이것은 인터셉트와 재생을위한 극도로 제한된 기회입니다.

마지막으로 Refresh 토큰은 손상된 클라이언트에 대한 보호 기능이 거의 없습니다.


이것에 대해 약간 다루었지만, 토큰을 얻기위한 (또는 부주의하게 공개하는) 더 큰 공격 영역은 응용 프로그램 로그 또는 엄청나게 추가 된 리소스 서비스 (오늘 MITM 공격이 아님)에 있습니다. 일반적인 API 백엔드의 거의 모든 곳에서 사용 된 액세스 토큰에 액세스 할 수 있습니다 (HttpRequest 등 객체에 대한 액세스 권한이있는 경우). 시스템의 두 코드 경로 만 새로 고침 토큰에 액세스 할 수 있습니다. 처음에는이를 생성하고 새 액세스 토큰으로 교환하는 것입니다. 이는 공격면의 큰 차이입니다.
Tom Dibble

9

본질적으로 보안 조치입니다. 앱이 손상된 경우 공격자는 수명이 짧은 액세스 토큰에만 액세스 할 수 있으며 새로운 토큰을 생성 할 방법이 없습니다.

새로 고침 토큰도 만료되지만 액세스 토큰보다 수명이 훨씬 길어야합니다.


45
그러나 공격자는 새로 고침 토큰에 액세스 할 수 없습니까? 새로운 액세스 토큰을 만드는 데 사용할 수 있습니까?
levi

10
@levi, 해커는 새 액세스 토큰을 생성하기 위해 새로 고침 토큰과 함께 클라이언트 ID 및 클라이언트 암호가 필요하기 때문에 새로 고침 토큰을 사용하여 새 액세스 토큰을 만들 수 없습니다.
스파이크

9
@Spike True이지만 앱에 클라이언트 ID와 비밀이 포함되어 있지 않습니까?
Andy

9
따라서 인터셉트가 일반 데이터 요청 만 포착하는 한 패킷 스니핑으로부터 일부 보호 기능을 제공합니다 (Chuck은 액세스 토큰 만 가져옴)? 조금 약하게 들립니다. 검은 모자는 사용자가 새로운 액세스 토큰을 요청할 때까지 조금 기다려야 클라이언트 ID, 비밀 및 새로 고침 토큰을 얻을 수 있습니다.

3
이것은 여기서 지연 될 수 있지만 SSL을 통해 전송되면 다른 가능한 보안 계층에 추가되지 않습니다. SSL이 무엇인지 모든 사람이 알고 있다고 가정합니다.
데이먼 드레이크
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.