Your instinct about the URL token is right, don't do that (tokens end up in logs and browser history).
Cookies are per host by default. With @supabase/ssr you can set the cookie domain on the parent domain in both apps (browser client, server client and middleware):
createBrowserClient(url, key, {
cookieOptions: { domain: '.myapp.com' },
})Then the auth cookie is sent to both myapp.com and app.myapp.com. Locally this doesn't work on plain localhost, so make the option conditional on production.