Laravel 13.31.0 업데이트
릴리스: 2026년 9월 8일
평가: 2026년 9월 8일
13.31.0은 다수의 버그 수정과 소규모 기능 추가가 포함된 정기 마이너 릴리스입니다. 인증 쿠키 검증, Redis 큐 드라이버 클러스터 안전성, Eloquent pivot 관련 수정 등 실사용 중 발견된 결함들이 다수 패치되어, 관련 기능을 사용 중이라면 업그레이드가 권장되지만 즉각적인 코드 변경이 강제되는 breaking change는 명시되어 있지 않습니다.
패키지 관리자가 확인할 것
- Http (illuminate/http)위험도 낮음
Http Client의 메모리 누수 수정(#61438)이 포함되어 있어, 장기 실행 프로세스(큐 워커, Octane 등)에서 대량의 HTTP 요청을 보내는 경우 개선을 체감할 수 있습니다. 별도 코드 변경은 불필요합니다.
- Scout (laravel/scout)위험도 낮음
Eloquent lazy()/lazyById()가 limit()/offset()을 무시하던 버그(#61402)가 수정되어, Scout 내부에서 이를 활용하는 커스텀 임포트 로직이 있다면 동작이 달라질 수 있으니 결과 건수를 확인해볼 것을 권장합니다.
대응 체크리스트
- Redis 큐 클러스터 사용 시 업그레이드 검토가까운 시일
Redis 큐 드라이버의 bulk() 및 allQueueNames()가 클러스터 환경에서 안전하지 않던 문제가 수정되었습니다(#61198). Redis 클러스터 위에서 큐를 운영 중이라면 업그레이드를 권장합니다.
- RateLimited 큐 미들웨어 동작 확인가까운 시일
RateLimited job middleware가 제한에 도달해도 작업을 차단하지 않던 버그가 수정되었습니다(#61449). 이 미들웨어를 사용 중이라면 업그레이드 후 실제로 제한이 적용되는지 확인하세요.
- 커스텀 세션 핸들러 점검선택
ArraySessionHandler가 PHP 9.0에서 요구될 create_sid() 메서드가 없어 수정되었습니다(#61469). SessionHandlerInterface를 직접 구현한 커스텀 핸들러가 있다면 동일하게 create_sid()를 구현했는지 점검하세요.
- 쿠키 기반 리콜러 인증 로직 확인가까운 시일
저장된 쿠키의 비밀번호 해시를 인증 전에 검증하도록 수정되었고(#61386), recaller가 매칭되는 사용자가 없을 때 발생하던 TypeError도 수정되었습니다(#61397). 'remember me' 로그인 기능을 사용 중이라면 업그레이드 후 정상 동작을 확인하세요.
자동 생성상세 평가
요약
13.31.0은 breaking change 없이 다수의 버그 수정과 소규모 기능 추가로 구성된 정기 마이너 릴리스입니다. 인증, 큐, Eloquent, Http Client 등 여러 영역에서 실사용 중 발견된 결함이 패치되었습니다.
주요 변경
- 인증: 저장된 쿠키의 비밀번호 해시를 검증 후 인증하도록 수정, recaller 미매칭 시 TypeError 수정 (#61386, #61397)
- 큐: Redis 큐 드라이버 클러스터 안전성 개선(bulk MULTI, allQueueNames KEYS 사용), RateLimited 미들웨어가 제한을 무시하던 버그 수정, JobInterrupted 이벤트 추가, Queue에 totalSize() 메서드 추가 (#61198, #61449, #61412, #61373)
- Eloquent: lazy()/lazyById()가 limit()/offset()을 무시하던 버그 수정, BelongsToMany pivot 모델 chaperone 지원 추가, wherePivot() 클로저 스코프 무시 버그 수정, soft delete 컬럼에 테이블 별칭 적용 (#61402, #61152, #61488, #61456)
- Http Client 메모리 누수 수정 (#61438)
- 세션: ArraySessionHandler에 PHP 9.0 대비 create_sid() 메서드 추가 (#61469)
- 라우트 캐싱 시 컨테이너 인스턴스 복원 문제 수정, 특정 상황의 라우트 URL 생성 버그 수정 (#61405, #61475)
하위 호환성
릴리스 노트에 공개 API의 시그니처 변경이나 문서화된 동작의 breaking change는 명시되어 있지 않습니다. 다만 버그 수정 성격상 이전에 잘못 동작하던 기능(RateLimited 미들웨어, lazy()/lazyById() limit 처리 등)에 의존해 우회 코드를 작성한 경우 동작 차이를 체감할 수 있습니다.
패키지 관리자가 확인할 것
- illuminate/http: Http Client 메모리 누수 수정으로 장기 실행 프로세스에서 이점이 있으나 코드 변경 불필요
- laravel/scout: lazy()/lazyById() limit/offset 수정이 임포트 로직에 영향을 줄 수 있어 결과 건수 확인 권장
- 그 외 등록된 패키지(Socialite, Sanctum류 관련 없음)에는 직접적인 언급이 없습니다
대응 체크리스트
- Redis 클러스터로 큐를 운영 중이면 업그레이드 검토
- RateLimited 큐 미들웨어 사용 시 업그레이드 후 제한 동작 재확인
- 커스텀 SessionHandlerInterface 구현체에 create_sid() 존재 여부 점검
- 'remember me' 쿠키 인증 플로우 업그레이드 후 회귀 테스트
- 특별한 이슈가 없다면 일반 마이너 업그레이드로 진행 가능
GitHub 릴리스 노트를 근거로 언어 모델 (claude-sonnet-5)이 작성했으며, 사람이 검수하지 않았습니다. 실제 적용 전에는 공식 릴리스 노트와 업그레이드 가이드를 함께 확인하세요.
GitHub 원문 릴리스 노트 보기
- [12.x] Ensure password hash matches stored cookie before authenticating the user by @crynobone in https://github.com/laravel/framework/pull/61386
- [12.x] Fix TypeError in userFromRecaller() when the recaller matches no user by @lazerg in https://github.com/laravel/framework/pull/61397
- [13.x] Add totalSize method to Queue by @jackbayliss in https://github.com/laravel/framework/pull/61373
- Merge branch '12.x' into 13.x by @crynobone in https://github.com/laravel/framework/pull/61399
- [13.x] Restore the container instance after route:cache boots a fresh application by @lazerg in https://github.com/laravel/framework/pull/61405
- [13.x] Include connection and queue on WorkerStopping when worker is killed by @jackbayliss in https://github.com/laravel/framework/pull/61408
- [13.x] Fix lazy() and lazyById() ignoring limit() and offset() by @xurshudyan in https://github.com/laravel/framework/pull/61402
- [13.x]
JobInterruptedevent by @jackbayliss in https://github.com/laravel/framework/pull/61412 - [13.x] Make the Redis queue driver cluster-safe (
bulk()node-lessMULTI;allQueueNames()usesKEYS) by @Orrison in https://github.com/laravel/framework/pull/61198 - [13.x] feat: add chaperone support for BelongsToMany pivot models by @calebdw in https://github.com/laravel/framework/pull/61152
- Dedupe common test fixtures by @jasonmccreary in https://github.com/laravel/framework/pull/61422
- [13.x] feat: improve higher order proxy generic types by @calebdw in https://github.com/laravel/framework/pull/61418
- Apply fixes from StyleCI by @taylorotwell in https://github.com/laravel/framework/pull/61427
- [13.x] Add
onceassertions to the mail and notification fakes by @talaridisTh in https://github.com/laravel/framework/pull/61415 - Let Monolog handle deprecation exceptions by @sysdev34-wq in https://github.com/laravel/framework/pull/61414
- [13.x] Default
memoryExceededExitCodefor Cloud by @jackbayliss in https://github.com/laravel/framework/pull/61430 - [13.x] Fix context not being propagated to concurrent processes by @newtonjob in https://github.com/laravel/framework/pull/61419
- [13.x] Remove the unused Request import from the JSON:API resource stub by @Bosun18 in https://github.com/laravel/framework/pull/61434
- [13.x] Memory leak fix in Http Client by @skr4dan in https://github.com/laravel/framework/pull/61438
- [13.x] Fix SelfBuilding build stack cleanup after exceptions by @emrebalasar in https://github.com/laravel/framework/pull/61454
- [13.x] defer all logic to the dedicated rule by @browner12 in https://github.com/laravel/framework/pull/61445
- Wrap the closure return type in
withFreshQueryLog()by @SanderMuller in https://github.com/laravel/framework/pull/61444 - [13.x] Fix
assertJsonMissingPath()ignoring wildcards by @xurshudyan in https://github.com/laravel/framework/pull/61441 - [13.x] Resolve the
UsePolicyattribute from parent classes by @xurshudyan in https://github.com/laravel/framework/pull/61439 - [13.x] Resolve the
UseEloquentBuilderattribute from parent classes by @xurshudyan in https://github.com/laravel/framework/pull/61440 - [13.x] Fix parameter docblocks that contradict the native signature by @dfinchenko in https://github.com/laravel/framework/pull/61457
- Bump softprops/action-gh-release from 3.0.2 to 3.0.3 in the github-actions group by @dependabot[bot] in https://github.com/laravel/framework/pull/61468
- [13.x] Fix RateLimited job middleware hitting limits that did not block the job by @xurshudyan in https://github.com/laravel/framework/pull/61449
- [13.x] Add
devServerUrl()to Vite by @ramonmalcolm10 in https://github.com/laravel/framework/pull/61465 - [13.x] Retry phpredis commands when a connection reset surfaces as a warning by @Orrison in https://github.com/laravel/framework/pull/61462
- [13.x] Fix callbacks deferred from within a deferred callback by @newtonjob in https://github.com/laravel/framework/pull/61431
- [13.x] Propagate command_retries to phpredis cluster connections by @Orrison in https://github.com/laravel/framework/pull/61460
- [13.x] Qualify soft delete column with the query's table alias by @arunarw in https://github.com/laravel/framework/pull/61456
- [13.x] Keep Eloquent on the direct connection during migrations by @danielebarbaro in https://github.com/laravel/framework/pull/61435
- Apply fixes from StyleCI by @taylorotwell in https://github.com/laravel/framework/pull/61470
- [13.x] Fix Class
Illuminate\Session\ArraySessionHandlerimplementingSessionHandlerInterfaceis missing thecreate_sid()method which will be required in PHP 9.0 by @crynobone in https://github.com/laravel/framework/pull/61469 - Fix route url generation under certain circumstances by @taylorotwell in https://github.com/laravel/framework/pull/61475
- [13.x] Fix message ID and header persistence on ResendTransport by @saurabhsharma2u in https://github.com/laravel/framework/pull/61476
- [13.x] Fix wherePivot() closure scope being ignored in pivot table operations by @iz-ahmad in https://github.com/laravel/framework/pull/61488