Android
C#
cookie

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

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;
        });
    }
    :
}