Logto 제품 업데이트
Logto v1.43.0 은 OAuth 클라이언트 ID 메타데이터 문서가 포함된 동적 앱, 서명된 SAML 인증 요청, 제한된 Custom JWT 및 Actions 런타임, 더 강력한 토큰 교환 검증, 그리고 웹훅 및 엔터프라이즈 SSO용 SSRF 보호 확장을 추가합니다.
Logto v1.43.0 은 OAuth 클라이언트 ID 메타데이터 문서가 포함된 동적 앱, 서명된 SAML 인증 요청, 제한된 Custom JWT 및 Actions 런타임, 더 강력한 토큰 교환 검증, 그리고 웹훅 및 엔터프라이즈 SSO용 SSRF 보호 확장을 추가합니다.
Logto v1.43.0 은 애플리케이션과 엔터프라이즈 아이덴티티 공급자의 연결 방식을 확장하며, 토큰과 외부 요청의 보안 경계를 강화합니다. OAuth 클라이언트 ID 메타데이터 문서가 포함된 동적 앱, 서명된 SAML 인증 요청, 그리고 Custom JWT와 Actions를 위한 통합 런타임을 도입합니다. 이번 릴리스는 토큰 교환, 웹훅, 엔터프라이즈 SSO의 보안을 강화했으며, Account Center 개선, 스페인어(멕시코) 지원, 신뢰성 향상도 포함되어 있습니다. 이번에 새롭게 추가된 기능은 다음과 같습니다.
로그인 경험이 이제 es-MX(스페인어, 멕시코)를 지원합니다.
사용자의 언어가 스페인어(멕시코)일 때 전화번호 입력은 기본적으로 멕시코 국가 코드(+52)가 적용됩니다. 이번 릴리스에서는 목록 포매터 플레이스홀더와 스페인어 지역에 남아있던 미번역 MFA 메시지도 수정되었습니다.
Management API를 통해 구성된 외부 요청은 이제 loopback, 사설, link-local, 클라우드 메타데이터 또는 특수 용도 주소로 해석될 경우 차단됩니다.
보호 범위는 다음을 포함합니다:
POST /api/hooks/:id/test 포함DNS 이름은 연결이 수립될 때 검사되며, 보호 대상 주소로 해석되는 호스트네임도 리터럴 IP 주소처럼 거부됩니다.
Logto는 1차 발급 토큰을 요구하는 것에 더해, access_token 주제로 제시된 JWT가 실제로 액세스 토큰인지 검증합니다.
JWT는 다음을 포함해야 합니다:
at+jwt 타입 헤더client_id 클레임OIDC ID 토큰 등 테넌트에서 서명한 다른 JWT는 더 이상 액세스 토큰으로 대체될 수 없습니다. 잘못된 주제 토큰은 invalid_grant와 함께 거부됩니다.
서드파티 앱은 더 이상 Account API나 Verification API를 통해 계정 데이터를 변경할 수 없습니다. 이러한 요청은 다음을 반환합니다:
Account Center와 Console 등 1차 앱은 영향을 받지 않습니다.
해결되지 않은 클라이언트 식별자의 경우에도 이 검사는 폐쇄적으로 동작합니다. 여기에는 액세스 토큰이 아직 유효한 삭제된 앱이나 식별자가 메타데이터 URL인 CIMD 클라이언트가 포함됩니다.
읽기 경로에는 새로운 직접 보호자가 추가되지 않았습니다. 그러나 다음 읽기는 보호되는 경로를 통해 생성된 인증 기록을 요구하므로, 서드파티 앱에서 더 이상 접근할 수 없습니다:
GET /api/my-account/grantsGET /api/my-account/sessionsGET /api/my-account/mfa-verifications/backup-codes토큰 발급 및 userinfo는 이제 정지된 사용자에 대해 invalid_grant로 거부하여, 삭제된 사용자에 대한 기존 동작과 일치합니다.
이는 refresh token, authorization code, device code, token exchange 흐름 전반에 적용되며, 이전 토큰 또는 세션 폐기가 성공적으로 완료되지 않았더라도 마찬가지입니다.
서드파티 앱의 동의 구성에서 사용자 스코프를 제거하면, 기존 권한과 신규 인증 요청 모두에 영향을 미칩니다.
invalid_scope로 실패합니다.insufficient_scope로 실패합니다.Sentinel 잠금 카운터는 이제 계정 조회와 동일하게 정규화된 식별자 형태를 사용합니다:
이는 동일한 식별자의 다른 철자가 별도의 시도 버킷을 만드는 것을 방지하고, maxAttempts를 약화시키지 않습니다.
수동 잠금 해제도 동일 계정을 나타내는 등가 철자가 모두 해제됩니다. 업그레이드 후, 비표준 철자에 기록된 기존 잠금은 일찍 끝날 수 있지만, 사용자가 더 오래 잠금상태가 되지는 않습니다.
redirect_to 값은 http 또는 https를 사용해야 합니다.ES256, P-384는 ES384, P-521은 ES512를 사용합니다.invalid_scope와 insufficient_scope 메시지는 이제 수락되지 않은 스코프를 표시하며, 더 이상 생(raw) {{error_description}} 또는 {{scope}} 플레이스홀더를 보여주지 않습니다.Accept-Language 품질 값(예: en; q=0.7)이 올바르게 파싱됩니다. 잘못된 품질 값은 안전하게 폴백되며 NaN을 발생시키지 않습니다.gmail.com과 googlemail.com을 동등하게 취급하고, 로컬파트의 점(dot)은 무시합니다.custom_profile_fields.entity_not_exists_with_names 오류를 반환하는 대신 무시됩니다.POST /applications/:applicationId/user-consent-scopesPOST /organizations/:id/users/:userId/roles웹훅 POST 요청은 엔드포인트가 HTTP 5xx 응답을 반환하면 3회까지 재시도합니다. 이는 문서화된 전송 계약과 일치합니다.
재시도된 이벤트는 여러 번 전송될 수 있으므로, 웹훅 수신기는 반드시 멱등적으로 이벤트를 처리해야 합니다.
Microsoft Azure AD 커넥터는 이제 disableEmailSync 옵션을 지원합니다.
기본적으로 커넥터는 Microsoft Graph mail 속성을 Logto 사용자 프로필로 복사합니다. 이 옵션을 활성화하면, Azure OIDC 엔터프라이즈 SSO에서 기존에 제공됐던 방식처럼, 해당 주소의 동기화 없이 사용자 인증만 수행할 수 있습니다.
조치 필요 — 외부 요청 보호: 웹훅 또는 엔터프라이즈 SSO 커넥터가 의도적으로 프라이빗 네트워크의 서비스에 접근한다면, 업그레이드 전 반드시 SSRF_ALLOWED_ADDRESSES 에 필요한 IP 주소나 CIDR 범위를 추가해야 합니다:
필요한 목적지만 화이트리스트에 추가하는 것이 전체 보호를 비활성화하는 것보다 안전합니다.
동적 앱 호환성: SSRF_ALLOWED_ADDRESSES 설정 시 CIMD가 비활성화되므로, 인증되지 않은 동적 클라이언트가 화이트리스트를 이용해 프라이빗 서비스에 접근할 수 없습니다. SSRF_PROTECTION_DISABLED=true 설정도 CIMD를 비활성화합니다.
구성 호환성: OIDC_PROVIDER_SSRF_PROTECTION_DISABLED 는 SSRF_PROTECTION_DISABLED의 별칭으로 계속 지원됩니다. 이 변수들은 자체 호스팅 배포에만 적용됩니다.
스크립트 런타임 제한: Custom JWT 및 Actions 스크립트는 5초 이내에 완료되어야 하며 128 MB 워커 메모리 한도 내에서 JSON 직렬화 가능 값을 반환해야 합니다.
DB 마이그레이션 필요: 이번 릴리스에는 새로운 스키마 변경과 인덱스가 포함되어 있습니다. 업그레이드 후 새로운 버전 시작 전 DB 변경 명령( @logto/cli/core 이미지에서 npm run alteration deploy , 또는 logto db alteration deploy )을 실행하세요. 자세한 내용은 업그레이드 가이드 를 참고하세요.
이번 릴리스에 기여해주신 커뮤니티 멤버 분들께 감사드립니다:
Accept-Language 품질 파서 (#9338)전체 변경 내역은 전체 변경 로그 를 참고하세요.