OpenID Connect 인증
본문
OIDC
Traefik Hub 기능
이 미들웨어는 Traefik Hub에서만 사용할 수 있어요. Traefik Hub의 고급 기능에 대해 더 알아보세요.
OIDC 인증 미들웨어는 인증을 외부 공급자(provider)에 위임해서 애플리케이션을 보호합니다.
구성 예시
Middleware OIDC
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: test-oidc
namespace: whoami
spec:
plugin:
oidc:
issuer: "https://tenant.auth0.com/realms/myrealm"
redirectUrl: "/callback"
clientId: "urn:k8s:secret:my-secret:clientId"
clientSecret: "urn:k8s:secret:my-secret:clientSecret"
session:
name: customsessioncookiename
sliding: false
refresh: false
expiry: 10
sameSite: none
httpOnly: false
secure: true
stateCookie:
name: customstatecookiename
maxAge: 10
sameSite: none
httpOnly: true
secure: true
forwardHeaders:
Group: grp
Expires-At: exp
claims: Equals(`grp`, `admin`)
csrf: {}
Kubernetes Secret
apiVersion: v1
kind: Secret
metadata:
name: my-secret
stringData:
clientID: my-oidc-client-name
clientSecret: mysecret
구성 옵션
| Field | Description | Default | Required |
| issuer | OpenID Connect 공급자의 URL을 정의해요(예: https://accounts.google.com). OpenID Connect 구성(configuration)을 제공하는 서버를 가리켜야 합니다. | "" | Yes |
| trustedIssuer | OpenID Connect 공급자에서 발견된 발급자 외에 추가로 검증할 신뢰된 발급자 URL을 정의해요. | "" | No |
| disableIssuerCheck | 토큰 검증 중 발급자 검증 확인을 끕니다. | false | No |
| redirectUrl | 인증이 완료되면 OpenID Connect 공급자가 미들웨어로 다시 리다이렉트하는 데 사용하는 URL을 정의해요. (자세한 내용은 여기) | "" | Yes |
| clientId | OpenID Connect 공급자의 계정에 대한 고유 클라이언트 식별자를 정의해요. clientSecret 옵션이 설정되면 반드시 설정해야 해요. (자세한 내용은 여기) | "" | Yes |
| clientSecret | OpenID Connect 공급자의 계정에 대한 고유 클라이언트 비밀을 정의해요. clientId 옵션이 설정되면 반드시 설정해야 해요. (자세한 내용은 여기) | "" | Yes |
| claims | 요청을 승인하기 위해 검증할 클레임을 정의해요. claims 옵션은 JWT 형식 토큰에서만 사용할 수 있어요. (자세한 내용은 여기) | "" | No |
| usernameClaim | 접근 로그의 clientusername을 채우는 데 평가할 클레임을 정의해요. usernameClaim 옵션은 JWT 형식 토큰에서만 사용할 수 있어요. | "" | No |
| forwardHeaders | 요청에 추가할 HTTP 헤더를 정의하고, 인증 서버가 반환한 접근 토큰 클레임에서 추출한 값으로 채웁니다. JWT에서 찾지 못한 전달 대상 클레임은 빈 헤더가 돼요. forwardHeaders 옵션은 JWT 형식 토큰에서만 사용할 수 있어요. | [] | No |
| clientConfig.tls.ca | 인증 서버와 TLS 연결을 맺는 데 사용하는 인증서 번들을 담은 PEM 인코딩 인증서 번들이나 비밀을 참조하는 URN (자세한 내용은 여기) | "" | No |
| clientConfig.tls.cert | Vault 서버와 TLS 연결을 맺는 데 사용하는 인증서를 담은 PEM 인코딩 인증서나 비밀을 참조하는 URN (자세한 내용은 여기) | "" | No |
| clientConfig.tls.key | Vault 서버와 TLS 연결을 맺는 데 사용하는 키를 담은 PEM 인코딩 키나 비밀을 참조하는 URN. (자세한 내용은 여기) | "" | No |
| clientConfig.tls.insecureSkipVerify | 인증 서버와 통신할 때 TLS 인증서 검증을 끕니다. 테스트 목적으로는 유용하지만 프로덕션에는 강력히 권장되지 않아요. (자세한 내용은 여기) | "" | No |
| clientConfig.timeoutSeconds | 인증 서버에 대한 요청을 포기하기 전의 시간을 정의해요. | 5 | No |
| clientConfig.maxRetries | 실패한 인증 서버 요청에 대한 재시도 횟수를 정의해요. | 3 | No |
| pkce | RFC 7636에 기술된 Proof Key for Code Exchange를 정의해요. | false | No |
| discoveryParams | 디스커버리 메커니즘 중 openid-configuration well-known URI에 추가할 임의의 쿼리 파라미터 맵. | "" | No |
| scopes | 요청할 스코프. openid를 포함해야 해요. | openid | No |
| authParams | Authentication Provider에 전달할 임의의 쿼리 파라미터 맵. prompt 키가 빈 문자열로 설정되면, OAuth2 인증 URL에 prompt 파라미터가 추가되지 않아요. 즉 사용자에게 동의(consent)를 묻지 않는다는 뜻입니다. | "" | No |
| disableLogin | 인증 공급자로의 리다이렉트를 끕니다. 로그인 페이지로의 리다이렉트가 바람직하지 않은 API를 보호할 때 유용해요. | false | No |
| loginUrl | 필요할 때 인증을 시작하는 데 사용하는 URL을 정의해요. 아직 승인되지 않은 다른 모든 요청은 401 Unauthorized를 반환합니다. 비워 두면 모든 요청이 인증을 시작할 수 있어요. 경로(/login 등), 호스트와 경로(example.com/login), 완전한 URL(https://example.com/login)이 될 수 있어요. http와 https 스킴만 지원됩니다. | "" | No |
| logoutUrl | 사용자를 로그아웃시키기 위해 세션을 삭제해야 하는 URL을 정의해요. 경로(/logout 등), 호스트와 경로(example.com/logout), 완전한 URL(https://example.com/logout)이 될 수 있어요. http와 https 스킴만 지원됩니다. | "" | No |
| postLoginRedirectUrl | 설정되고 loginUrl과 함께 사용되면, 미들웨어는 성공적인 로그인 후 이 URL로 리다이렉트합니다. 경로(/after/login 등), 호스트와 경로(example.com/after/login), 완전한 URL(https://example.com/after/login)이 될 수 있어요. http와 https 스킴만 지원됩니다. | "" | No |
| postLogoutRedirectUrl | 설정되고 logoutUrl과 함께 사용되면, 미들웨어는 로그아웃 후 이 URL로 리다이렉트합니다. 경로(/after/logout 등), 호스트와 경로(example.com/after/logout), 완전한 URL(https://example.com/after/logout)이 될 수 있어요. http와 https 스킴만 지원됩니다. | "" | No |
| backchannelLogoutUrl | 사용자가 로그아웃할 때 OIDC 공급자가 호출하는 URL을 정의해요(https://openid.net/specs/openid-connect-rpinitiated-1_0.html#OpenID.BackChannel 참고). 경로(/backchannel-logout 등), 호스트와 경로(example.com/backchannel-logout), 완전한 URL(https://example.com/backchannel-logout)이 될 수 있어요. http와 https 스킴만 지원됩니다. 이 기능은 현재 실험 상태이며 Keycloak OIDC 공급자로만 테스트됐어요. | "" | No |
| backchannelLogoutSessionsRequired | OIDC 공급자가 사용자 세션을 식별하기 위해 Logout Token에 sid(세션 ID) 클레임을 포함하는지 지정해요(https://openid.net/specs/openid-connect-backchannel-1_0.html#BCRegistration 참고). 생략하면 기본값은 false입니다. 이 기능은 현재 실험 상태이며 Keycloak OIDC 공급자로만 테스트됐어요. | false | No |
| stateCookie.name | state 쿠키의 이름을 정의해요. | "MIDDLEWARE_NAME-state" | No |
| stateCookie.path | Cookie 헤더를 보내기 위해 요청 URL에 존재해야 하는 URL 경로를 정의해요. %x2F('/') 문자는 디렉터리 구분자로 간주되며, 하위 디렉터리도 매칭돼요. 예를 들어 stateCookie.path가 /docs로 설정되면 /docs, /docs/web/, /docs/web/http가 매칭됩니다. | "/" | No |
| stateCookie.domain | 쿠키를 받을 수 있는 호스트를 정의해요. 지정되면 서브 도메인은 항상 포함됩니다. 예를 들어 example.com으로 설정하면 api.example.com 같은 서브 도메인에도 쿠키가 포함됩니다. | "" | No |
| stateCookie.maxAge | state 쿠키가 만료되는 시간(초)을 정의해요. 0이나 음수면 쿠키가 즉시 만료됩니다. | 600 | No |
| stateCookie.sameSite | 브라우저가 교차 사이트 요청에서 state 쿠키를 어떻게 처리해야 하는지 알려줍니다. lax나 strict로 설정하면 교차 사이트 요청 위조 공격(CSRF)에 대한 일부 보호를 제공할 수 있어요. 자세한 내용은 여기. | lax | No |
| stateCookie.httpOnly | JavaScript가 쿠키에 접근하는 것을 금지해요. 예를 들어 Document.cookie 속성, XMLHttpRequest API, Request API를 통한 접근을 막습니다. 이는 크로스 사이트 스크립팅(XSS) 공격을 완화합니다. | true | No |
| stateCookie.secure | 요청이 https 스킴으로 만들어졌을 때만 state 쿠키를 서버에 보낼지 정의해요. | false | No |
| session.name | 세션 쿠키의 이름. | "MIDDLEWARE_NAME-session" | No |
| session.path | Cookie 헤더를 보내기 위해 요청 URL에 존재해야 하는 URL 경로를 정의해요. %x2F('/') 문자는 디렉터리 구분자로 간주되며, 하위 디렉터리도 매칭돼요. 예를 들어 stateCookie.path가 /docs로 설정되면 /docs, /docs/web/, /docs/web/http가 매칭됩니다. | "/" | No |
| session.domain | 쿠키를 받을 수 있는 호스트를 지정해요. 지정되면 서브 도메인은 항상 포함됩니다. 예를 들어 example.com으로 설정하면 api.example.com 같은 서브 도메인에도 쿠키가 포함됩니다. | "" | No |
| session.expiry | 세션이 만료되는 시간(초). 0이나 음수는 금지됩니다. | 86400 (24h) | No |
| session.sliding | 인증된 요청을 받을 때마다 세션 쿠키를 갱신하도록 미들웨어에 강제해요. | true | No |
| session.refresh | 접근 토큰이 만료됐을 때 접근 토큰 갱신을 활성화해요. | true | No |
| session.sameSite | 브라우저가 교차 사이트 요청에서 세션 쿠키를 어떻게 처리해야 하는지 알려줍니다. lax나 strict로 설정하면 교차 사이트 요청 위조 공격(CSRF)에 대한 일부 보호를 제공할 수 있어요. 자세한 내용은 여기. | lax | No |
| session.httpOnly | JavaScript가 쿠키에 접근하는 것을 금지해요. 예를 들어 Document.cookie 속성, XMLHttpRequest API, Request API를 통한 접근을 막습니다. 이는 크로스 사이트 스크립팅(XSS) 공격을 완화합니다. | true | No |
| session.secure | 요청이 https 스킴으로 만들어졌을 때만 세션 쿠키를 서버에 보낼지 정의해요. | false | No |
| session.store.redis.endpoints | 연결할 Redis 인스턴스의 엔드포인트(예: redis.traefik-hub.svc.cluster.local:6379) | "" | Yes |
| session.store.redis.username | Traefik Hub가 Redis에 연결할 때 사용하는 사용자 이름 | "" | No |
| session.store.redis.password | Traefik Hub가 Redis에 연결할 때 사용하는 비밀번호 | "" | No |
| session.store.redis.database | Traefik Hub가 정보를 저장하는 데 사용할 데이터베이스(기본값: 0) | "" | No |
| session.store.redis.cluster | Redis Cluster 활성화 | "" | No |
| session.store.redis.tls.caBundle | 커스텀 CA 번들 | "" | No |
| session.store.redis.tls.cert | TLS 인증서 | "" | No |
| session.store.redis.tls.key | TLS 키 | "" | No |
| session.store.redis.tls.insecureSkipVerify | TLS 검증 건너뛰기 허용 | "" | No |
| session.store.redis.sentinel.masterSet | 마스터 선택에 사용할 주 노드 집합의 이름. Sentinel 사용 시 필수. | "" | No |
| session.store.redis.sentinel.username | Sentinel 인증에 사용할 사용자 이름(username과 다를 수 있음) | "" | No |
| session.store.redis.sentinel.password | Sentinel 인증에 사용할 비밀번호(password와 다를 수 있음) | "" | No |
| session.store.keyPrefix | 세션을 저장하는 엔트리의 키 접두사를 정의해요. | "" | No |
| csrf | 활성화하면 hub-csrf-token이라는 이름의 CSRF 쿠키가 OIDC 세션에 바인딩되어 서비스를 CSRF 공격으로부터 보호해요. OWASP 재단이 정의한 Signed Double Submit Cookie 구현을 기반으로 합니다. 자세한 내용은 여기. | "" | No |
| csrf.secure | 요청이 https 스킴으로 만들어졌을 때만 CSRF 쿠키를 서버에 보낼지 정의해요. | false | No |
| csrf.headerName | CSRF 쿠키에서 이전에 받은 CSRF 토큰 값을 보내는 데 사용하는 헤더 이름을 정의해요. | Hub-Csrf-Token | No |
redirectUrl
IngressRoute에 특정 규칙 추가하기
URL은 OpenID Connect 공급자에게 미들웨어로 돌아오는 방법을 알려줍니다. 라우터 규칙이 도메인의 모든 경로를 허용한다면 추가 작업이 필요 없어요. 라우터 규칙이 허용 경로에 대해 특정적이라면, 이 옵션에 설정된 경로가 포함되어야 합니다.
redirectUrl 전용 규칙 정의
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: whoami
spec:
entryPoints:
- web
- websecure
routes:
# loginUrl과 redirectUrl을 매칭하는 규칙은
# 현재 라우터에 추가할 수 있습니다.
- match: Path(`/myapi`) || Path(`/login`) || Path(`/callback`)
kind: Rule
middlewares:
- name: test-oidc
이 URL은 업스트림 애플리케이션으로 전달되지 않고 미들웨어 자체가 처리해요. 따라서 선택한 URL은 업스트림 애플리케이션이 필요로 하는 URL과 충돌하면 안 됩니다.
이 URL은 때때로 OpenID Connect 공급자의 구성에도 설정해야 합니다(예를 들어 Google Accounts의 경우).
절대 URL이거나, 프로토콜 기준 상대(요청 프로토콜 상속), 도메인 기준 상대(요청 도메인과 프로토콜 상속)일 수 있어요. 다음 예시를 참고하세요.
요청에서 프로토콜과 도메인을 상속하고 redirectUrl의 경로 사용
| Request URL | RedirectURL | Result |
| http://expl.co | /cback | http://expl.co/cback |
요청에서 프로토콜을 상속하고 redirectUrl의 도메인과 경로 사용
| Request URL | RedirectURL | Result |
| https://scur.co | expl.co/cback | https://expl.co/cback |
절대 URL이므로 요청 URL을 redirect URL로 대체
| Request URL | RedirectURL | Result |
| https://scur.co | http://expl.co/cback | http://expl.co/cback |
지원되는 스킴
http와 https 스킴만 지원됩니다.
redirectUrl 정의하기
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: test-oidc
spec:
plugin:
oidc:
issuer: "https://tenant.auth0.com/realms/myrealm"
redirectUrl: "/callback"
clientId: my-oidc-client-name
clientSecret: mysecret
clientId, clientSecret
Kubernetes secret에 비밀 값 저장하기
clientId와 clientSecret을 구성할 때, Middleware와 같은 네임스페이스에 정의된 Kubernetes secret을 참조할 수 있어요. Kubernetes secret에 대한 참조는 URN 형식을 취합니다:
urn:k8s:secret:[name]:[valueKey]
claims
문법
claims에서 지원하는 함수는 다음과 같아요:
| Function | Description | Example |
| Equals | key의 값이 value와 같은지 검증해요. | Equals(grp, admin) |
| Prefix | key의 값이 value를 접두사로 갖는지 검증해요. | Prefix(referrer, http://example.com) |
| Contains (string) | key의 값이 value를 포함하는지 검증해요. | Contains(referrer, /foo/) |
| Contains (array) | key 배열이 value를 포함하는지 검증해요. | Contains(areas, home) |
| SplitContains | key의 값을 구분자로 나눴을 때 value를 포함하는지 검증해요. | SplitContains(scope, , writer) |
| OneOf | key 배열이 values 중 하나를 포함하는지 검증해요. | OneOf(areas, office, lab) |
모든 함수는 불리언 연산자로 결합할 수 있어요. 지원되는 연산자는 다음과 같아요:
| Operand | Description | Example |
| && | 두 함수를 비교해서 둘 다 참일 때만 참을 반환해요. | Equals(grp, admin) && Equals(active, true) |
| || | 두 함수를 비교해서 둘 중 하나라도 참이면 참을 반환해요. | Equals(grp, admin) || Equals(active, true) |
| ! | 함수가 참이면 false를, 그 외에는 참을 반환해요. | !Equals(grp, testers) |
다음 데이터 구조에서는 모든 예시가 참을 반환해요:
JSON
{
"active": true,
"grp": "admin",
"scope": "reader writer deploy",
"referrer": "http://example.com/foo/bar",
"areas": [
"office",
"home"
]
}
중첩 클레임 (Nested Claims)
키 사이에 .를 사용해 중첩 클레임을 지원해요. 예를 들어:
Key
user.name
Claims
{
"active": true,
"grp": "admin",
"scope": "reader writer deploy",
"referrer": "http://example.com/foo/bar",
"areas": [
"office",
"home"
],
"user" {
"name": "John Snow",
"status": "undead"
}
}
Result
John Snow
.을 포함하는 키 처리
key에 점이 포함되어 있으면 \.로 이스케이프할 수 있어요.
\를 포함하는 키 처리
key에 \가 포함되어 있으면 \\로 두 번 적어야 합니다.
접근 토큰과 ID 토큰 클레임
함수의 첫 번째 인자는 토큰 클레임에서 찾을 키를 나타내며, 두 종류의 토큰 중 어느 것을 검사할지 지정하도록 접두사를 붙일 수 있어요. 가능한 접두사 값은 id_token.과 access_token.입니다. 접두사가 지정되지 않으면 ID 토큰이 기본값입니다.
| Example | Description |
| Equals(id_token.grp, admin) | ID 토큰의 grp 클레임 값이 admin인지 확인해요. |
| Prefix(access_token.referrer, http://example.com) | 접근 토큰의 referrer 클레임 값이 http://example.com\으로 시작하는지 확인해요. |
| OneOf(areas, office, lab) | ID 토큰의 areas 클레임 값이 office 또는 labs인지 확인해요. |
clientConfig
API 게이트웨이를 Identity Provider 같은 서드파티 소프트웨어에 연결하는 데 사용하는 구성을 정의해요.
clientConfig.tls
Kubernetes secret에 비밀 값 저장하기
tls.ca, tls.cert, tls.key를 구성할 때, Middleware와 같은 네임스페이스에 정의된 Kubernetes secret을 참조할 수 있어요. Kubernetes secret에 대한 참조는 URN 형식을 취합니다:
urn:k8s:secret:[name]:[valueKey]
Middleware JWT
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: test-oidc
spec:
plugin:
oidc:
clientConfig:
tls:
ca: "urn:k8s:secret:tls:ca"
cert: "urn:k8s:secret:tls:cert"
key: "urn:k8s:secret:tls:key"
insecureSkipVerify: true
Kubernetes TLS Secret
apiVersion: v1
kind: Secret
metadata:
name: tls
stringData:
ca: |-
-----BEGIN CERTIFICATE-----
MIIB9TCCAWACAQAwgbgxGTAXBgNVBAoMEFF1b1ZhZGlzIExpbWl0ZWQxHDAaBgNV
BAsME0RvY3VtZW50IERlcGFydG1lbnQxOTA3BgNVBAMMMFdoeSBhcmUgeW91IGRl
Y29kaW5nIG1lPyAgVGhpcyBpcyBvbmx5IGEgdGVzdCEhITERMA8GA1UEBwwISGFt
aWx0b24xETAPBgNVBAgMCFBlbWJyb2tlMQswCQYDVQQGEwJCTTEPMA0GCSqGSIb3
DQEJARYAMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ9WRanG/fUvcfKiGl
EL4aRLjGt537mZ28UU9/3eiJeJznNSOuNLnF+hmabAu7H0LT4K7EdqfF+XUZW/2j
RKRYcvOUDGF9A7OjW7UfKk1In3+6QDCi7X34RE161jqoaJjrm/T18TOKcgkkhRzE
apQnIDm0Ea/HVzX/PiSOGuertwIDAQABMAsGCSqGSIb3DQEBBQOBgQBzMJdAV4QP
Awel8LzGx5uMOshezF/KfP67wJ93UW+N7zXY6AwPgoLj4Kjw+WtU684JL8Dtr9FX
ozakE+8p06BpxegR4BR3FMHf6p+0jQxUEAkAyb/mVgm66TyghDGC6/YkiKoZptXQ
98TwDIK/39WEB/V607As+KoYazQG8drorw==
-----END CERTIFICATE-----
cert: |-
-----BEGIN CERTIFICATE-----
MIIB9TCCAWACAQAwgbgxGTAXBgNVBAoMEFF1b1ZhZGlzIExpbWl0ZWQxHDAaBgNV
BAsME0RvY3VtZW50IERlcGFydG1lbnQxOTA3BgNVBAMMMFdoeSBhcmUgeW91IGRl
Y29kaW5nIG1lPyAgVGhpcyBpcyBvbmx5IGEgdGVzdCEhITERMA8GA1UEBwwISGFt
aWx0b24xETAPBgNVBAgMCFBlbWJyb2tlMQswCQYDVQQGEwJCTTEPMA0GCSqGSIb3
DQEJARYAMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ9WRanG/fUvcfKiGl
EL4aRLjGt537mZ28UU9/3eiJeJznNSOuNLnF+hmabAu7H0LT4K7EdqfF+XUZW/2j
RKRYcvOUDGF9A7OjW7UfKk1In3+6QDCi7X34RE161jqoaJjrm/T18TOKcgkkhRzE
apQnIDm0Ea/HVzX/PiSOGuertwIDAQABMAsGCSqGSIb3DQEBBQOBgQBzMJdAV4QP
Awel8LzGx5uMOshezF/KfP67wJ93UW+N7zXY6AwPgoLj4Kjw+WtU684JL8Dtr9FX
ozakE+8p06BpxegR4BR3FMHf6p+0jQxUEAkAyb/mVgm66TyghDGC6/YkiKoZptXQ
98TwDIK/39WEB/V607As+KoYazQG8drorw==
-----END CERTIFICATE-----
key: |-
[REDACTED PRIVATE KEY]
sameSite - 허용 값
-
none: 브라우저는 교차 사이트 요청과 동일 사이트 요청 모두에 쿠키를 보냅니다.
-
strict: 브라우저는 동일 사이트 요청(쿠키를 설정한 사이트에서 시작된 요청)에만 쿠키를 보냅니다. 요청이 현재 위치의 URL과 다른 URL에서 시작됐다면, strict 속성이 붙은 쿠키는 어느 것도 포함되지 않습니다.
-
lax: 동일 사이트 쿠키는 이미지나 프레임을 로드하는 호출 같은 교차 사이트 하위 요청에서는 보류되지만, 사용자가 외부 사이트에서 링크를 따라가며 URL로 이동할 때는 전송됩니다.
session.store
OpenID Connect 인증 미들웨어는 모든 상태를 쿠키에 두는 대신 영속적인 KV 스토리지에 HTTP 세션 데이터를 저장할 수 있어요. 이를 통해 쿠키가 불편할 정도로 커져 대기 시간 문제가 생기는 것을 피할 수 있습니다.
Redis 연결을 구성하려면 redis 옵션을 참고하세요.
Redis 서버에 대한 연결 파라미터는 Middleware 배포에 첨부됩니다.
다음 Redis 모드가 지원됩니다:
-
단일 인스턴스 모드
-
Redis Cluster
-
Redis Sentinel
Info
Redis를 단일 인스턴스 모드나 Redis Sentinel로 사용한다면 database 필드를 구성할 수 있어요. 이 값은 Redis Cluster를 사용하면 고려되지 않습니다(데이터베이스 0만 사용 가능). 이 경우 경고가 표시되고 값은 무시됩니다.
Redis에 대한 자세한 내용은 공식 Redis 문서를 권장합니다.
Redis 연결 정의하기
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: test-oidc
spec:
plugin:
oidc:
issuer: "https://tenant.auth0.com/realms/myrealm"
redirectUrl: "/callback"
clientId: my-oidc-client-name
clientSecret: mysecret
session:
store:
redis:
endpoints:
- redis-master.traefik-hub.svc.cluster.local:6379
password: "urn:k8s:secret:oidc:redisPass"
Kubernetes secret 만들기
apiVersion: v1
kind: Secret
metadata:
name: oidc
stringData:
redisPass: mysecret12345678
csrf
CSRF 내부 동작
OIDC 세션이 만료되면 해당 CSRF 쿠키가 삭제됩니다. 즉, 세션이 갱신되거나 재생성될 때마다 새 CSRF 토큰이 생성되어 클라이언트에 전송된다는 뜻이에요.
요청이 안전하지 않은(non-safe) 메서드(RFC7231#section-4.2.1 참고)를 사용할 때는 CSRF 토큰 값(쿠키에서 추출)을 headerName 옵션으로 구성된 헤더에 담아 서버로 보내야 합니다.
Traefik OSS를 프로덕션에서 사용하시나요?
직장에서 Traefik을 사용한다면, 엔터프라이즈급 API 게이트웨이 기능이나 Traefik OSS 상용 지원을 추가하는 것을 고려해 보세요.
-
API Gateway 데모 영상 보기
-
24/7/365 OSS 지원 요청
Traefik OSS에 API 게이트웨이 기능을 추가하는 것은 빠르고 매끄러워요. 기존 구성을 교체하거나(rip and replace) 버릴 필요 없이 그대로 유지됩니다. 짧은 영상으로 직접 확인해 보세요.