Support setting sticky cookie max age
This commit is contained in:
parent
64ff214ff8
commit
0eeb85d01d
21 changed files with 187 additions and 0 deletions
|
@ -170,6 +170,7 @@
|
||||||
- "traefik.http.services.service02.loadbalancer.sticky=true"
|
- "traefik.http.services.service02.loadbalancer.sticky=true"
|
||||||
- "traefik.http.services.service02.loadbalancer.sticky.cookie=true"
|
- "traefik.http.services.service02.loadbalancer.sticky.cookie=true"
|
||||||
- "traefik.http.services.service02.loadbalancer.sticky.cookie.httponly=true"
|
- "traefik.http.services.service02.loadbalancer.sticky.cookie.httponly=true"
|
||||||
|
- "traefik.http.services.service02.loadbalancer.sticky.cookie.maxage=42"
|
||||||
- "traefik.http.services.service02.loadbalancer.sticky.cookie.name=foobar"
|
- "traefik.http.services.service02.loadbalancer.sticky.cookie.name=foobar"
|
||||||
- "traefik.http.services.service02.loadbalancer.sticky.cookie.samesite=foobar"
|
- "traefik.http.services.service02.loadbalancer.sticky.cookie.samesite=foobar"
|
||||||
- "traefik.http.services.service02.loadbalancer.sticky.cookie.secure=true"
|
- "traefik.http.services.service02.loadbalancer.sticky.cookie.secure=true"
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
secure = true
|
secure = true
|
||||||
httpOnly = true
|
httpOnly = true
|
||||||
sameSite = "foobar"
|
sameSite = "foobar"
|
||||||
|
maxAge = 42
|
||||||
|
|
||||||
[[http.services.Service02.loadBalancer.servers]]
|
[[http.services.Service02.loadBalancer.servers]]
|
||||||
url = "foobar"
|
url = "foobar"
|
||||||
|
@ -103,6 +104,7 @@
|
||||||
secure = true
|
secure = true
|
||||||
httpOnly = true
|
httpOnly = true
|
||||||
sameSite = "foobar"
|
sameSite = "foobar"
|
||||||
|
maxAge = 42
|
||||||
[http.services.Service04.weighted.healthCheck]
|
[http.services.Service04.weighted.healthCheck]
|
||||||
[http.middlewares]
|
[http.middlewares]
|
||||||
[http.middlewares.Middleware01]
|
[http.middlewares.Middleware01]
|
||||||
|
|
|
@ -60,6 +60,7 @@ http:
|
||||||
secure: true
|
secure: true
|
||||||
httpOnly: true
|
httpOnly: true
|
||||||
sameSite: foobar
|
sameSite: foobar
|
||||||
|
maxAge: 42
|
||||||
servers:
|
servers:
|
||||||
- url: foobar
|
- url: foobar
|
||||||
- url: foobar
|
- url: foobar
|
||||||
|
@ -104,6 +105,7 @@ http:
|
||||||
secure: true
|
secure: true
|
||||||
httpOnly: true
|
httpOnly: true
|
||||||
sameSite: foobar
|
sameSite: foobar
|
||||||
|
maxAge: 42
|
||||||
healthCheck: {}
|
healthCheck: {}
|
||||||
middlewares:
|
middlewares:
|
||||||
Middleware01:
|
Middleware01:
|
||||||
|
|
|
@ -160,6 +160,12 @@ spec:
|
||||||
can be accessed by client-side APIs, such as
|
can be accessed by client-side APIs, such as
|
||||||
JavaScript.
|
JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds
|
||||||
|
until the cookie expires. When set to a negative
|
||||||
|
number, the cookie expires immediately. When
|
||||||
|
set to zero, the cookie never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -877,6 +883,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie can
|
description: HTTPOnly defines whether the cookie can
|
||||||
be accessed by client-side APIs, such as JavaScript.
|
be accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds
|
||||||
|
until the cookie expires. When set to a negative
|
||||||
|
number, the cookie expires immediately. When set
|
||||||
|
to zero, the cookie never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -2158,6 +2170,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie
|
description: HTTPOnly defines whether the cookie
|
||||||
can be accessed by client-side APIs, such as JavaScript.
|
can be accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds
|
||||||
|
until the cookie expires. When set to a negative
|
||||||
|
number, the cookie expires immediately. When set
|
||||||
|
to zero, the cookie never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -2249,6 +2267,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie can be
|
description: HTTPOnly defines whether the cookie can be
|
||||||
accessed by client-side APIs, such as JavaScript.
|
accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds until
|
||||||
|
the cookie expires. When set to a negative number, the
|
||||||
|
cookie expires immediately. When set to zero, the cookie
|
||||||
|
never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -2356,6 +2380,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie
|
description: HTTPOnly defines whether the cookie
|
||||||
can be accessed by client-side APIs, such as JavaScript.
|
can be accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds
|
||||||
|
until the cookie expires. When set to a negative
|
||||||
|
number, the cookie expires immediately. When set
|
||||||
|
to zero, the cookie never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -2395,6 +2425,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie can be
|
description: HTTPOnly defines whether the cookie can be
|
||||||
accessed by client-side APIs, such as JavaScript.
|
accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds until
|
||||||
|
the cookie expires. When set to a negative number, the
|
||||||
|
cookie expires immediately. When set to zero, the cookie
|
||||||
|
never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
|
|
@ -241,6 +241,7 @@ THIS FILE MUST NOT BE EDITED BY HAND
|
||||||
| `traefik/http/services/Service02/loadBalancer/servers/1/url` | `foobar` |
|
| `traefik/http/services/Service02/loadBalancer/servers/1/url` | `foobar` |
|
||||||
| `traefik/http/services/Service02/loadBalancer/serversTransport` | `foobar` |
|
| `traefik/http/services/Service02/loadBalancer/serversTransport` | `foobar` |
|
||||||
| `traefik/http/services/Service02/loadBalancer/sticky/cookie/httpOnly` | `true` |
|
| `traefik/http/services/Service02/loadBalancer/sticky/cookie/httpOnly` | `true` |
|
||||||
|
| `traefik/http/services/Service02/loadBalancer/sticky/cookie/maxAge` | `42` |
|
||||||
| `traefik/http/services/Service02/loadBalancer/sticky/cookie/name` | `foobar` |
|
| `traefik/http/services/Service02/loadBalancer/sticky/cookie/name` | `foobar` |
|
||||||
| `traefik/http/services/Service02/loadBalancer/sticky/cookie/sameSite` | `foobar` |
|
| `traefik/http/services/Service02/loadBalancer/sticky/cookie/sameSite` | `foobar` |
|
||||||
| `traefik/http/services/Service02/loadBalancer/sticky/cookie/secure` | `true` |
|
| `traefik/http/services/Service02/loadBalancer/sticky/cookie/secure` | `true` |
|
||||||
|
@ -257,6 +258,7 @@ THIS FILE MUST NOT BE EDITED BY HAND
|
||||||
| `traefik/http/services/Service04/weighted/services/1/name` | `foobar` |
|
| `traefik/http/services/Service04/weighted/services/1/name` | `foobar` |
|
||||||
| `traefik/http/services/Service04/weighted/services/1/weight` | `42` |
|
| `traefik/http/services/Service04/weighted/services/1/weight` | `42` |
|
||||||
| `traefik/http/services/Service04/weighted/sticky/cookie/httpOnly` | `true` |
|
| `traefik/http/services/Service04/weighted/sticky/cookie/httpOnly` | `true` |
|
||||||
|
| `traefik/http/services/Service04/weighted/sticky/cookie/maxAge` | `42` |
|
||||||
| `traefik/http/services/Service04/weighted/sticky/cookie/name` | `foobar` |
|
| `traefik/http/services/Service04/weighted/sticky/cookie/name` | `foobar` |
|
||||||
| `traefik/http/services/Service04/weighted/sticky/cookie/sameSite` | `foobar` |
|
| `traefik/http/services/Service04/weighted/sticky/cookie/sameSite` | `foobar` |
|
||||||
| `traefik/http/services/Service04/weighted/sticky/cookie/secure` | `true` |
|
| `traefik/http/services/Service04/weighted/sticky/cookie/secure` | `true` |
|
||||||
|
|
|
@ -160,6 +160,12 @@ spec:
|
||||||
can be accessed by client-side APIs, such as
|
can be accessed by client-side APIs, such as
|
||||||
JavaScript.
|
JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds
|
||||||
|
until the cookie expires. When set to a negative
|
||||||
|
number, the cookie expires immediately. When
|
||||||
|
set to zero, the cookie never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
|
|
@ -302,6 +302,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie can
|
description: HTTPOnly defines whether the cookie can
|
||||||
be accessed by client-side APIs, such as JavaScript.
|
be accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds
|
||||||
|
until the cookie expires. When set to a negative
|
||||||
|
number, the cookie expires immediately. When set
|
||||||
|
to zero, the cookie never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
|
|
@ -134,6 +134,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie
|
description: HTTPOnly defines whether the cookie
|
||||||
can be accessed by client-side APIs, such as JavaScript.
|
can be accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds
|
||||||
|
until the cookie expires. When set to a negative
|
||||||
|
number, the cookie expires immediately. When set
|
||||||
|
to zero, the cookie never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -225,6 +231,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie can be
|
description: HTTPOnly defines whether the cookie can be
|
||||||
accessed by client-side APIs, such as JavaScript.
|
accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds until
|
||||||
|
the cookie expires. When set to a negative number, the
|
||||||
|
cookie expires immediately. When set to zero, the cookie
|
||||||
|
never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -332,6 +344,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie
|
description: HTTPOnly defines whether the cookie
|
||||||
can be accessed by client-side APIs, such as JavaScript.
|
can be accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds
|
||||||
|
until the cookie expires. When set to a negative
|
||||||
|
number, the cookie expires immediately. When set
|
||||||
|
to zero, the cookie never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -371,6 +389,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie can be
|
description: HTTPOnly defines whether the cookie can be
|
||||||
accessed by client-side APIs, such as JavaScript.
|
accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds until
|
||||||
|
the cookie expires. When set to a negative number, the
|
||||||
|
cookie expires immediately. When set to zero, the cookie
|
||||||
|
never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
|
|
@ -273,6 +273,14 @@ you'd add the tag `traefik.http.services.{name-of-your-choice}.loadbalancer.pass
|
||||||
traefik.http.services.myservice.loadbalancer.sticky.cookie.samesite=none
|
traefik.http.services.myservice.loadbalancer.sticky.cookie.samesite=none
|
||||||
```
|
```
|
||||||
|
|
||||||
|
??? info "`traefik.http.services.<service_name>.loadbalancer.sticky.cookie.maxage`"
|
||||||
|
|
||||||
|
See [sticky sessions](../services/index.md#sticky-sessions) for more information.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
traefik.http.services.myservice.loadbalancer.sticky.cookie.maxage=42
|
||||||
|
```
|
||||||
|
|
||||||
??? info "`traefik.http.services.<service_name>.loadbalancer.responseforwarding.flushinterval`"
|
??? info "`traefik.http.services.<service_name>.loadbalancer.responseforwarding.flushinterval`"
|
||||||
|
|
||||||
See [response forwarding](../services/index.md#response-forwarding) for more information.
|
See [response forwarding](../services/index.md#response-forwarding) for more information.
|
||||||
|
|
|
@ -376,6 +376,14 @@ you'd add the label `traefik.http.services.<name-of-your-choice>.loadbalancer.pa
|
||||||
- "traefik.http.services.myservice.loadbalancer.sticky.cookie.samesite=none"
|
- "traefik.http.services.myservice.loadbalancer.sticky.cookie.samesite=none"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
??? info "`traefik.http.services.<service_name>.loadbalancer.sticky.cookie.maxage`"
|
||||||
|
|
||||||
|
See [sticky sessions](../services/index.md#sticky-sessions) for more information.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- "traefik.http.services.myservice.loadbalancer.sticky.cookie.maxage=42"
|
||||||
|
```
|
||||||
|
|
||||||
??? info "`traefik.http.services.<service_name>.loadbalancer.responseforwarding.flushinterval`"
|
??? info "`traefik.http.services.<service_name>.loadbalancer.responseforwarding.flushinterval`"
|
||||||
|
|
||||||
See [response forwarding](../services/index.md#response-forwarding) for more information.
|
See [response forwarding](../services/index.md#response-forwarding) for more information.
|
||||||
|
|
|
@ -275,6 +275,14 @@ you'd add the label `traefik.http.services.{name-of-your-choice}.loadbalancer.pa
|
||||||
traefik.http.services.myservice.loadbalancer.sticky.cookie.samesite=none
|
traefik.http.services.myservice.loadbalancer.sticky.cookie.samesite=none
|
||||||
```
|
```
|
||||||
|
|
||||||
|
??? info "`traefik.http.services.<service_name>.loadbalancer.sticky.cookie.maxage`"
|
||||||
|
|
||||||
|
See [sticky sessions](../services/index.md#sticky-sessions) for more information.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
traefik.http.services.myservice.loadbalancer.sticky.cookie.maxage=42
|
||||||
|
```
|
||||||
|
|
||||||
??? info "`traefik.http.services.<service_name>.loadbalancer.responseforwarding.flushinterval`"
|
??? info "`traefik.http.services.<service_name>.loadbalancer.responseforwarding.flushinterval`"
|
||||||
|
|
||||||
See [response forwarding](../services/index.md#response-forwarding) for more information.
|
See [response forwarding](../services/index.md#response-forwarding) for more information.
|
||||||
|
|
|
@ -348,6 +348,7 @@ Register the `IngressRoute` [kind](../../reference/dynamic-configuration/kuberne
|
||||||
name: cookie
|
name: cookie
|
||||||
secure: true
|
secure: true
|
||||||
sameSite: none
|
sameSite: none
|
||||||
|
maxAge: 42
|
||||||
strategy: RoundRobin
|
strategy: RoundRobin
|
||||||
weight: 10
|
weight: 10
|
||||||
nativeLB: true # [11]
|
nativeLB: true # [11]
|
||||||
|
|
|
@ -351,6 +351,14 @@ which in turn will create the resulting routers, services, handlers, etc.
|
||||||
traefik.ingress.kubernetes.io/service.sticky.cookie.httponly: "true"
|
traefik.ingress.kubernetes.io/service.sticky.cookie.httponly: "true"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
??? info "`traefik.ingress.kubernetes.io/service.sticky.cookie.maxage`"
|
||||||
|
|
||||||
|
See [sticky sessions](../services/index.md#sticky-sessions) for more information.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
traefik.ingress.kubernetes.io/service.sticky.cookie.maxage: 42
|
||||||
|
```
|
||||||
|
|
||||||
## Path Types on Kubernetes 1.18+
|
## Path Types on Kubernetes 1.18+
|
||||||
|
|
||||||
If the Kubernetes cluster version is 1.18+,
|
If the Kubernetes cluster version is 1.18+,
|
||||||
|
|
|
@ -244,6 +244,14 @@ A Story of key & values
|
||||||
|-----------------------------------------------------------------------|--------|
|
|-----------------------------------------------------------------------|--------|
|
||||||
| `traefik/http/services/myservice/loadbalancer/sticky/cookie/samesite` | `none` |
|
| `traefik/http/services/myservice/loadbalancer/sticky/cookie/samesite` | `none` |
|
||||||
|
|
||||||
|
??? info "`traefik/http/services/<service_name>/loadbalancer/sticky/cookie/maxage`"
|
||||||
|
|
||||||
|
See [sticky sessions](../services/index.md#sticky-sessions) for more information.
|
||||||
|
|
||||||
|
| Key (Path) | Value |
|
||||||
|
|---------------------------------------------------------------------|-------|
|
||||||
|
| `traefik/http/services/myservice/loadbalancer/sticky/cookie/maxage` | `42` |
|
||||||
|
|
||||||
??? info "`traefik/http/services/<service_name>/loadbalancer/responseforwarding/flushinterval`"
|
??? info "`traefik/http/services/<service_name>/loadbalancer/responseforwarding/flushinterval`"
|
||||||
|
|
||||||
See [response forwarding](../services/index.md#response-forwarding) for more information.
|
See [response forwarding](../services/index.md#response-forwarding) for more information.
|
||||||
|
@ -306,6 +314,12 @@ A Story of key & values
|
||||||
|------------------------------------------------------------------------|--------|
|
|------------------------------------------------------------------------|--------|
|
||||||
| `traefik/http/services/<service_name>/weighted/sticky/cookie/httpOnly` | `true` |
|
| `traefik/http/services/<service_name>/weighted/sticky/cookie/httpOnly` | `true` |
|
||||||
|
|
||||||
|
??? info "`traefik/http/services/<service_name>/weighted/sticky/cookie/maxage`"
|
||||||
|
|
||||||
|
| Key (Path) | Value |
|
||||||
|
|----------------------------------------------------------------------|-------|
|
||||||
|
| `traefik/http/services/<service_name>/weighted/sticky/cookie/maxage` | `42` |
|
||||||
|
|
||||||
### Middleware
|
### Middleware
|
||||||
|
|
||||||
More information about available middlewares in the dedicated [middlewares section](../../middlewares/overview.md).
|
More information about available middlewares in the dedicated [middlewares section](../../middlewares/overview.md).
|
||||||
|
|
|
@ -265,6 +265,14 @@ you'd add the tag `traefik.http.services.{name-of-your-choice}.loadbalancer.pass
|
||||||
traefik.http.services.myservice.loadbalancer.sticky.cookie.samesite=none
|
traefik.http.services.myservice.loadbalancer.sticky.cookie.samesite=none
|
||||||
```
|
```
|
||||||
|
|
||||||
|
??? info "`traefik.http.services.<service_name>.loadbalancer.sticky.cookie.maxage`"
|
||||||
|
|
||||||
|
See [sticky sessions](../services/index.md#sticky-sessions) for more information.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
traefik.http.services.myservice.loadbalancer.sticky.cookie.maxage=42
|
||||||
|
```
|
||||||
|
|
||||||
??? info "`traefik.http.services.<service_name>.loadbalancer.responseforwarding.flushinterval`"
|
??? info "`traefik.http.services.<service_name>.loadbalancer.responseforwarding.flushinterval`"
|
||||||
|
|
||||||
See [response forwarding](../services/index.md#response-forwarding) for more information.
|
See [response forwarding](../services/index.md#response-forwarding) for more information.
|
||||||
|
|
|
@ -187,6 +187,13 @@ On subsequent requests, to keep the session alive with the same server, the clie
|
||||||
|
|
||||||
The default cookie name is an abbreviation of a sha1 (ex: `_1d52e`).
|
The default cookie name is an abbreviation of a sha1 (ex: `_1d52e`).
|
||||||
|
|
||||||
|
!!! info "MaxAge"
|
||||||
|
|
||||||
|
By default, the affinity cookie will never expire as the `MaxAge` option is set to zero.
|
||||||
|
|
||||||
|
This option indicates the number of seconds until the cookie expires.
|
||||||
|
When set to a negative number, the cookie expires immediately.
|
||||||
|
|
||||||
!!! info "Secure & HTTPOnly & SameSite flags"
|
!!! info "Secure & HTTPOnly & SameSite flags"
|
||||||
|
|
||||||
By default, the affinity cookie is created without those flags.
|
By default, the affinity cookie is created without those flags.
|
||||||
|
|
|
@ -160,6 +160,12 @@ spec:
|
||||||
can be accessed by client-side APIs, such as
|
can be accessed by client-side APIs, such as
|
||||||
JavaScript.
|
JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds
|
||||||
|
until the cookie expires. When set to a negative
|
||||||
|
number, the cookie expires immediately. When
|
||||||
|
set to zero, the cookie never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -877,6 +883,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie can
|
description: HTTPOnly defines whether the cookie can
|
||||||
be accessed by client-side APIs, such as JavaScript.
|
be accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds
|
||||||
|
until the cookie expires. When set to a negative
|
||||||
|
number, the cookie expires immediately. When set
|
||||||
|
to zero, the cookie never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -2158,6 +2170,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie
|
description: HTTPOnly defines whether the cookie
|
||||||
can be accessed by client-side APIs, such as JavaScript.
|
can be accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds
|
||||||
|
until the cookie expires. When set to a negative
|
||||||
|
number, the cookie expires immediately. When set
|
||||||
|
to zero, the cookie never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -2249,6 +2267,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie can be
|
description: HTTPOnly defines whether the cookie can be
|
||||||
accessed by client-side APIs, such as JavaScript.
|
accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds until
|
||||||
|
the cookie expires. When set to a negative number, the
|
||||||
|
cookie expires immediately. When set to zero, the cookie
|
||||||
|
never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -2356,6 +2380,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie
|
description: HTTPOnly defines whether the cookie
|
||||||
can be accessed by client-side APIs, such as JavaScript.
|
can be accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds
|
||||||
|
until the cookie expires. When set to a negative
|
||||||
|
number, the cookie expires immediately. When set
|
||||||
|
to zero, the cookie never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
@ -2395,6 +2425,12 @@ spec:
|
||||||
description: HTTPOnly defines whether the cookie can be
|
description: HTTPOnly defines whether the cookie can be
|
||||||
accessed by client-side APIs, such as JavaScript.
|
accessed by client-side APIs, such as JavaScript.
|
||||||
type: boolean
|
type: boolean
|
||||||
|
maxAge:
|
||||||
|
description: MaxAge indicates the number of seconds until
|
||||||
|
the cookie expires. When set to a negative number, the
|
||||||
|
cookie expires immediately. When set to zero, the cookie
|
||||||
|
never expires.
|
||||||
|
type: integer
|
||||||
name:
|
name:
|
||||||
description: Name defines the Cookie name.
|
description: Name defines the Cookie name.
|
||||||
type: string
|
type: string
|
||||||
|
|
|
@ -155,6 +155,10 @@ type Cookie struct {
|
||||||
// SameSite defines the same site policy.
|
// SameSite defines the same site policy.
|
||||||
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
|
// More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
|
||||||
SameSite string `json:"sameSite,omitempty" toml:"sameSite,omitempty" yaml:"sameSite,omitempty" export:"true"`
|
SameSite string `json:"sameSite,omitempty" toml:"sameSite,omitempty" yaml:"sameSite,omitempty" export:"true"`
|
||||||
|
// MaxAge indicates the number of seconds until the cookie expires.
|
||||||
|
// When set to a negative number, the cookie expires immediately.
|
||||||
|
// When set to zero, the cookie never expires.
|
||||||
|
MaxAge int `json:"maxAge,omitempty" toml:"maxAge,omitempty" yaml:"maxAge,omitempty" export:"true"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// +k8s:deepcopy-gen=true
|
// +k8s:deepcopy-gen=true
|
||||||
|
|
|
@ -1334,6 +1334,7 @@ func TestEncodeConfiguration(t *testing.T) {
|
||||||
"traefik.HTTP.Services.Service0.LoadBalancer.Sticky.Cookie.Name": "foobar",
|
"traefik.HTTP.Services.Service0.LoadBalancer.Sticky.Cookie.Name": "foobar",
|
||||||
"traefik.HTTP.Services.Service0.LoadBalancer.Sticky.Cookie.HTTPOnly": "true",
|
"traefik.HTTP.Services.Service0.LoadBalancer.Sticky.Cookie.HTTPOnly": "true",
|
||||||
"traefik.HTTP.Services.Service0.LoadBalancer.Sticky.Cookie.Secure": "false",
|
"traefik.HTTP.Services.Service0.LoadBalancer.Sticky.Cookie.Secure": "false",
|
||||||
|
"traefik.HTTP.Services.Service0.LoadBalancer.Sticky.Cookie.MaxAge": "0",
|
||||||
"traefik.HTTP.Services.Service0.LoadBalancer.ServersTransport": "foobar",
|
"traefik.HTTP.Services.Service0.LoadBalancer.ServersTransport": "foobar",
|
||||||
"traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Headers.name0": "foobar",
|
"traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Headers.name0": "foobar",
|
||||||
"traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Headers.name1": "foobar",
|
"traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Headers.name1": "foobar",
|
||||||
|
|
|
@ -25,6 +25,7 @@ type stickyCookie struct {
|
||||||
secure bool
|
secure bool
|
||||||
httpOnly bool
|
httpOnly bool
|
||||||
sameSite string
|
sameSite string
|
||||||
|
maxAge int
|
||||||
}
|
}
|
||||||
|
|
||||||
func convertSameSite(sameSite string) http.SameSite {
|
func convertSameSite(sameSite string) http.SameSite {
|
||||||
|
@ -77,6 +78,7 @@ func New(sticky *dynamic.Sticky, wantHealthCheck bool) *Balancer {
|
||||||
secure: sticky.Cookie.Secure,
|
secure: sticky.Cookie.Secure,
|
||||||
httpOnly: sticky.Cookie.HTTPOnly,
|
httpOnly: sticky.Cookie.HTTPOnly,
|
||||||
sameSite: sticky.Cookie.SameSite,
|
sameSite: sticky.Cookie.SameSite,
|
||||||
|
maxAge: sticky.Cookie.MaxAge,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,6 +240,7 @@ func (b *Balancer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
HttpOnly: b.stickyCookie.httpOnly,
|
HttpOnly: b.stickyCookie.httpOnly,
|
||||||
Secure: b.stickyCookie.secure,
|
Secure: b.stickyCookie.secure,
|
||||||
SameSite: convertSameSite(b.stickyCookie.sameSite),
|
SameSite: convertSameSite(b.stickyCookie.sameSite),
|
||||||
|
MaxAge: b.stickyCookie.maxAge,
|
||||||
}
|
}
|
||||||
http.SetCookie(w, cookie)
|
http.SetCookie(w, cookie)
|
||||||
}
|
}
|
||||||
|
|
|
@ -225,6 +225,7 @@ func TestSticky(t *testing.T) {
|
||||||
Secure: true,
|
Secure: true,
|
||||||
HTTPOnly: true,
|
HTTPOnly: true,
|
||||||
SameSite: "none",
|
SameSite: "none",
|
||||||
|
MaxAge: 42,
|
||||||
},
|
},
|
||||||
}, false)
|
}, false)
|
||||||
|
|
||||||
|
@ -261,6 +262,7 @@ func TestSticky(t *testing.T) {
|
||||||
assert.True(t, recorder.cookies["test"].HttpOnly)
|
assert.True(t, recorder.cookies["test"].HttpOnly)
|
||||||
assert.True(t, recorder.cookies["test"].Secure)
|
assert.True(t, recorder.cookies["test"].Secure)
|
||||||
assert.Equal(t, http.SameSiteNoneMode, recorder.cookies["test"].SameSite)
|
assert.Equal(t, http.SameSiteNoneMode, recorder.cookies["test"].SameSite)
|
||||||
|
assert.Equal(t, 42, recorder.cookies["test"].MaxAge)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSticky_FallBack(t *testing.T) {
|
func TestSticky_FallBack(t *testing.T) {
|
||||||
|
|
Loading…
Reference in a new issue