Laravel 13.27.0 업데이트
릴리스: 2026년 8월 25일
평가: 2026년 8월 28일
13.27.0은 마이너 릴리스로 검증 로직의 여러 보안성 버그 수정(느슨한 비교 우회, 입력 키 병합 시 별표/점 처리, maintenance 우회 쿠키 가드)과 몇 가지 새 기능(whereBinary, refreshForUpdate, Cloud 파사드, MariaDB 벡터 거리 쿼리)이 포함되어 있습니다. 대부분 하위 호환되는 버그 수정이지만, validation 규칙과 request 입력 병합 동작에 의존하는 애플리케이션은 검증 규칙 결과가 바뀔 수 있어 확인이 필요합니다.
예상되는 하위 호환성 문제
- in_array 검증 규칙의 느슨한 비교 우회 방지심각도 보통
PR #61319에 따라 in_array 규칙이 느슨한 비교로 우회 가능했던 문제를 수정했습니다. 이전에는 통과하던 입력(예: 문자열 '0'과 정수 0 비교 등)이 이번 수정으로 실패할 수 있습니다.
영향 범위: in_array 검증 규칙을 사용하는 요청 검증 코드
- doesnt_contain 검증 규칙의 느슨한 비교 방지심각도 보통
PR #61318에서 doesnt_contain 규칙의 느슨한 비교 우회를 방지하도록 수정했습니다. 검증 통과 여부가 달라질 수 있습니다.
영향 범위: doesnt_contain 검증 규칙을 사용하는 요청 검증 코드
- 요청 입력/쿼리 파라미터 병합 시 별표(*)와 점(.)을 리터럴 키로 처리심각도 낮음
PR #61309, #61312, #61313에 따라 입력 병합 및 unknown 필드 거부 로직에서 별표와 점이 포함된 키를 와일드카드가 아닌 리터럴 키로 처리하도록 변경되었습니다. 해당 문자를 실제 키 이름으로 사용하는 요청 처리 로직의 동작이 달라질 수 있습니다.
영향 범위: 요청 병합(mergeIfMissing 등) 및 unknown 필드 거부 검증을 사용하는 코드
- maintenance 우회 쿠키의 mac 값이 문자열이 아닐 때 가드 추가심각도 낮음
PR #61314에서 non-string mac 값에 대한 방어 로직이 추가되었습니다. 커스텀 유지보수 쿠키 처리 로직이 있다면 확인이 필요합니다.
영향 범위: maintenance mode 우회 쿠키를 커스텀 생성/검증하는 코드
패키지 관리자가 확인할 것
- laravel/scout위험도 낮음
이번 릴리스에 Scout 관련 변경 사항은 언급되지 않았습니다. 직접적인 영향 없음.
대응 체크리스트
- in_array, contains, doesnt_contain 검증 규칙 사용 여부 점검가까운 시일
느슨한 비교에 의존해 통과하던 검증 로직이 있는지 테스트 스위트를 실행해 확인하세요. 참고로 contains 규칙 수정(#61320)은 이후 revert(#61330)되어 최종 반영되지 않았습니다.
- 요청 병합/거부 로직에서 별표(*) 또는 점(.) 키 사용 여부 확인가까운 시일
mergeIfMissing, validated 요청 처리 등에서 키 이름에 '*'나 '.'을 실제로 사용하는 경우가 있는지 확인하고, 있다면 동작 변화를 테스트하세요.
- 커스텀 maintenance 모드 우회 쿠키 로직 점검선택
직접 우회 쿠키를 생성/검증하는 커스텀 코드가 있다면 mac 값이 문자열인지 확인하는 로직 변경을 검토하세요.
자동 생성상세 평가
요약
13.27.0은 마이너 릴리스로, 검증(validation) 관련 여러 버그 수정과 소소한 신규 기능(whereBinary, refreshForUpdate, Cloud 파사드, MariaDB 벡터 거리 쿼리, Queue totalXSize 등)이 포함되어 있습니다. 대부분 버그 수정이며 공식적으로 breaking change로 명시된 항목은 없지만, 검증 규칙과 입력 병합 동작 변경은 일부 애플리케이션에서 눈에 띄는 동작 차이를 만들 수 있습니다.
주요 변경
in_array,doesnt_contain검증 규칙에서 느슨한 비교 우회를 방지 (#61319, #61318).contains규칙의 동일한 수정(#61320)은 이후 revert됨(#61330).- 요청 입력 및 URI 쿼리 파라미터 병합, unknown 필드 거부 로직에서
*와.을 리터럴 키로 처리 (#61309, #61312, #61313). - maintenance 우회 쿠키의 mac 값이 문자열이 아닐 경우 가드 추가 (#61314).
whereBinary()쿼리 빌더 메서드,refreshForUpdate()Eloquent 메서드, Cloud 파사드, MariaDB 벡터 거리 쿼리 지원 등 신규 기능 추가.orWhereKey()/orWhereKeyNot()을 Builder 서브클래스를 깨지 않는 방식으로 재도입 (#61242).- Redis, SQS, Postgres, 이미지 처리 등 다수의 버그 수정.
- 다수의 테스트/CI 관련 내부 정리 작업(영향 없음).
하위 호환성
릴리스 노트에 공식적으로 명시된 breaking change는 없습니다. 다만 검증 규칙의 느슨한 비교 우회 방지 및 입력 키 병합 로직 변경은 기존에 특정 엣지 케이스(느슨한 비교로 통과하던 입력, */. 문자를 포함한 키)에 의존하던 코드의 동작을 바꿀 수 있습니다.
패키지 관리자가 확인할 것
제공된 등록 패키지 목록 중 이번 릴리스 노트에서 직접 언급되거나 영향받는 패키지는 없습니다. Laravel 프레임워크에 의존하는 모든 패키지는 일반적인 호환성 확인 수준이면 충분합니다.
대응 체크리스트
-
in_array,doesnt_contain검증 규칙을 사용하는 폼 리퀘스트의 테스트 실행 - 요청 데이터 키에
*또는.을 리터럴로 사용하는 곳이 있는지 검색 - 커스텀 maintenance 우회 쿠키 로직이 있다면 점검
- 신규 기능(whereBinary, refreshForUpdate, Cloud 파사드 등) 도입 검토는 선택 사항
GitHub 릴리스 노트를 근거로 언어 모델 (claude-sonnet-5)이 작성했으며, 사람이 검수하지 않았습니다. 실제 적용 전에는 공식 릴리스 노트와 업그레이드 가이드를 함께 확인하세요.
GitHub 원문 릴리스 노트 보기
- [13.x] Prevent duplicate scoped instance registrations by @jordanhavard in https://github.com/laravel/framework/pull/61251
- [13.x] Add
refreshForUpdate()method to Eloquent models by @stevebauman in https://github.com/laravel/framework/pull/61247 - [13.x] Fix PHPUnit and Mockery deprecations in tests by @lucasmichot in https://github.com/laravel/framework/pull/61244
- [13.x] Throw on unsuccessful responses when creating images from URLs by @Button99 in https://github.com/laravel/framework/pull/61254
- Apply fixes from StyleCI by @taylorotwell in https://github.com/laravel/framework/pull/61256
- [13.x] Skip scheduled workflows on forks by @MrPunyapal in https://github.com/laravel/framework/pull/61239
- [13.x] Consolidate tearDown boilerplate into AfterEachTestSubscriber by @lucasmichot in https://github.com/laravel/framework/pull/61245
- [13.x] Pin rector version by @lucasmichot in https://github.com/laravel/framework/pull/61257
- [13.x] Re-introduce orWhereKey() and orWhereKeyNot() without breaking Builder subclasses by @kevariable in https://github.com/laravel/framework/pull/61242
- [13.x] Don't force release a unique lock the job never acquired by @sulimanbenhalim in https://github.com/laravel/framework/pull/61234
- [13.x] Convert foreach-loop tests to data providers by @lucasmichot in https://github.com/laravel/framework/pull/61258
- [13.x] Simplify testImageBmp by @lucasmichot in https://github.com/laravel/framework/pull/61259
- [13.x] Add missing test coverage for Str and Stringable by @lucasmichot in https://github.com/laravel/framework/pull/61260
- [13.x] Add Queue
totalXSizemethods by @jackbayliss in https://github.com/laravel/framework/pull/61231 - Add MariaDB support for vector distance queries by @Rhaima96 in https://github.com/laravel/framework/pull/61250
- [13.x] Add
whereBinary()to the query builder by @xiCO2k in https://github.com/laravel/framework/pull/61261 - [13.x] Fix
quietly()makingthrow()unreachable on process results by @xurshudyan in https://github.com/laravel/framework/pull/61227 - Revert "[13.x] Consolidate tearDown boilerplate into AfterEachTestSubscriber (#61245)" by @crynobone in https://github.com/laravel/framework/pull/61262
- Use
nick-fields/retryto verify clustered redis ports are available by @crynobone in https://github.com/laravel/framework/pull/61263 - [13.x] Guard against
falsereturns inPhpRedisConnection::mget()andhmget()by @matthewfarrugia in https://github.com/laravel/framework/pull/61267 - [13.x] Add
stop()andensureNotTimedOut()toFakeInvokedProcessby @xurshudyan in https://github.com/laravel/framework/pull/61266 - [13.x] Make eager-load constraint closures static to break Builder reference cycle by @mspasov in https://github.com/laravel/framework/pull/61264
- [13.x] Move and copy files that only exist on a read-through disk's fallback by @sulimanbenhalim in https://github.com/laravel/framework/pull/61272
- [13.x] Adjust QueueTest by @jackbayliss in https://github.com/laravel/framework/pull/61284
- [13.x] Introduce
InteractsWithTestCaseLifecycle::flushState()by @cosmastech in https://github.com/laravel/framework/pull/61288 - [13.x] Fix route name lost when RouteRegistrar action is not callable by @KalimeroMK in https://github.com/laravel/framework/pull/61285
- [13.x] Start a new max wait window after a debounced job runs by @sulimanbenhalim in https://github.com/laravel/framework/pull/61281
- [13.x] Fix nested includes not being limited when maxRelationshipDepth is zero by @martinsoenen in https://github.com/laravel/framework/pull/61297
- [13.x] Give each Redis Cluster node its own data directory in CI by @cyppe in https://github.com/laravel/framework/pull/61294
- [13.x] Ensure test namespaces are correct by @jackbayliss in https://github.com/laravel/framework/pull/61304
- [13.x] Fix flaky memcached touch test by pinning time by @mspasov in https://github.com/laravel/framework/pull/61301
- [13.x] Adjust database.yml timeout to 10 minutes by @jackbayliss in https://github.com/laravel/framework/pull/61299
- [13.x] Add Postgres keepalive DSN options by @tgivslife in https://github.com/laravel/framework/pull/61307
- [13.x] Introduce a Cloud facade by @jackbayliss in https://github.com/laravel/framework/pull/61275
- Normalize test fixtures by @jasonmccreary in https://github.com/laravel/framework/pull/61315
- [13.x] Treat asterisks as literal keys when merging request input by @KIKOmanasijev in https://github.com/laravel/framework/pull/61309
- [13.x] Guard against non-string mac in maintenance bypass cookie by @KIKOmanasijev in https://github.com/laravel/framework/pull/61314
- [13.x] Treat asterisks as literal keys when merging URI query parameters by @KIKOmanasijev in https://github.com/laravel/framework/pull/61312
- [13.x] Prevent loose comparison bypass in
in_arrayvalidation rule by @KIKOmanasijev in https://github.com/laravel/framework/pull/61319 - [13.x] Prevent loose comparison bypass in contains validation rule by @KIKOmanasijev in https://github.com/laravel/framework/pull/61320
- [13.x] Prevent loose comparisons in
doesnt_containvalidation rule by @KIKOmanasijev in https://github.com/laravel/framework/pull/61318 - Fix resource loading by @taylorotwell in https://github.com/laravel/framework/pull/61322
- [13.x] Treat literal dots in input keys correctly when rejecting unknown fields by @KIKOmanasijev in https://github.com/laravel/framework/pull/61313
- Revert "[13.x] Prevent loose comparison bypass in contains validation rule" by @taylorotwell in https://github.com/laravel/framework/pull/61330
- [13.x] Allow masking query bindings in exception messages by @LauJosefsen in https://github.com/laravel/framework/pull/61326
- [13.x] Share cached AWS credentials across processes for SQS queue connections by @DGarbs51 in https://github.com/laravel/framework/pull/61321
- [13.x] Fix images created from a stream failing on the second read by @Chy-Zaber-Bin-Zahid in https://github.com/laravel/framework/pull/61305
- [13.x] Fix uncaught Brick MathException escaping the numeric comparison rules by @gcotcheza in https://github.com/laravel/framework/pull/61332