Laravel 13.6.0 업데이트
릴리스: 2026년 4월 21일
평가: 2026년 8월 28일
13.6.0은 마이너 릴리스로 다수의 버그 수정과 소규모 기능 추가를 포함합니다. 대부분은 하위 호환되지만, 암호화 MAC 검증 방식 변경과 일부 유효성 검사 규칙 동작 수정은 특정 설정을 사용하는 앱에서 실제 동작 차이를 유발할 수 있어 확인이 필요합니다.
예상되는 하위 호환성 문제
- 암호화 시 모든 키에 대해 MAC 검증심각도 보통
PR #59742에서 'Validate MAC across all decryption keys'로 변경되어, 이전에는 특정 키 하나만으로 통과하던 검증 로직이 여러 키(previousKeys 등)를 모두 대상으로 MAC을 검사하도록 바뀌었습니다. 키 로테이션을 사용 중인 앱에서 복호화 성공/실패 여부가 달라질 수 있습니다.
영향 범위: APP_KEY/APP_PREVIOUS_KEYS를 통한 암호화 키 로테이션을 사용하는 애플리케이션
- digits_between, decimal, max_digits, min_digits 검증 규칙의 타입 처리 변경심각도 낮음
PR #59717, #59739에서 문자열이 아닌 값이 들어올 때 TypeError가 발생하던 것을 수정하고 preg_match 호출 전 문자열로 캐스팅하도록 변경했습니다. 기존에 예외로 실패 처리되던 입력이 이제 정상적으로 검증을 통과하거나 다른 결과를 낼 수 있습니다.
영향 범위: digits_between/decimal/max_digits/min_digits 검증 규칙을 숫자가 아닌 값(배열, 객체 등)에 적용하는 폼 요청/유효성 검사 로직
- Cursor::fromEncoded가 잘못된 페이로드에 대해 null 반환심각도 낮음
PR #59699에 따라 malformed 커서 문자열을 넘겼을 때 예외 대신 null을 반환하도록 변경되었습니다. 이전에 예외를 캐치해 처리하던 코드가 있다면 null 체크로 바꿔야 합니다.
영향 범위: 커스텀 페이지네이션/커서 처리 로직에서 Cursor::fromEncoded를 직접 사용하는 코드
대응 체크리스트
- 암호화 키 로테이션 사용 여부 확인가까운 시일
config/app.php의 previous_keys(APP_PREVIOUS_KEYS)를 사용 중이라면, 업그레이드 후 기존 암호화된 데이터의 복호화가 정상 동작하는지 테스트하세요.
- 숫자 관련 커스텀 유효성 검사 재확인선택
digits_between, decimal, max_digits, min_digits 규칙에 문자열이 아닌 값(예: 배열, null이 아닌 객체)을 전달하는 폼이 있다면 동작이 바뀌었는지 테스트 스위트로 확인하세요.
- Cursor::fromEncoded 직접 사용 코드 점검선택
커스텀 페이지네이션에서 Cursor::fromEncoded 호출 후 예외 처리를 하고 있었다면 null 반환에 대응하도록 코드를 점검하세요.
자동 생성상세 평가
요약
13.6.0은 마이너 버전으로, 다수의 버그 수정(number abbreviation, Cursor, rate limiter, Vite CSS 로딩 등)과 소규모 신기능(디바운스 큐 작업, health 라우트 JSON 응답, enum 지원 확대, Cloudflare Email Service 지원 등)을 포함합니다. 대부분 하위 호환되며 즉시 대응이 필요한 치명적 변경은 없습니다.
주요 변경
- 암호화 MAC 검증이 모든 복호화 키(이전 키 포함)에 대해 수행되도록 변경 (#59742)
- digits_between/decimal/max_digits/min_digits 검증 규칙에서 비문자열 값 처리 방식 수정 (#59717, #59739)
- Cursor::fromEncoded가 잘못된 페이로드에 대해 예외 대신 null 반환 (#59699)
- 큐 디바운스 작업(debounceable queued jobs) 신규 지원 (#59507)
- health 라우트에서 JSON 응답 지원 (#59710)
- PasswordBrokerManager, BroadcastManager, NotificationChannelManager에 enum 지원 추가
- SQS 큐 연결에서 named credential provider 지원 추가 (#59733)
- Vite에서 중첩 청크 임포트 시 CSS 미로딩 문제 수정 (#59662)
하위 호환성
제공된 릴리스 노트 기준으로 공개 API를 깨뜨리는 변경은 명시되어 있지 않습니다. 다만 암호화 키 로테이션 사용 시 MAC 검증 대상 확대로 인해 동작 차이가 발생할 수 있고, 일부 유효성 검사 규칙의 타입 처리 변경으로 예외 발생 여부가 달라질 수 있습니다.
패키지 관리자가 확인할 것
등록된 패키지 목록 중 이번 릴리스 노트에서 직접 영향을 받는 항목은 확인되지 않았습니다. Http(illuminate/http), Socialite(laravel/socialite), Scout(laravel/scout) 등은 이번 변경 사항과 직접적인 연관이 없습니다.
대응 체크리스트
- APP_PREVIOUS_KEYS(암호화 키 로테이션) 사용 여부 확인 및 복호화 테스트
- digits_between/decimal/max_digits/min_digits 규칙에 비문자열 입력을 사용하는 폼이 있는지 점검
- Cursor::fromEncoded를 직접 호출하는 커스텀 페이지네이션 코드가 있다면 null 반환 처리 확인
- (선택) 디바운스 큐 작업, health 라우트 JSON 응답 등 신규 기능 도입 검토
GitHub 릴리스 노트를 근거로 언어 모델 (claude-sonnet-5)이 작성했으며, 사람이 검수하지 않았습니다. 실제 적용 전에는 공식 릴리스 노트와 업그레이드 가이드를 함께 확인하세요.
GitHub 원문 릴리스 노트 보기
- [13.x] Use
version_comparefunction by @lucasmichot in https://github.com/laravel/framework/pull/59687 - [13.x] Flip misordered assertions arguments by @lucasmichot in https://github.com/laravel/framework/pull/59691
- [13.x] Remove unused variable in
catch()by @lucasmichot in https://github.com/laravel/framework/pull/59689 - [13.x] Fix number abbreviation rollover between unit tiers by @Button99 in https://github.com/laravel/framework/pull/59692
- [13.x ]Use Null and Isset coalescing when possible by @lucasmichot in https://github.com/laravel/framework/pull/59690
- [13.x] Change
countarray comparison to empty array comparison to improve performance by @lucasmichot in https://github.com/laravel/framework/pull/59688 - [13.x] testsuite by @lucasmichot in https://github.com/laravel/framework/pull/59702
- [13.x] Enforce static calls by @lucasmichot in https://github.com/laravel/framework/pull/59704
- [13.x] Allow Table Attribute on child to override parent by @jackbayliss in https://github.com/laravel/framework/pull/59701
- [13.x] Return null from Cursor::fromEncoded for malformed payloads by @bipinks in https://github.com/laravel/framework/pull/59699
- [13.x] Port forward rate limiter fix by @paulandroshchuk in https://github.com/laravel/framework/pull/59706
- [13.x] Add debounceable queued jobs by @matthewnessworthy in https://github.com/laravel/framework/pull/59507
- [13.x] Support JSON responses for the built-in health route by @WendellAdriel in https://github.com/laravel/framework/pull/59710
- [13.x] Ensure Queue::route string defaults to queue only by @jackbayliss in https://github.com/laravel/framework/pull/59711
- [13.x] Fix failOnUnknownFields query parameter handling by @cyrodjohn in https://github.com/laravel/framework/pull/59728
- [13.x] Fix flaky QueueWorkerTest by freezing time before computing retryUntil by @bipinks in https://github.com/laravel/framework/pull/59727
- [13.x] Allow array of pivot arrays to be passed to hasAttached by @jackbayliss in https://github.com/laravel/framework/pull/59723
- [13.x] Fix TypeError in digits_between validation rule on non-string values by @sumaiazaman in https://github.com/laravel/framework/pull/59717
- [13.x] Add enum support to PasswordBrokerManager by @sumaiazaman in https://github.com/laravel/framework/pull/59714
- [13.x] Add enum support to BroadcastManager by @sumaiazaman in https://github.com/laravel/framework/pull/59713
- Change attempts column type from tiny to small integer by @ju-gow in https://github.com/laravel/framework/pull/59718
- [13.x] Get rid of useless Mockery::close by @lucasmichot in https://github.com/laravel/framework/pull/59730
- [13.x] Fix Vite CSS not loaded from nested chunk imports by @karim1999 in https://github.com/laravel/framework/pull/59662
- [13.x] Support named credential providers for SQS queue connections by @kieranbrown in https://github.com/laravel/framework/pull/59733
- [13.x] Enforce stricter assertions by @lucasmichot in https://github.com/laravel/framework/pull/59749
- [13.x] Cast to string before preg_match in decimal, max_digits, and min_digits rules by @sumaiazaman in https://github.com/laravel/framework/pull/59739
- [13.x] Ignore PHPUnit security advisory GHSA-qrr6-mg7r-m243 by @sumaiazaman in https://github.com/laravel/framework/pull/59761
- [13.x] Allow assertDatabase has & missing to accept arrays by @jackbayliss in https://github.com/laravel/framework/pull/59752
- [13.x ] Normalize Carbon by @lucasmichot in https://github.com/laravel/framework/pull/59750
- [13.x] Implement CanFlushLocks on FailoverStore by @sumaiazaman in https://github.com/laravel/framework/pull/59738
- [13.x] Validate MAC across all decryption keys by @ma32kc in https://github.com/laravel/framework/pull/59742
- [13.x] Use generic TModel in additional places in Factory class by @jnoordsij in https://github.com/laravel/framework/pull/59780
- [13.x] Ensure assertModelMissing and assertModelExists dont silently pass by @jackbayliss in https://github.com/laravel/framework/pull/59772
- [13.x] Introduce
JsonFormatterby @cosmastech in https://github.com/laravel/framework/pull/59756 - [13.x] Add prefersJsonResponses() to the application builder by @WendellAdriel in https://github.com/laravel/framework/pull/59753
- [13.x] Add support for Cloudflare Email Service by @dwightwatson in https://github.com/laravel/framework/pull/59735
- [13.x] Add enum support to NotificationChannelManager channel and driver methods by @yousefkadah in https://github.com/laravel/framework/pull/59783