Posted at

Android の CookieManager と samesite 属性つきのクッキー

More than 1 year has passed since last update.

Android にて WebView で扱われる Cookie を CookieManager で取得できる。

WebView wv = (WebView)findViewById(R.id.webView);

wv.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
CookieManager cookieManager = CookieManager.getInstance();
String[] cookies = cookieManager.getCookie(url).split(";");
for(String cookie : cookies) {
Log.d(TAG, cookie);
}
}
});

古くからある属性(Path etc)は どの OS バージョンでも同じように挙動するようだが、

最近導入されている属性がついている場合、古い OS バージョンは取れるが、新しい OS バージョンだと取れないということがあった。

例えば、ASP.NET Core2.0 で Identity を特に何も設定しないで使うと クッキーに samesite 属性が付与される。

Set-Cookie: .AspNetCore.Identity.Application=CfD..(中略)....; 

expires=Fri, 15 Dec 2017 11:13:50 GMT;
path=/;
samesite=lax;
httponly

samesite cookie について

このクッキーは Android 7 以前では取得できたが、Android 7以降では取得できなくなっていた。

(Nexus5 + Android 6 / Nexus6 + Android7 / Nexus5X + Android8 で確認)

OS バージョンによって CookieManager.getCookie() で取れたり取れなかったりする場合、属性も確認要点の一つですね、と。

なお、ASP.NET Core 2.0 で samesite 属性は以下のように変更できる。

public class Startup

{
:
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<AuthTestUser, DummyRole>().AddDefaultTokenProviders();
services.ConfigureApplicationCookie(options =>
{
// 外す場合
options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
});
}
:
}