## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-MODERNEINC-REWRITE-CVE-2026-22732
# rewrite-cve-2026-22732
CVE-2026-22732μ μ·¨μ½ν μ½λλ₯Ό νμ§νλ OpenRewrite λ μνΌμ
λλ€. μ΄λ μΈ κ°μ§ μλ΅ λ©μλ μ€ νλλ₯Ό ν΅ν΄ `Content-Length`λ₯Ό μ€μ νλ©΄ Spring Securityμ `OnCommittedResponseWrapper`λ₯Ό μ°ννλ Spring Security κ²°ν¨μ
λλ€. λνΌκ° ν€λλ₯Ό μΈμνμ§ λͺ»νλ―λ‘ `onResponseCommitted()`κ° μ€νλμ§ μκ³ , μ§μ° μΆκ°λλ 보μ ν€λ(`X-Frame-Options`, `X-Content-Type-Options`, `Cache-Control` λ±)κ° μ‘°μ©ν λλ½λ©λλ€.
## νμ§ λμ
μ·¨μ½ν Spring Security 6.4.12 + Spring Boot 3.4.3 / λ΄μ₯ Tomcatμμ νμΈλ μ€μ νΈλ¦¬κ±°λ λ€μκ³Ό κ°μ΅λλ€:
1. **λνΌλ₯Ό μ°ννλ μ€λ²λ‘λλ₯Ό ν΅ν μλΈλ¦Ώ`Content-Length`**
root@kitploit:~
response.setHeader("Content-Length", "42");
response.setIntHeader("Content-Length", 42);
response.addIntHeader("Content-Length", 42);
μ΄ μΈ κ°μ§ μ€λ²λ‘λλ `OnCommittedResponseWrapper`μμ μ¬μ μλμ§ _μμ΅λλ€_. μ΄ν λ³Έλ¬Έ μ°κΈ°κ° μ μΈλ κΈΈμ΄λ₯Ό μμ±νκ³ μ»¨ν
μ΄λλ μ§μ° ν€λ μμ±κΈ°λ₯Ό μ€ννμ§ μκ³ μ»€λ°ν©λλ€.
2. **`HttpHeaders`λ₯Ό ν΅ν WebFlux `Content-Length`**
root@kitploit:~
serverHttpResponse.getHeaders().set("Content-Length", "42");
serverHttpResponse.getHeaders().add("Content-Length", "42");
serverHttpResponse.getHeaders().setContentLength(42L);
3. **WebFlux 무쑰건μ μλ΅ μ»€λ°**
root@kitploit:~
serverHttpResponse.writeWith(Mono.just(dataBuffer));
serverHttpResponse.writeAndFlushWith(publisher);
serverHttpResponse.setComplete();
μ΄ λ μνΌλ Spring Security μ‘΄μ¬ μ¬λΆ(μ¦, `org.springframework.security.*` νμ
μ μ°Έμ‘°νμ§ μλ νμΌμμλ μ무κ²λ μΆλ ₯νμ§ μμ)μ μν₯λ°λ Spring Security λ²μ λ²μμ λ°λΌ κ²μ΄ν
λ©λλ€. 2026-03-19μ κ²μλ Spring κΆκ³ μ λ°λ₯΄λ©΄ μν₯ λ²μμ μμ λ²μ μ λ€μκ³Ό κ°μ΅λλ€:
ν΄λΉ μ리μ¦μ μμ λ²μ μ΄μ(λλ 7.0 / 6.5 μ΄νμ ν₯ν μ리μ¦)μ Spring Security λ²μ μ ν΄μνλ νλ‘μ νΈλ μν₯λ°μ§ μλ κ²μΌλ‘ μ²λ¦¬λλ©° μ±ν¬ λλ νμΌλ³ λ§μ»€λ₯Ό λ°μ§ μμ΅λλ€. λ²μ μ ν΄μν μ μλ νλ‘μ νΈλ μΌλ°μ μΈ ν¨ν΄ κΈ°λ° νμ§λ‘ ν΄λ°±λμ΄ μ€μΊλκ° λ°μ¦ν μ μλ λ°κ²¬μ λ³΄κ³ νλ μͺ½μΌλ‘ μ€λ₯λ₯Ό λ²ν©λλ€. `SpringSecurityVersionByProject` λ°μ΄ν° ν
μ΄λΈμ μ¬μ ν ν΄μλ λ²μ μ κΈ°λ‘νκ³ κ° νλ‘μ νΈλ₯Ό μν₯ μ¬λΆλ‘ νλκ·Ένλ―λ‘ νν°λ§λ λ΄μ©μ κ°μ¬ν μ μμ΅λλ€.
## μλμ μΌλ‘ νλκ·Ένμ§ μλ νλͺ©
λ€μμ μνν΄ λ³΄μ΄μ§λ§ λνΌκ° μΆμ νλ―λ‘ μλ΅μ΄ 컀λ°λκΈ° μ μ 보μ ν€λκ° μμ±λ©λλ€:
Semgrep λ°λͺ¨μ `/vuln/flush` μλν¬μΈνΈλ `flushBuffer()`κ° νΈλ¦¬κ±°λΌκ³ μ£Όμ₯νμ§λ§, μ·¨μ½ν Spring Security 6.4.12μμ μλ΅μ μ€μ λ‘ μ¬μ― κ°μ 보μ ν€λλ₯Ό λͺ¨λ λ°νν©λλ€. λ°λͺ¨μ μ€μ νΈλ¦¬κ±°λ `/vuln/stream` λ° `/vuln/content-length`μ `setIntHeader("Content-Length", ...)` νΈμΆμ
λλ€.
## νμ§
λ€μμ μ€ννμΈμ:
λ μνΌ| μ©λ
---|---
`io.moderne.recipe.cve202622732.FindSpringSecurityHeaderSuppression`| λͺ¨λ νμ§λ₯Ό μ€ννκ³ λ²μ λ³΄κ³ ν
μ΄λΈμ μΆλ ₯ν©λλ€
### κ΅¬μ± μμ (κ³ κΈ)
μμ μ§κ³κΈ°λ λ κ°μ λ μμ λ μνΌλ‘ ꡬμ±λ©λλ€. νλμ νμ§λ§ μνλ κ²½μ° κ°λ³μ μΌλ‘ νΈμΆν μ μμ΅λλ€.
## μμ
λ€μμ μ€ννμΈμ:
λ μνΌ| μ©λ
---|---
`io.moderne.recipe.cve202622732.FixSpringSecurityHeaderSuppression`| κ° νλ‘μ νΈκ° μ€μ λ‘ μ·¨ν μ μλ κ°μ₯ μ λ ΄ν μμ μ μ νν©λλ€
λ λ¨κ³λ₯Ό μμλλ‘ μ€νν©λλ€.
**1\. νλ‘μ νΈ μ체 μ리μ¦μ μμ λ²μ μΌλ‘ μ
κ·Έλ μ΄λ.** Spring Securityλ μμ λ²μ μ Maven Centralμ 6.5.9 λ° 7.0.4λ‘ κ²μνμ΅λλ€. κ° μ
κ·Έλ μ΄λλ `FindAffectedSpringSecuritySeries` μ¬μ 쑰건μ κ²μ΄ν
λ©λλ€. `UpgradeDependencyVersion`μ λμμ΄ _λ μλ‘μ΄_ λ²μ μΈμ§λ§ νμΈνκΈ° λλ¬Έμ
λλ€. 7.0.4λ‘ μ΄λνλΌκ³ μ§μνλ©΄ 5.8 νλ‘μ νΈλ₯Ό λ κ°μ λ©μ΄μ λ²μ μ κ°λ‘μ§λ¬ λκ³ κ° μ μμ΅λλ€.
**2\. 1λ¨κ³μμ μμ ν μ μλ νλͺ©μ λν΄ μ μ μ ν€λ μμ± κ΅¬μ±μ μΆκ°.** μ΄λ νλ‘μ νΈλΉ νλμ `@Configuration` ν΄λμ€λ₯Ό μμ±ν©λλ€:
root@kitploit:~
@Bean
public static BeanPostProcessor eagerHeaderWriterFilterBeanPostProcessor() {
return new BeanPostProcessor() {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof HeaderWriterFilter) {
((HeaderWriterFilter) bean).setShouldWriteHeadersEagerly(true);
}
return bean;
}
};
}
ν€λλ₯Ό 미리 μμ±νλ©΄ λνΌκ° 컀λ°μ κ΄μ°°νλμ§ μ¬λΆκ° 무μλ―Έν΄μ§λ―λ‘ νλ‘μ νΈμ _λͺ¨λ _ μ±ν¬κ° ν λ²μ λ«νλλ€. μ¬κΈ°μλ "μλ €μ§ μ ν μ¬ν"μ `Map` νλ¦μ²λΌ μ€μΌ λΆμμ΄ λλ¬ν μ μλ μ±ν¬λ ν¬ν¨λ©λλ€. `BeanPostProcessor`λ `AutowireBeanFactoryObjectPostProcessor`κ° λΉ ν©ν 리λ₯Ό ν΅ν΄ νν°λ₯Ό μ΄κΈ°ννλ―λ‘ `HttpSecurity` DSLλ‘ λΉλλ νν°λ₯Ό λ³Ό μ μμ΅λλ€. μ΄ CVEμ λν΄ λ
립μ μΌλ‘ κ²μλ λ κ°μ§ μμ μ¬νμ΄ μ νν μ΄ ννλ₯Ό μ¬μ©ν©λλ€(hmcts/idam-web-public λ° armory-ioμ Spinnaker ν¬ν¬λ λλ±ν `ObjectPostProcessor`λ₯Ό ν΅ν΄).
2λ¨κ³λ 1λ¨κ³κ° λμΈ μ μλ νλ‘μ νΈλ₯Ό λ€λ£Ήλλ€:
μν©| μ
κ·Έλ μ΄λκ° μλνμ§ μλ μ΄μ
---|---
5.7, 5.8, 6.3, 6.4| μμ μ¬νμ΄ Spring Enterprise ꡬλ
μμκ²λ§ μ κ³΅λ¨ β Maven Centralμ μμ
6.0 - 6.2| ν΄λΉ μ리μ¦μλ μμ λ²μ μ΄ κ²μλ μ μμ
κ°μ Έμ¨ BOMμΌλ‘ κ΄λ¦¬λλ λ²μ | μ
κ·Έλ μ΄λκ° νΈμ§ν λ‘컬 μ μΈμ΄ μμ
λ§μ§λ§ νμ κ°μ₯μ리 μ¬λ‘κ° μλλλ€. `nla/bamboo`λ μ€νμμ€ μμ λ²μ μ΄ _μλ_ μ리μ¦μΈ 7.0.3μ μ μ μΌλ‘ Spring Boot BOMμμ ν΄μνλ―λ‘ λ²μ νμΈλ§μΌλ‘λ λ λ¨κ³ λͺ¨λμμ 건λλ°κ³ μ·¨μ½ν μνλ‘ λ¨κ² λ©λλ€. λ°λΌμ `AddEagerHeaderWriterConfiguration`μ νλ‘μ νΈμ μ€νμμ€ μμ λ²μ μ΄ μκ³ _μ체 λ²μ μ μ μΈν_ κ²½μ°μλ§ μ
κ·Έλ μ΄λμ μμν©λλ€.
μμ±λ ν΄λμ€λ `@EnableWebSecurity` ν΄λμ€κ° μλ κ²½μ° κ·Έ μμ λ°°μΉλκ³ , μμΌλ©΄ `@SpringBootApplication`, κ·Έ λ€μμλ λͺ¨λ `@Configuration`μΌλ‘ ν΄λ°±λλ―λ‘ νμ μ»΄ν¬λνΈ μ€μΊμ΄ λλ¬νλ μμΉμ λ°°μΉλ©λλ€. μ΄λ―Έ ν€λλ₯Ό μ μ μ μΌλ‘ μμ±νλ νλ‘μ νΈλ ν¨μΉλ `OnCommittedResponseWrapper`λ₯Ό λ²€λλ§νλ νλ‘μ νΈ(jogetworkflow/jw-communityμ²λΌ)λ κ·Έλλ‘ λ‘λλ€.
### κ΅¬μ± μμ (κ³ κΈ)
λ μνΌ| μ©λ
---|---
`io.moderne.recipe.cve202622732.UpgradeSpringSecurityToPatchedVersion`| μλ¦¬μ¦ κ²μ΄ν
λ 6.5.9 / 7.0.4 μ
κ·Έλ μ΄λ
`io.moderne.recipe.cve202622732.AddEagerHeaderWriterConfiguration`| μμ±λ κ΅¬μ± μ체
`io.moderne.recipe.cve202622732.FindAffectedSpringSecuritySeries`| μν₯λ°λ μ리μ¦μ νλ‘μ νΈλ₯Ό νμν©λλ€. μ
κ·Έλ μ΄λ μ¬μ 쑰건μ
λλ€
### μ€ν μ€μΈ μλ²λ‘ κ²μ¦
μ·¨μ½ν Spring Security 6.4.12μ `semgrep/cve-2026-22732-demo`μ λ΄μ₯ Tomcatμ λμμΌλ‘ μ μ©νμ΅λλ€. ν΄λΉ `HeaderVerificationTest`λ 보μ ν€λκ° _λλ½_ λμμμ μ£Όμ₯νλ―λ‘ μλνλ μμ μ¬νμ μ΄λ₯Ό μ€ν¨νκ² λ§λλλ€:
`X-Frame-Options` λ° `Cache-Control`λ λμΌν ν¨ν΄μ λ°λ¦
λλ€.
λΉλλλ μ½νΌμ€μ 16κ° μ μ₯μ(μλ³λ 29κ° μ€)μμ μμ μ¬νμ μΈ κ°μ λν ꡬμ±μ μμ±νκ³ λλ¨Έμ§λ μ¬λ°λ₯΄κ² κ·Έλλ‘ λμμ΅λλ€:
μΈ κ°μ ν¨μΉλ μ μ₯μμ μμ μ¬νμ λ€μ μ€ννλ©΄ μΆκ° μμ±μ΄ μμΌλ―λ‘ μμ μ μ€μ νλ‘μ νΈμμ μ체 μΆλ ₯μ λν΄ λ©±λ±μ μ
λλ€.
λ λ²μ§Έ λ λμ μ½νΌμ€λ μμ μ¬νμ΄ μ€μ λ‘ λ€λ£¨λ λͺ¨μ§λ¨(μ±ν¬κ° νμ μμΌλ―λ‘ μν₯λ°λ λͺ¨λ μλΈλ¦Ώ Spring Security μ ν리μΌμ΄μ
)μ λμμΌλ‘ ν©λλ€. μ½λ κ²μμΌλ‘ μ°Ύμ 64κ° νλ‘μ νΈ μ€ 52κ°κ° λΉλλμκ³ , 48κ°κ° μν₯λ°λ λ²μ μ ν΄μνμΌλ©°, **38κ°κ° ν¨μΉλμκ³ κ·Έμ€ 35κ°κ° μ»΄νμΌλ©λλ€**(λλ¨Έμ§ 3κ°λ μμ±λ νμΌ μμ΄λ λμΌνκ² μ€ν¨). Spring Security 5.2 λ―Έλ§μ 8κ° νλ‘μ νΈλ λͺ¨λ μ¬λ°λ₯΄κ² 건λλ°μμ΅λλ€. `SUSCEPTIBLE-REPOSITORIES.md` μΉμ
8μ μ°Έμ‘°νμΈμ.
### μ ν μ¬ν
* **WebFlux νμ§λ μ΄ CVEκ° μλ λ€λ₯Έ μνμ
λλ€.** `OnCommittedResponseWrapper extends jakarta.servlet.http.HttpServletResponseWrapper`μ΄λ―λ‘ CVE-2026-22732λ μλΈλ¦Ώ μ μ©μ΄λ©° 리μ‘ν°λΈ μ ν리μΌμ΄μ
μ μ΄μ λ
ΈμΆλμ§ μμ΅λλ€. `FindHttpResponseContentLengthOrFlushBuffer`μ λ°κ²¬μ μ μ¬ν 리μ‘ν°λΈ ν¨ν΄μ νλκ·Ένλ©° μ¬μ ν μλ κ²ν κ° νμνμ§λ§ μμ μ¬νμ μλμ μΌλ‘ μ΄μ λν΄ μ‘°μΉνμ§ μμ΅λλ€. `AddEagerHeaderWriterConfiguration`μ λ€μ μλΈλ¦Ώ API μμ΄ `HeaderWriterFilter`λ₯Ό λ³Ό μ μλ λͺ¨λ λͺ¨λμ 건λλλλ€. νν°λ `OncePerRequestFilter`λ₯Ό νμ₯νκ³ `spring-security-web`μ μλΈλ¦Ώ APIλ₯Ό λΉμ μ΄μ `provided` μ’
μμ±μΌλ‘ ν¬ν¨νλ―λ‘ κ±°κΈ°μ μμ±νλ©΄ `cannot access jakarta.servlet.Filter`λ‘ μ€ν¨ν©λλ€(`apache/shenyu`μμ κ΄μ°°λ¨).
* **Spring Security 5.2 λ―Έλ§ λ²μ μ νμ§λμ§λ§ μμ λμ§ μμ΅λλ€.** `HeaderWriterFilter.setShouldWriteHeadersEagerly`λ 5.2μμ λμ
λ©λλ€. 4.0.4μμ νν°μλ μμ±μμ `doFilterInternal`λ§ μμ΅λλ€. νμ§λ μ¬μ ν EOL λ²μ μ λ³΄κ³ νμ§λ§ μ»΄νμΌν μ μλ νΈμΆμ μΆλ ₯νλ λμ μμ μ΄ λ³΄λ₯λ©λλ€.
## λ°μ΄ν° ν
μ΄λΈ
ν
μ΄λΈ| ν
---|---
`TaintFlowTable` (`rewrite-program-analysis`μμ)| Content-Length ν€λ μ€μΌ μ μ€λΉ ν ν
`HttpResponseDirectCommitTable`| WebFlux ꡬ쑰μ μ μ€λΉ ν ν
`SpringSecurityVersionByProject`| νμ§λ Spring Security λ²μ μ΄ μλ νλ‘μ νΈλΉ ν ν
## μ€ν
Moderne CLIλ₯Ό ν΅ν΄:
root@kitploit:~
mod run . --recipe io.moderne.recipe.cve202622732.FindSpringSecurityHeaderSuppression
`rewrite.yml`μ ν΅ν΄:
root@kitploit:~
---
type: specs.openrewrite.org/v1beta/recipe
name: com.example.DetectSpringSecurityHeaderSuppression
displayName: Detect CVE-2026-22732
recipeList:
- io.moderne.recipe.cve202622732.FindSpringSecurityHeaderSuppression
## νκ° μ½νΌμ€ μ¬ν
`repos.csv`λ μ΄ λ μνΌκ° κ°λ°λκ³ μΈ‘μ λ 75κ°μ κ³΅κ° μ μ₯μλ₯Ό κ°κ° νκ°λ μ νν 컀λ°μ κ³ μ νμ¬ λμ΄ν©λλ€. μ¬λ¬ μ μ₯μλ νλ°ν μ μ§ κ΄λ¦¬λλ©° μ
μ€νΈλ¦Όμμ ν¨μΉλ μμ μ΄λ―λ‘ `changeset` μ΄μ΄ μλ μ«μλ₯Ό λ¨μν κ·Έλ΄λ―νκ² λ§λλ κ²μ΄ μλλΌ μ¬ν κ°λ₯νκ² λ§λλλ€.
root@kitploit:~
mod git sync csv ./corpus repos.csv --with-sources
mod build ./corpus
mod run ./corpus --recipe=io.moderne.recipe.cve202622732.CveDevCenter
mod devcenter ./corpus --last-recipe-run
λκΈ°νλ μ½ 20μ΄μ 1.4GBκ° κ±Έλ¦¬κ³ , λΉλλ μ½ 15λΆμ΄ 걸리며 μ μΌνκ² λλ¦° λ¨κ³μ
λλ€. `mod devcenter`λ `corpus/.moderne/run/<runId>/`μ `devcenter.html`μ μμ±νκ³ μ‘°μ§ νμ λλ ν°λ¦¬λΉ νλμ© μΆκ°λ‘ μμ±ν©λλ€.
`org1` μ΄μ κ° μ μ₯μκ° μ‘΄μ¬νλ μ΄μ λ₯Ό λ°μνλ κ·Έλ£ΉμΌλ‘ μ½νΌμ€λ₯Ό λΆν ν©λλ€. λ κ°μ§ μ·¨μ½ν νΈμΆ ννμ λν `Servlet Sinks` λ° `WebFlux Sinks`, μ΄λ―Έ μ
μ€νΈλ¦Όμμ μμ λ μ μ₯μμ λν `Patched`, Spring Security μ체 λ° κΈ°ν λΉμλΉμμ λν `Reference`, μ€ν μ€μΈ μλ²μ λν΄ νμΈλ μ¬λ‘μ λν `Verified`, λΉλ λꡬ λ²μμ λν `Gradle`, λλ μνμ λν `Wide`μ
λλ€.
κ³ μ λ 컀λ°μμ κΈ°λν μ μλ κ²°κ³Ό:
| κ²°κ³Ό
---|---
μ
κ·Έλ μ΄λ μΉ΄λ| λ©μ΄μ 39, λ§μ΄λ 21, ν¨μΉ 6, μλ£ 4 (μ μ₯μ 70κ°)
보μ μΉ΄λ| λ
ΈμΆλ μ μ₯μ 65κ°
ν΄λΉ μμ| Spring Security μ’
μμ±μ ν΄μνμ§ μλ μ μ₯μ 5κ°
κ·Έ λ€μ― κ° μ€ λ€ κ°λ μ€μ λ‘ Spring Securityλ₯Ό μ¬μ©νμ§ μμ΅λλ€. `spring-projects/spring-security`λ λΌμ΄λΈλ¬λ¦¬ μ체μ΄κ³ , `JoeyBling/bootplus`λ Apache Shiroλ₯Ό μ¬μ©νλ©°, `jenkinsci/stapler`λ μλΈλ¦Ώ APIλ₯Ό μ§μ λμμΌλ‘ νκ³ , `infofabrik/reportserver`μλ ν΄μν Maven λλ Gradle λΉλκ° μμ΅λλ€. λ€μ― λ²μ§ΈμΈ `xtuer/template-app`μ `spring-security-web:5.0.0.RELEASE`λ₯Ό μ μΈνμ§λ§ ν΄λΉ Gradle λΉλλ `mod build` μ€μ μ’
μμ±μ μ ν ν΄μνμ§ μμΌλ―λ‘ μ΄λ€ λ μνΌλ λ²μ μ λ³Ό μ μμ΅λλ€. μν₯λ°μ§ μλ κ²μ΄ μλλΌ μΈ‘μ λμ§ μμ κ²μΌλ‘ μ·¨κΈνμΈμ.
μμ μ¬νμ μ μ©νκ³ κ²°κ³Όλ₯Ό νμΈνλ €λ©΄:
root@kitploit:~
mod run ./corpus --recipe=io.moderne.recipe.cve202622732.FixSpringSecurityHeaderSuppression
mod git apply ./corpus --last-recipe-run
mod exec ./corpus --last-recipe-run MODERNE_BUILD_TOOL_CHECK
`mod git apply`λ 체ν¬μμμ μ§μ μμ±ν©λλ€. μ½νΌμ€ μ 체μ λν μ 체 `check`λ λ리며 μ΄ λ³κ²½κ³Ό 무κ΄ν μ€ν¨(λλ½λ JDK ν΄μ²΄μΈ, λλ¬ν μ μλ μ’
μμ± μ μ₯μ, μ΄λ―Έ λΉ¨κ° ν
μ€νΈ)λ₯Ό νλ©΄ννλ―λ‘ μλ―Έ μλ μ νΈλ μ μ© μ μ λμΌν λͺ
λ Ήμ μ€νν κ²κ³Όμ λΈνμ
λλ€.
## 리ν°λ΄ λ°λͺ¨ μ΄μμΌλ‘ λ€λ£¨λ λ΄μ©
`rewrite-program-analysis`μ μ€μΌ λΆμμ λ‘컬 λ°μ΄ν° νλ¦κ³Ό λ©μλλ³ μμ½μ μ²λ¦¬νλ―λ‘ λ€μ ν¨ν΄μ΄ μλμΌλ‘ νμ§λ©λλ€:
* **μμ μ νλ Content-Length ν€λ μ΄λ¦.** `String h = "Content-Length"; response.setIntHeader(h, 42);`κ° νλκ·Έλ©λλ€. νλ μμν¬κ° λ‘컬 ν λΉμ ν΅ν΄ 리ν°λ΄ μ€μΌμ μΆμ ν©λλ€.
* **νΈμΆμ λννλ ν¬νΌ** β λ©μλ μμ½μ ν΅ν΄ λ°ν κ°μ ν΅ν΄ μ€μΌμ΄ νλ¦
λλ€.
## μλ €μ§ μ ν μ¬ν
* **μ λ€λ¦ 컨ν
μ΄λ νμ
μ ν΅ν νλ¦**(`Map`, `List`, μ¬μ©μ μ μ 컬λ μ
). `stash.put("k", "Content-Length")` λ€μμ `response.setIntHeader(stash.get("k"), 42)`κ° μ€λ κ²½μ°λ νμ§λμ§ μμ΅λλ€. put/getμ λμΌμ±μ λΆμμ λΆν¬λͺ
ν©λλ€.
## λΌμ΄μ μ€
Moderne λ
μ . μμ
κ³μ½ 쑰건μ λ°λΌ Moderne κ³ κ°λ§ μ¬μ©ν μ μμ΅λλ€.