java.lang.IllegalArgumentException: Request header is too large

@GetMapping("/by-ids")
List<User> getUsers(@RequestParam(name = "ids") String[] ids) {
    return List.of();
}

μœ„μ™€ 같은 GET APIλŠ” ids νŒŒλΌλ―Έν„°μ— λŒ€ν•œ 길이 μ œν•œμ„ 두지 μ•Šμ•˜μœΌλ―€λ‘œ Request header is too large 에 λŒ€ν•œ 취약점이 λ‚΄μž¬λ˜μ–΄μžˆλŠ” μƒνƒœλ‘œ λ³Ό 수 μžˆλ‹€. κ·Έλ ‡λ‹€λ©΄ 이에 λŒ€ν•œ λ¬Έμ œλŠ” μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ” 것이 μ’‹μ„κΉŒ?

첫번째, μ„œλ²„μ—μ„œ μ²˜λ¦¬ν•˜λŠ” 헀더 크기 μ‚¬μ΄μ¦ˆλ₯Ό 늘리자

기본적인 해결방법은 생각보닀 μž‘κ²Œ μ„€μ •λ˜μ–΄μžˆλŠ” 헀더 크기λ₯Ό μ–΄λŠμ •λ„ λŠ˜λ¦¬λŠ” 것이닀. λ‹€λ§Œ, μ—¬μ „νžˆ μ˜ˆμƒν•  수 μ—†λŠ” 헀더 크기λ₯Ό 컀버할 수 μ—†μœΌλ©° 이에 λŒ€ν•œ λŒ€μ‘μœΌλ‘œλŠ” GET μš”μ²­μ΄ μ•„λ‹Œ POST μš”μ²­μ„ ν™œμš©ν•΄μ•Όν•œλ‹€. μš”μ²­ 헀더 크기에 λŒ€ν•œ μ œν•œμ„ λŠ˜λ¦¬λŠ” λ°©μ•ˆμ€ μž„μ‹œ μ‘°μΉ˜μž„μ„ μžŠμ§€ 말자.

server.max-http-request-header-size: 10MB

λ‘λ²ˆμ§Έ, URL 인코딩 λ°©μ‹μ˜ 폼 데이터λ₯Ό μ „λ‹¬ν•˜μž

GET μš”μ²­ μ‹œ 쿼리 νŒŒλΌλ―Έν„°κ°€ λ„ˆλ¬΄ κΈΈμ–΄μ§ˆ 수 μžˆλ‹€λ©΄ 폼 데이터 ν˜•μ‹μœΌλ‘œ 보낼 수 μžˆλ„λ‘ POST μš”μ²­μ— λŒ€ν•΄μ„œλ„ μ§€μ›ν•˜λ©΄ λœλ‹€.

@GetMapping(path = "/by-ids")
List<User> getUsers(@RequestParam(name = "ids") String[] ids) {
    return List.of();
}

@PostMapping(path = "/by-ids", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
List<User> getUsersUsingFormData(@RequestParam(name = "ids") String[] ids) {
    return getUsers(ids);
}

μ°Έκ³ ν• λ§Œν•œ 링크