Re: [OAUTH-WG] Refresh tokens
George Fletcher <gffletch@aol.com> Thu, 11 July 2019 19:52 UTC
Return-Path: <gffletch@aol.com>
X-Original-To: oauth@ietfa.amsl.com
Delivered-To: oauth@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 2C20B120155 for <oauth@ietfa.amsl.com>; Thu, 11 Jul 2019 12:52:07 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: 0.298
X-Spam-Level:
X-Spam-Status: No, score=0.298 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, FREEMAIL_FROM=0.001, FREEMAIL_REPLY=1, HTML_MESSAGE=0.001, PDS_NO_HELO_DNS=1.295, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=no autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=aol.com
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id EekM4Hq6LPMy for <oauth@ietfa.amsl.com>; Thu, 11 Jul 2019 12:52:04 -0700 (PDT)
Received: from sonic307-2.consmr.mail.bf2.yahoo.com (sonic307-2.consmr.mail.bf2.yahoo.com [74.6.134.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 9997912008B for <oauth@ietf.org>; Thu, 11 Jul 2019 12:52:03 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aol.com; s=a2048; t=1562874722; bh=e4xpYzftk48jovj5GsjtrjKmFvh31+QtFqQ6+hamd28=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From:Subject; b=p5vSrqDVSWAaoV5ahqdpImkwaHlYYOIRCQ8pld95nf2sfbeHEvtfd78wcRbyHxy1JKD3EUEbJFIV91kVBJ6hgPVFFut8uuSxboJWnlBchieaqlZc3n+68GUwzxVvyIkBX70y9j1c+0b26gDqnrWRn2yX+eCQrxuBMRUJF8YNrVvmTYWStg4rJwJJOB/6+ydLA8UXoAILFem+WQ5sQlXvOZT7qeQkZrxp2VYK1TT4z/v1sfoO+Hm7ofE1jO4bnKBiPWdHkMvnA6NN9sqvhJqb2JzR5PO+AsWLQ1iOew58UkRBF7DS29IQATdzy8gy1TimlIm2+pqv9vejTiXPAU5sMQ==
X-YMail-OSG: kE54DDMVM1kawZbZiYcU0hDmAObSn5XjYz.3iWmvtTGCKK0Hzos0NG0SKZv1bSb q7_B24hlaIR256sD2k1f9xkRc_BJ11TH_PW.ccnXyO4Q6kQNZEPflxR6ZUKHEDdfHExf9Sx.tDZe 2VjACkKn7lzDlLkE8zJt8BI8WBfsTqBtoXe6QcfSj3I_LLI3QGCRzjnEKUQ1118puUw4pZF1ICeI 32W.MSSHl1cDzbD.8iqAY7fyqWlLCrCMbgQCXdEMB4zwxLSMhm5JS8zXKf7zKpFikTg4K3UE2BF4 J6l57lkZAW0DTiaoW7o8p6N8oOC5QTtzTHqPLtXghOdciMbQs6.oCy2.7cMrERa4SGpyjXhWCqZi 37ZthI85tGVsilCMd_APAxuiJTRl9sfMhIPWqODQZ1tK5VtTamn5rAsbVBay2TmLZbyeAB3fuJYO rC_KRrBBKY0F8IAQxwgQ7yZvfKParkAZxFWBvvgRFkwBUh7ZrYWsgI2m_I081O3vmhptyqka98ph xVyFcAssQI022_f9mJ0gyTUbmAaT9xwA5Kkvb6zhYgkWB8jR5LSFo8HRH6rUeU_eBpqq2exAGxbJ uqilm7hH7M0Lm1_J6.NC9A.V8ZwZMq_vAYcPvtSFT1mxB8TbEV6azNUmUSstD71fJ_1ZWAQi.Yuh _Ui5m10_6PZBHppJPBmtJdZWzxcx2Z.a_TPXFe_ma46MAlT2r9rKEE87yooZQboQHDBSvkdE7MJe F9oxaY0Obly0NV0if91nIkBNYXyuoktJpsC_YGd9IDo0nVmw9h61lwEDXo.wDcJVfH7HC968q3dE rY_w2XGOBH_dPD0qaNbnFStuZy3lOhAsK4fxGLzrNxPt9bjKB2sCMiaJYIxzwLX1cNVTeEbcUGEH fDcsBiy2nznQ8h5DfNujCV0rBNb7BUBWaoWzg5AvnhtEiiPGfmeb_Kr2osnD823J4dYtZdfWK6L6 IrUzPcFvSRdJJGy6IEb94zKx94FwLlG7bRqDuO_9x1Qvfphe3rPaHBeb5fNcCwJSlJy4OV2I1VJs YfSj.5RUmNV9aFeVE2UwguZI5XxB.TrjRekPXJuLAFEgfnfBuGh54YJMQsCW0MtPxYOCt62VgWH1 oAmWunAvYST.uox3uanfHIiVFz9_M6Tnap9Ua2aMvVh20taTg4_njmdYdWs7Yeq2CeQt7xWYaUPp SBlQdDX3W9CC_IvTzbaMKubP96mBhoo9jojjiJPGD87BLZur2yVaW_5eOFYYUEtoWt9e9r.85GBJ Wl2rAF3Y-
Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.bf2.yahoo.com with HTTP; Thu, 11 Jul 2019 19:52:02 +0000
Received: by smtp427.mail.bf1.yahoo.com (Oath Hermes SMTP Server) with ESMTPA ID 8de5e085ccea99cdd059d40b9ceef9fb; Thu, 11 Jul 2019 19:51:58 +0000 (UTC)
To: Aaron Parecki <aaron@parecki.com>, George Fletcher <gffletch=40aol.com@dmarc.ietf.org>
Cc: OAuth WG <oauth@ietf.org>
References: <CABw+FcsH3CHmFphz5DD6aDeEqKLxbQhY14kdrXCVY0WXQN6PuQ@mail.gmail.com> <AEC7268A-D22D-41DA-8609-E7D2DD3B290C@alkaline-solutions.com> <624da319-b19c-053b-4fd0-048c0e2b8fb9@aol.com> <CAGBSGjp8m+V+i-sNnrLmu7DR_Bo1uv0iGkW2o7hiqUWw8Sc7qg@mail.gmail.com>
From: George Fletcher <gffletch@aol.com>
Organization: AOL LLC
Message-ID: <138cbde0-11b7-8f23-1028-3af0846b5a01@aol.com>
Date: Thu, 11 Jul 2019 15:51:57 -0400
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Thunderbird/60.8.0
MIME-Version: 1.0
In-Reply-To: <CAGBSGjp8m+V+i-sNnrLmu7DR_Bo1uv0iGkW2o7hiqUWw8Sc7qg@mail.gmail.com>
Content-Type: multipart/alternative; boundary="------------09F48B8222D4A76839B427F3"
Content-Language: en-US
Archived-At: <https://mailarchive.ietf.org/arch/msg/oauth/4bT-DoNjWlIhEq-t89uaCfVmiJ8>
Subject: Re: [OAUTH-WG] Refresh tokens
X-BeenThere: oauth@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: OAUTH WG <oauth.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/oauth>, <mailto:oauth-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/oauth/>
List-Post: <mailto:oauth@ietf.org>
List-Help: <mailto:oauth-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/oauth>, <mailto:oauth-request@ietf.org?subject=subscribe>
X-List-Received-Date: Thu, 11 Jul 2019 19:52:07 -0000
You are correct that client authentication is not required for public clients (which doesn't preclude the use of refresh_tokens) but from my perspective it weakens the security because anyone with the refresh_token is able to get new access_tokens without any additional proof. Now if the SPA performs some sort of Dynamic Client Registration or DPoP then I think it's a completely different scenario and it doesn't bother me as much for their to be refresh_tokens in the browser. This of course is just my perspective:) On 7/10/19 7:56 PM, Aaron Parecki wrote: > > 2. To use a refresh token at the /token endpoint, client > authentication is required. This is where it gets difficult for > default SPAs because they are public clients and the only > mechanism to authenticate them is the client_id which is itself > public. For me, this is the real risk of exposing the > refresh_token in the browser. > > > RFC6749 says "If the client type is confidential or??the client was > issued client credentials,??the client MUST authenticate..." which I > take to mean that refresh tokens could be used without a > client_secret, both for native an javascript apps. > > This discussion of offline vs online refresh tokens is interesting, > but I worry that we may be narrowing our focus here too much. > > There's a use where JavaScript apps may be able to take advantage of > offline access, which is around Service Workers. This allows a website > to install some code from a website which can continue to run in the > background, though sometimes only while triggered from external > events. One useful example of this is a syncing daemon, where a push > notification can be sent from a web server to a Service Worker, which > could cause that code in the browser to need to make a request to an > API, which then may need to be able to get a new access token, which > is effectively offline access. > > ---- > Aaron Parecki > aaronparecki.com <http://aaronparecki.com> > @aaronpk <http://twitter.com/aaronpk> > > > > On Tue, Jul 9, 2019 at 9:16 AM George Fletcher > <gffletch=40aol.com@dmarc.ietf.org <mailto:40aol.com@dmarc.ietf.org>> > wrote: > > I'll just add a couple more thoughts around refresh_tokens. > > 1. I agree with David that refresh_tokens are valuable in an > "online" scenario and should be used there. > > 2. To use a refresh token at the /token endpoint, client > authentication is required. This is where it gets difficult for > default SPAs because they are public clients and the only > mechanism to authenticate them is the client_id which is itself > public. For me, this is the real risk of exposing the > refresh_token in the browser. > > 3. If the AS supports rotation of refresh_tokens and an attacker > steals one and uses it, then the SPA will get an error on it's > next attempt because it's refresh_token will now be invalid. If > the refresh_tokens are bound to the user's authentication session, > then the user can logout to lockout the attacker. However, that is > a lot of "ifs" and still provides the attacker with time to > leverage access via the compromised refresh_token. > > In principle, I agree with the recommendation that SPAs shouldn't > have refresh_tokens in the browser. If it's not possible to easily > refresh the access token via a hidden iframe (becoming more > difficult with all the browser/privacy cookie changes. e.g. > ITP2.X) then I'd recommend to use a simple server component such > that the backend for the SPA can use authorization_code flow and > protect a client_secret. > > Thanks, > George > > On 7/8/19 11:17 PM, David Waite wrote: >> >>> On Jul 8, 2019, at 7:10 PM, Leo Tohill <leotohill@gmail.com >>> <mailto:leotohill@gmail.com>> wrote: >>> Re 8. Refresh Tokens >>> >>> ???? "For public clients, the risk of a leaked refresh token is much >>> ?? ??greater than leaked access tokens, since an attacker can >>> potentially >>> ?? ??continue using the stolen refresh token to obtain new >>> access without >>> ?? ??being detectable by the authorization server.?? " >>> >>> (first, note the typo "stoken".) >>> >>> Is it always "higher risk"??? I could even argue that leakage of >>> a refresh token is lower risk. As a bearer document, a leaked >>> access token allows access to resources until it expires.?? A >>> leaked refresh token, to be useful,?? requires an exchange with >>> the AS, and the AS would have the opportunity to check whether >>> the refresh token is still valid (has not been revoked).?? (of >>> course revocation might NOT have happened, but then again, it >>> might have.) >> >> I agree (with caveats, of course). >> >> Access tokens and refresh tokens may or may not be attached (by >> policy) to an authentication session lifetime. It is far easier >> to picture refresh tokens which are not attached to an >> authentication session (sometimes called ???offline??? access) >> being inappropriate for a browser-based app, which is nearly >> always a client that the resource owner is interacting with. >> >> Variants that may want offline tokens are less easy to imagine - >> perhaps browser extensions? >> >> I believe the language currently there is due to AS >> implementations predominantly treating refresh tokens as being >> for offline access, and access token lifetime being short enough >> to not outlast an authentication session. >> >>> Furthermore, since the access token is transmitted to other >>> servers, the risk of exposure is greater, due to possible >>> vulnerabilities in those called systems (e.g., logs).?? Isn't >>> this the reason that we have refresh tokens? Don't refresh >>> tokens exist because access tokens should have short TTL, >>> because they are widely distributed? >> >> Yes. Once you acknowledge the existence of ???online??? refresh >> tokens, they become a strong security component: >> >> - Refresh tokens let you shorten the access token lifetime >> - A shorter access token lifetime lets you have centralized >> policy to invalidate access without needing to resort to token >> introspection/revocation >> - Token refresh can theoretically be used to represent other >> policy changes by both the client (creating tokens targeting a >> new resource server or with reduced scopes) and server (changing >> entitlements and attributes/claims embedded within a structured >> token) >> - Refresh tokens can be one-time-use, as recommenced by the >> security BCP. A exfiltrated refresh token will result in either >> the attacker or the user losing access on the next refresh, and a >> double refresh is a detectable security event by the AS. >> >>> "Additionally, browser-based applications provide many attack >>> vectors by which a refresh token can be leaked." >>> >>> The risks of leaking a refresh token from the browser are >>> identical to the risks of leaking an access token, right??? This >>> sentence could be changed to "... by which /a token/ can be leaked." >>> >>> A refresh token is "higher risk" because its TTL is usually >>> greater than the access token's TTL.?? But if our advice here >>> leads to people using longer-lived access tokens (because of the >>> problems with getting a new access token without involving the >>> user), then the advice will be counter productive.???? The >>> longer life gives more time for the usefulness of a browser-side >>> theft, and more time for the usefulness of a server-side theft.?? >>> >>> Which scenario is safer? >>> A) using an access token with a 10 minute TTL, accompanied by a >>> refresh token with a 1 hour TTL >>> B) using an access token with a 1 hour TTL, and no refresh token.?? >> >> >> Given tokens that track authentication lifetime, it is hard to >> make a case that refresh tokens which last for the authentication >> session are a greater security risk than opaque access tokens >> (requiring token introspection) that will last the same time.?? >> >> Typically an AS (or OP) would issue a structured access token >> with a lifetime expected to expire before the authentication >> session, with new tokens issued via requests made in an embedded, >> iframe (hidden, prompt=none). There may be benefits here of user >> cookies (or perhaps managed-device information) against an >> authorization endpoint being used to make decisions that could >> not be made by a refresh against the token endpoint.?? >> >> I???d be interested in hearing how strong of an implementation >> issue this might be for deployments - I could see a non-security >> argument that the BCP should only have one recommended approach >> here, and that there are deployments needing the iframe approach. >> >> -DW >> >> >> _______________________________________________ >> OAuth mailing list >> OAuth@ietf.org <mailto:OAuth@ietf.org> >> https://www.ietf..org/mailman/listinfo/oauth <https://www.ietf.org/mailman/listinfo/oauth> > > _______________________________________________ > OAuth mailing list > OAuth@ietf.org <mailto:OAuth@ietf.org> > https://www.ietf.org/mailman/listinfo/oauth > > > _______________________________________________ > OAuth mailing list > OAuth@ietf.org > https://www.ietf.org/mailman/listinfo/oauth
- [OAUTH-WG] Refresh tokens Leo Tohill
- Re: [OAUTH-WG] Refresh tokens David Waite
- Re: [OAUTH-WG] Refresh tokens Aaron Parecki
- Re: [OAUTH-WG] Refresh tokens David Waite
- Re: [OAUTH-WG] Refresh tokens George Fletcher
- Re: [OAUTH-WG] Refresh tokens George Fletcher
- Re: [OAUTH-WG] Refresh tokens Aaron Parecki
- Re: [OAUTH-WG] Refresh tokens George Fletcher
- Re: [OAUTH-WG] Refresh tokens Aaron Parecki
- Re: [OAUTH-WG] Refresh tokens David Waite
- Re: [OAUTH-WG] Refresh tokens Justin Richer
- Re: [OAUTH-WG] Refresh tokens Neil Madden
- Re: [OAUTH-WG] Refresh tokens Leo Tohill
- Re: [OAUTH-WG] Refresh tokens David Waite
- Re: [OAUTH-WG] Refresh tokens Leo Tohill
- Re: [OAUTH-WG] Refresh tokens Brock Allen
- Re: [OAUTH-WG] Refresh tokens Leo Tohill
- Re: [OAUTH-WG] Refresh tokens Tomek Stojecki
- Re: [OAUTH-WG] Refresh tokens Neil Madden
- Re: [OAUTH-WG] Refresh tokens Torsten Lodderstedt
- Re: [OAUTH-WG] Refresh tokens Aaron Parecki