Skip to content

feat: improve cookie chunk handling via base64url+length encoding#90

Merged
hf merged 1 commit into
mainfrom
hf/fix-invalid-utf8
Feb 27, 2025
Merged

feat: improve cookie chunk handling via base64url+length encoding#90
hf merged 1 commit into
mainfrom
hf/fix-invalid-utf8

Conversation

@hf

@hf hf commented Jan 31, 2025

Copy link
Copy Markdown
Collaborator

Improves cookie chunk handling by introducing a new cookie encoding scheme that includes the length of the encoded Base64 value. It will prevent reconstructing data from stale cookies.

Due to bad uses of this package, some cookie chunks are not being properly deleted. Meaning that if a session was encoded in 3 chunks now suddenly goes down to 2 chunks, the last chunk is not being deleted. When it gets reconstructed, all the 3 chunks get concatenated and parsed. In some situations this leads to an invalid UTF-8 sequence (mainly because Base64 packs 6 bits into 8).

This PR addresses this by implementing a different Base64 encoding of the chunks. Instead of just splitting up a Base64 string into chunks, the first chunk will now contain the length of the string that follows. This will prevent a leftover chunk from being parsed as valid.

The encoding is as follows:

base64l-<length of base64 encoded string as base 36>-<base64 encoding>

The library now checks for these conditions and emits warnings to let the developer know that they have a bug in their integration.

@hf hf force-pushed the hf/fix-invalid-utf8 branch 2 times, most recently from 35f4b68 to af6e190 Compare January 31, 2025 14:54

@kangmingtay kangmingtay left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Due to bad uses of this package, some cookie chunks are not being properly deleted.

Do we know what causes the chunks to not be properly deleted? From a DX perspective, it seems rather confusing to have to deal with knowing whether to set the encoding to base64url or base64url+length

update: discussed that this won't really be an issue because we set this internally - users won't have to manually configure this. once this PR is merged, future versions of supabase/ssr will start using the new base64url+length encoding

Comment thread src/cookies.ts
Comment thread src/cookies.ts
@hf hf merged commit 6deb687 into main Feb 27, 2025
@hf hf deleted the hf/fix-invalid-utf8 branch February 27, 2025 10:13
kangmingtay pushed a commit that referenced this pull request Mar 16, 2025
🤖 I have created a release *beep* *boop*
---


## [0.6.0](v0.5.2...v0.6.0)
(2025-02-27)


### Features

* improve cookie chunk handling via base64url+length encoding
([#90](#90))
([6deb687](6deb687))
* upgrade cookie dependency and cleanup imports
([#77](#77))
([9524528](9524528))


### Bug Fixes

* add `create*Client` string in `x-client-info`
([#85](#85))
([f271acc](f271acc))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
kangmingtay added a commit that referenced this pull request Mar 16, 2025
kangmingtay added a commit that referenced this pull request Mar 16, 2025
…h encoding (#90)" (#100)

* This reverts commit 6deb687
introduced in #90
kangmingtay pushed a commit that referenced this pull request Mar 16, 2025
🤖 I have created a release *beep* *boop*
---


## [0.6.1](v0.6.0...v0.6.1)
(2025-03-16)


### Bug Fixes

* force release ([#98](#98))
([66710e8](66710e8))
* **revert:** "feat: improve cookie chunk handling via base64url+length
encoding ([#90](#90))"
([#100](#100))
([2ea8e23](2ea8e23))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
mandarini pushed a commit that referenced this pull request Jun 9, 2026
🤖 I have created a release *beep* *boop*
---


## [0.12.0](v0.11.0...v0.12.0)
(2026-06-09)


### Features

* adds `cookies.encode` option allowing minimal cookie sizes
([#126](#126))
([cf38b22](cf38b22))
* bump `cookie` to 1.0.2
([#113](#113))
([b4a77b4](b4a77b4))
* **cookies:** add clearAuthCookiesAtScopes migration helper
([#240](#240))
([4e47249](4e47249))
* full rewrite using `getAll` and `setAll` cookie methods
([#1](#1))
([b6ae192](b6ae192))
* improve cookie chunk handling via base64url+length encoding
([#90](#90))
([6deb687](6deb687))
* pass cache headers to setAll to prevent CDN caching of auth responses
([#176](#176))
([14962d2](14962d2))
* publish SSR under deprecated auth-helpers package names
([#127](#127))
([e8b6102](e8b6102))
* release workflow RC versioning and publish reliability
([#164](#164))
([81e68f4](81e68f4))
* update CI so it runs on release as well
([#33](#33))
([4517996](4517996))
* update supabase-js to latest
([#133](#133))
([d65044d](d65044d))
* update supabase-js to latest
([#145](#145))
([08bf7d6](08bf7d6))
* upgrade cookie dependency and cleanup imports
([#77](#77))
([9524528](9524528))


### Bug Fixes

* add @types/cookies to dependencies
([#63](#63))
([47e5f16](47e5f16))
* add `create*Client` string in `x-client-info`
([#85](#85))
([f271acc](f271acc))
* allow cookies encode without getAll/setAll on browser client
([#213](#213))
([89f3f28](89f3f28)),
closes [#170](#170)
* allow use of `createBrowserClient` without `window` present
([#20](#20))
([27d868d](27d868d))
* **auth:** respect user-provided auth options in createBrowserClient
([#167](#167))
([5f04837](5f04837))
* check chunkedCookie is string in server client
([#57](#57))
([549fe62](549fe62))
* **ci:** remove packageManager field
([#197](#197))
([6bf0226](6bf0226))
* cookies console warnings
([#136](#136))
([64ff6b3](64ff6b3))
* deprecate `parse`, `serialize` exports for more useful functions
([#14](#14))
([0b5f881](0b5f881))
* enable tree-shaking for browser bundles
([#216](#216))
([f009d71](f009d71))
* fix `createBrowserClient` deprecation tsdoc
([#17](#17))
([1df70ad](1df70ad))
* force release ([#98](#98))
([66710e8](66710e8))
* re-apply update CI so it runs on release as well
([#49](#49))
([51d5a43](51d5a43))
* **release:** pin npm to 11.5.2 so OIDC trusted publisher works
([#249](#249))
([4af89f7](4af89f7))
* remove optional dependencies
([#41](#41))
([a48fe6f](a48fe6f))
* remove usage of internal type params
([#123](#123))
([8f3e89e](8f3e89e))
* revert "update CI so it runs on release as well"
([#44](#44))
([9d0e859](9d0e859))
* **revert:** "feat: improve cookie chunk handling via base64url+length
encoding ([#90](#90))"
([#100](#100))
([2ea8e23](2ea8e23))
* set `max-age` default cookie option to 400 days
([#54](#54))
([f4ed2e0](f4ed2e0))
* set cookies for password recovery event
([#32](#32))
([7dc1837](7dc1837))
* set cookies when mfa challenge is verified
([#27](#27))
([c217f53](c217f53))
* **tsconfig:** set explicit rootDir to silence TS6059 in consumer IDEs
([#211](#211))
([a77ee8a](a77ee8a)),
closes [#209](#209)
* update conventional commits ci to use main instead of master
([#31](#31))
([bebce89](bebce89))
* update README session docs
([#159](#159))
([b859905](b859905))
* update type, remove unused imports, define AuthEvent type
([#47](#47))
([4f4a375](4f4a375))
* use skipAutoInitialize to prevent SSR token refresh race condition
([#131](#131))
([0b7be28](0b7be28))
* validate base64-prefixed chunked cookies decode to valid JSON
([#210](#210))
([302cc0e](302cc0e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: supabase-releaser[bot] <223506987+supabase-releaser[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants