"리프레시 토큰"의 목적은 무엇입니까?


112

YouTube Live Streaming API와 통합되는 프로그램이 있습니다. 타이머에서 실행되므로 새로 고침 토큰으로 50 분마다 새 액세스 토큰을 가져 오도록 프로그래밍하는 것이 비교적 쉬웠습니다. 내 질문은, 왜?

YouTube에서 인증을 받았을 때 새로 고침 토큰을 받았습니다. 그런 다음이 새로 고침 토큰을 사용하여 한 시간에 한 번 새 액세스 토큰을 얻습니다. 새로 고침 토큰이 있으면 만료되지 않으므로 항상 이것을 사용하여 새 액세스 토큰을 얻을 수 있습니다. 그래서 나는 이것이 처음부터 액세스 토큰을 제공하고 전체 새로 고침 토큰 시스템을 괴롭히지 않는 것보다 더 안전한지 알지 못합니다.



3
액세스 토큰은 무기명 토큰입니다. 다른 식별이 필요하지 않으며 액세스 토큰 만 있으면 귀하를 가장하는 데 필요한 모든 것을 의미합니다. 이 때문에 그들은 항상 수명이 짧아야합니다. 반면 새로 고침 토큰은 무기명 토큰 이 아닙니다 . 새 액세스 토큰을 얻기 위해 YouTube에 새로 고침 토큰을 보낼 때 client_id 및 client_secret도 보내야합니다. 이로 인해 새로 고침 토큰과 client_secret이 모두 손상 될 가능성이 훨씬 적기 때문에 새로 고침 토큰이 더 오래 지속될 수 있습니다.
jrahhali

답변:


97

기본적으로 새로 고침 토큰은 새 액세스 토큰을 얻는 데 사용됩니다.

이 두 토큰을 명확하게 구별하고 혼동을 피하기 위해 다음 은 OAuth 2.0 인증 프레임 워크에 제공된 기능입니다 .

  • 액세스 토큰 은 리소스 소유자의 승인을 받아 권한 부여 서버에서 타사 클라이언트에 발급됩니다. 클라이언트는 액세스 토큰을 사용하여 리소스 서버에서 호스팅하는 보호 된 리소스에 액세스합니다.
  • 새로 고침 토큰 은 액세스 토큰을 얻는 데 사용되는 자격 증명입니다. 새로 고침 토큰은 권한 부여 서버에 의해 클라이언트에 발급되며 현재 액세스 토큰이 유효하지 않거나 만료 될 때 새 액세스 토큰을 얻거나 범위가 동일하거나 더 좁은 추가 액세스 토큰을 얻는 데 사용됩니다.

이제 액세스 토큰을 보호하는 대신 새로 고침 토큰을 발급받는 이유에 대한 질문에 답하기 위해 Internet Engineering Task Force가 새로 고침 토큰 에서 제공 한 주된 이유 는 다음과 같습니다.

보안상의 이유가 있는데, refresh_token는 인증 서버와 만 교환되는 반면 access_token자원 서버와 교환 되는 경우 입니다. 이렇게하면 "1 시간 동안 유효한 액세스 토큰, 1 년 동안 유효한 새로 고침 토큰 또는 good-till-revoked"대 "새로 고침없이 good-till-revoked 액세스 토큰"에서 오래 지속되는 access_token의 누출 위험을 완화합니다. 토큰."

OAuth 2.0 Flow에 대한보다 상세하고 완전한 정보를 보려면 다음 참조를 확인하세요.


5
새로 고침 토큰이 새 새로 고침 토큰을 얻는데도 도움이됩니까?
Gherman

6
만료 될 때 새로운 단기 access_token을 획득하지 않는 이유는 무엇입니까? 어쨌든 새로운 access_token을 위해 서버를 요청해야한다면 왜 오래 살았던 refresh_token을 가지고 있습니까? 또는 refresh_token을 사용하면 살아있는 ID 공급자 쿠키를 유지할 필요가 없으며 쿠키가 오래 전에 사라진 후에도 refresh_token을 기반으로 새로운 access_token을 발행하고 사용자는 자신의 자격 증명을 입력해야합니다. 새로운 access_token?
JustAMartin

2
@JustAMartin OAuth2 클라이언트로서, 새로 고침 토큰이 없으면 다른 액세스 토큰을 얻으려면 전체 인증 흐름을 다시 시작해야합니다 (사용자에게 '로그인'하고 다시 권한 부여). 새로 고침 토큰은이 요구 사항을 일종의 '증거'로 우회하여 클라이언트로서 액세스 토큰을 요청할 수있는 사용자의 권한을 이미 받았습니다.
jrahhali

새로 고침 토큰은 액세스 토큰과 동일하거나 동일한 데이터를 가질 수 있습니까? 새로 고침 토큰의 주요 용도는 사용자 경험을 용이하게하고 리소스에 대한 해커의 액세스 시간을 제한하는 것입니다.
DaviesTobi 알렉스

10

@Teyam 언급 SO post OAuth v2에 액세스 및 새로 고침 토큰이 모두있는 이유는 무엇입니까? 그러나 나는 거기에 다른 대답을 선호합니다 : https://stackoverflow.com/a/12885823/254109

TL; DR refresh_token 은 보안을 강화하지 않습니다. 확장 성과 성능을 향상시키기위한 것입니다. 그런 다음 access_token메모리와 같은 빠른 임시 저장소에 저장 될 수 있습니다. 권한 부여 및 리소스 서버 분리도 허용합니다.


3
@Teyam이 언급 한 것처럼 보안상의 이유가 있습니다. "refresh_token은 인증 서버와 만 교환되는 반면 access_token은 자원 서버와 교환됩니다."
huyz

3
이는 권한 부여 서버가 리소스 서버로서 더 안전하다고 가정하는 경우에만 더 안전합니다. 그렇지 않은 경우 실제로 덜 안전합니다. 새로 고침 토큰이 손상되면 새 액세스 토큰을 얻는 데 사용할 수 있습니다.
Arno van Lieshout

TL; DR ?? 진짜야 ?
Hos Mercury

10

새로 고침 토큰은 적어도 두 가지 용도로 사용됩니다. 첫째, 새로 고침 토큰은 OAuth2 클라이언트가 사용자로부터 데이터에 대한 액세스 권한을 이미 받았음을 나타내는 일종의 '증거' 이므로 사용자가 전체 OAuth2 흐름을 거치지 않고도 새 액세스 토큰을 다시 요청할 수 있습니다. 둘째, 오래 지속되는 액세스 토큰과 비교할 때 전체 보안 흐름을 증가시키는 데 도움이됩니다. 이 두 가지 사항에 대해 좀 더 자세히 다룰 것입니다.

사용자를 괴롭히지 않는 수단으로 토큰 새로 고침

첫 번째 목적에 대해 예를 들어 이야기합시다. 사용자 인 귀하가 YouTube 계정 데이터와 상호 작용하기를 원하는 타사 클라이언트 웹 애플리케이션을 사용하고 있다고 가정합니다. 클라이언트 애플리케이션에 YouTube 데이터를 사용할 수있는 권한을 부여한 후 클라이언트 앱에서 다시 권한을 요청하도록 하시겠습니까?YouTube 토큰이 언제 만료됩니까? YouTube 토큰 만료 시간이 5 분과 같이 매우 낮 으면 어떻게됩니까? 클라이언트 응용 프로그램이 최소 5 분마다 사용자의 허가를 요청하는 것은 약간 짜증날 것입니다! OAuth2가이 '문제'에 대해 제안하는 솔루션은 새로 고침 토큰입니다. 새로 고침 토큰을 사용하면 액세스 토큰이 일시적으로 유지 될 수 있으며 (액세스 토큰이 유출되거나 도난당한 경우 바람직 함) 새로 고침 토큰은 오래 지속되어 클라이언트가 새 액세스를 얻을 수 있습니다. 사용자의 허가없이 (다시) 만료 될 때 토큰.

그런데 왜 새로 고침 토큰일까요? 요점이 권한 요청으로 사용자를 괴롭히지 않는 것이라면 왜 클라이언트는 "Hey, Authorization Server, I want another access token. Now!"라고 말할 수 없습니까? 또는 "Hey Authorization Server, 여기에 만료 된 토큰이 있습니다. 새 토큰을주세요!". 새로 고침 토큰은 클라이언트가 원래 시점에 사용자가 액세스 권한을 부여 받았다는 일종의 "증거"역할을합니다. 이 "증명"은 Authorization Server에 의해 디지털 서명 된 새로 고침 토큰의 형태입니다. 클라이언트가 새로 고침 토큰을 제시함으로써 권한 부여 서버는 클라이언트가 과거 어느 시점에 사용자로부터 권한을 받았는지 확인할 수 있으며 클라이언트는 사용자에게 다시 메시지를 표시하지 않아도됩니다.

보안 강화 수단으로 토큰 새로 고침

그러나 이렇게하면 "새로 고침 토큰이 유출되거나 도난 당하거나 사용자의 요청에 따라 제거하지 않는 악성 클라이언트 응용 프로그램에 의해 단순히 유지되면 어떻게됩니까?"라는 질문이 제기됩니다. 갱신 토큰을 사용하여 유효한 액세스 토큰을 무기한 (또는 만료 될 때까지) 얻습니까?이 질문은 더 안전한 흐름에 기여하는 갱신 토큰의 두 번째 목적에 대해 논의하게합니다.

액세스 토큰에서 발생하는 문제는 일단 획득하면 리소스 서버 (예 : YouTube)에만 제공된다는 것입니다. 따라서 액세스 토큰이 도난 당하거나 손상된 경우 리소스 서버에 해당 토큰을 신뢰하지 않도록 어떻게 알릴까요? 글쎄, 당신은 정말 할 수 없습니다. 이를 수행하는 유일한 방법은 권한 부여 서버에서 개인 서명 키 (처음에 토큰에 서명 한 키)를 변경하는 것입니다. 나는 이것이 불편하다고 생각하며 어떤 경우에는 (Auth0과 같은) 지원되지 않습니다.

반면에 새로 고침 토큰은 권한 부여 서버에 자주 제공되어야하므로 토큰이 손상 될 경우 새로 고침 토큰을 전체적으로 취소하거나 거부하고 서명 키를 변경할 필요가 없습니다.


9

"그래서 처음부터 액세스 토큰을 제공하고 전체 새로 고침 토큰 시스템에 신경 쓰지 않는 것보다 이것이 얼마나 더 안전한지 알 수 없습니다." 나는 같은 질문으로 어려움을 겪었습니다. 짧은 대답은 자격 증명이 만료되지 않았 음을 확인하기 위해 새로 고침 토큰이 필요하다는 것입니다.

예가 도움이 될 수 있습니다. 귀하의 의료 기록을 저장하는 데이터베이스가 있습니다. 귀하는 귀하의 의료 기록을 배우자와 공유하는 데 동의합니다. 귀하의 배우자는 액세스 토큰을 사용하여 내 데이터베이스에서 귀하의 기록을 읽습니다. 지금부터 2 주 후에 귀하의 배우자가 귀하의 의료 기록을 다시 확인하고 새로 고침 토큰을 사용하여 (인증 서버에서) 귀하의 기록을 볼 수있는 권한이 있는지 확인합니다. 새로 고침 토큰은 배우자가 자신의 자격 증명 (사용자 이름 및 암호)을 인증 서버에 다시 입력 할 필요를 우회하지만 여전히 리소스에 액세스 할 수있는 합법성을 보장합니다. 만료되지 않는 액세스 토큰은 귀하가 귀하의 의료 기록에 액세스 할 수있는 배우자의 권리를 취소했는지 여부를 알 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.