๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒท Spring/๊ฐœ๋…

[Spring] HttpEntity์™€ x-www-form-urlencoded์ด๋ž€? ํผ ์ „์†ก์‹œ ์ฝ”๋“œ ์‚ดํŽด๋ณด๊ธฐ.

by ._.sori 2025. 9. 21.

 

 

ContentType์„
x-www-form-urlencoded๋กœ
๋ช…์‹œํ–ˆ๋”๋‹ˆ,
HttpEntity์— ๋‹ด์•„ ๋ณด๋ƒˆ๋‹ค.
๋ฌด์Šจ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฑธ๊นŒ?

 

 

 

 

 

 

HttpEntity

  • ํ—ค๋”์™€ ๋ฐ”๋””๋กœ ์ด๋ค„์ง„ HTTP request, response ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด, HttpEntity๋Š” Http ์š”์ฒญ/์‘๋‹ต์˜ ํ—ค๋”+๋ฐ”๋””๋ฅผ ๋ฌถ๋Š” ์ƒ์ž์™€ ๊ฐ™์•„์„œ ํ—ค๋”์™€ ๋ฐ”๋””๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ˜•์ œ ํƒ€์ž…์œผ๋กœ๋Š” RequestEntity<T>(์š”์ฒญ์ „์šฉ, HTTP ๋ฉ”์„œ๋“œ/URL๊นŒ์ง€ ํฌํ•จ)์™€ ResponseEntity<T>(์‘๋‹ต์ „์šฉ, ์ƒํƒœ์ฝ”๋“œ๊นŒ์ง€ ํฌํ•จ)๊ฐ€ ์žˆ๋‹ค.
  • HttpEntity๋Š” ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ ์—†์œผ๋‚˜ HttpStatus์˜ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • HttpEntity๋Š” ์š”์ฒญ/์‘๋‹ต ์–‘์ชฝ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

 

 

x-www-form-urlencoded

  • html form์„ ํ†ตํ•œ POST ์ „์†ก ๋ฐฉ์‹ ์ค‘ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ContentType์ด๋‹ค.
  • ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ url ์ธ์ฝ”๋”ฉ ํ›„ ์›น ์„œ๋ฒ„์— ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €๋Š” application/x-www-form-urlencoded content-type์— ๋Œ€ํ•ด body์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ encoding ํ•˜๋„๋ก ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.
  • ๋งŒ์•ฝ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์—์„œ ํ•ด๋‹นํƒ€์ž…์œผ๋กœ POST ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋Š” body์— ๋Œ€ํ•œ ์ธ์ฝ”๋”ฉ์ด ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
  • ์ธ์ฝ”๋”ฉ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ธฐ๊ฐ€ ํฐ ๋ฐ์ดํ„ฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.
  • x-www-form-urlencoded์˜ ์ธ์ฝ”๋”ฉ ๊ทœ์น™์€ key=value ํ˜•์‹์ด๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ key-value ์Œ์€ '&'๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ „์†ก ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ฐ์ดํ„ฐ์˜ ํŠน์ˆ˜ ๋ฌธ์ž๋‚˜ ๊ณต๋ฐฑ๊ณผ ๊ฐ™์€ ๋ถ€๋ถ„์ด url ์ธ์ฝ”๋”ฉ ๊ทœ์น™[RFC1738]์— ๋”ฐ๋ผ ์ธ์ฝ”๋”ฉ ๋œ๋‹ค.

 

 

 


 

 

 

 

 

x-www-form-urlencoded์™€ HttpEntity ์ฝ”๋“œ ์˜ˆ์‹œ

HttpHeaders tokenHeaders = new HttpHeaders();
tokenHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> form = new LinkedMultiValueMap<>();
form.add("grant_type", "authorization_code");
...

HttpEntity<MultiValueMap<String, String>> tokenReq = new HttpEntity<>(form, tokenHeaders);
์œ„์˜ ์ฝ”๋“œ๋Š” ์นด์นด์˜ค ๊ฐ„ํŽธ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ ์ผ๋ถ€์ด๋‹ค.

setContentType(MediaType.APPLICATION_FORM_URLENCODED);๋ฅผ ์ ์–ด, ์—ฌ๊ธฐ์„œ Content-Type์„ x-www-form-urlencoded๋กœ ๋ช…์‹œํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰ ์ค„์„ ๋ณด๋ฉด HttpEntity๋กœ ๊ฐ์‹ผ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์™œ HttpEntity๊ฐ€ ์™€์•ผ ํ•˜๋Š” ๊ฑธ๊นŒ?

application/x-www-form-urlencoded๋Š” ํผ ํ˜•์‹์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด ํผ ํ˜•์‹์€ ๋ฐ”๋”” ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ‚ค=๊ฐ’&ํ‚ค=๊ฐ’...์œผ๋กœ URL ์ธ์ฝ”๋”ฉ ๋˜์–ด ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„์—๊ฒŒ "๋ฐ”๋””๊ฐ€ ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์–ด์š”"๋ผ๋Š” ์‚ฌ์‹ค์„ ์•Œ๋ ค์•ผ ํ•˜๋Š”๋ฐ, ์•Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด ํ—ค๋”์˜ ContentType์— "์ด ๋ฐ”๋””๋Š” ํผ ํ˜•์‹์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ์ ์–ด์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ x-www-form-urlencoded๋Š” ํ—ค๋”์™€ ๋ฐ”๋””๋ฅผ ๋‘˜ ๋‹ค ๋ณด๋‚ด๋Š” ๊ฒŒ ์ค‘์š”ํ•œ ๊ฒƒ์ด๋‹ค. (ํ—ค๋”๋กœ ํ˜•์‹์„ ์•Œ๋ฆฌ๊ณ , ๋ฐ”๋””์— ๋ฐ์ดํ„ฐ๋„ ๋ณด๋‚ด์•ผ ํ•˜๋‹ˆ๊นŒ!)

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด HttpEntity๋Š” ๋ฐ”๋””์™€ ContentType ํ—ค๋”๋ฅผ ํ•˜๋‚˜์˜ ์„ธํŠธ์ฒ˜๋Ÿผ ๋ฌถ์–ด์„œ ๋ณด๋‚ธ๋‹ค.(๋ณดํ†ต ํผ ์ „์†ก์ฒ˜๋Ÿผ ํ—ค๋”์™€ ๋ฐ”๋””๋ฅผ ํ•จ๊ป˜ ๋‹ด๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ด๊ธด ํ•˜๋‚˜, ํ—ค๋”๋‚˜ ๋ฐ”๋””๋งŒ ๋‹ด์•„๋„ ๊ฐ€๋Šฅํ•˜๋‹ค) ๊ทธ๋ž˜์„œ HttpEntity๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊น”๋”ํ•˜๊ฒŒ ๋ณด๋‚ด๊ธฐ ์œ„ํ•จ๋„ ์žˆ๊ณ , ํ—ค๋”์™€ ๋ฐ”๋””๋ฅผ ๊ฐ™์ด ๋ณด๋‚ด๊ธฐ ์œ„ํ•จ๋„ ์žˆ๋‹ค. 

+) MultiValueMap๋„ ๋น„์Šทํ•œ ์ด์œ ๋กœ  x-www-form-urlencoded์™€ ํ•จ๊ป˜ ์“ฐ์ธ๋‹ค. ์•„๊นŒ ๋ฐ”๋”” ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ํ‚ค=๊ฐ’&ํ‚ค=๊ฐ’... ์ด๋Ÿฐ ํ˜•ํƒœ๋ผ๊ณ  ํ–ˆ๋‹ค. ๊ฐ™์€ ํ‚ค์— ๋‹ค์ค‘ ๊ฐ’์ด ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ์ธ๋ฐ, ์ด๋Ÿฐ ํ˜•ํƒœ์—๋Š” MutiValueMap์ด ๋”ฑ ๋งž๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์Šคํ”„๋ง์˜ FormHttpMessageConverter๊ฐ€ MultiValueMap<String,Stirng>์„ ์ •ํ™•ํžˆ ํ‚ค=๊ฐ’&ํ‚ค=๊ฐ’... ํ˜•์‹์œผ๋กœ URL ์ธ์ฝ”๋”ฉํ•ด ์ง๋ ฌํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

 


 

 

 

์•„๋ž˜์— ์ถœ์ฒ˜๋ฅผ ๋‚จ๊ฒจ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ธ”๋กœ๊ทธ์—” ์ œ๊ฐ€ ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•œ ๋‚ด์šฉ๊นŒ์ง€๋งŒ ์ ๋Š”๊ฑฐ๋ผ
์ถœ์ฒ˜์— ๋“ค์–ด๊ฐ€์‹œ๋ฉด ๋” ๋งŽ์€ ๋‚ด์šฉ์ด ์žˆ์–ด ๊ณต๋ถ€ํ•˜์‹œ๋Š”๋ฐ ๋„์›€๋˜์‹ค๊ฒ๋‹ˆ๋‹ค.

 

๐Ÿชฝ

ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”

 

 


 

 

- HttpEntity

 

[Spring Boot] HttpEntiy, ResponseEntity ๋ž€?

[Spring Boot] HttpEntity, ResponseEntity ๋ž€? ๊ณต๋ถ€๋ฅผ ํ•˜๋˜ ์ค‘ ResponseEntity ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Controller์—์„œ View์— ์ •๋ณด๋ฅผ ์ „์†กํ•  ๋•Œ Http status, header๋ฅผ ์กฐ์ž‘ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ ๋งŒ ์•Œ๊ณ  ์‚ฌ

myeongdev.tistory.com

 

 

 

- x-www-form-urlencoded

 

x-www-form-urlencoded ํƒ€์ž…์ด๋ž€ (multipart/form-data์™€์˜ ์ฐจ์ด์ )

x-www-form-urlencoded์™€ multipart/form-data ์ฐจ์ด์  //๊ธฐ์กด์— ์„ค์ •๋œ springdoc consumes default-consumes-media-type: multipart/form-data //๋ณ€๊ฒฝ๋œ ์„ค์ • default-consumes-media-type: application/x-www-form-urlencoded ํ”„๋กœ์ ํŠธ ์ž‘์—… ์ค‘ ๋™

wildeveloperetrain.tistory.com

 

 

 

- x-www-form-urlencoded

 

[๋„คํŠธ์›Œํฌ] application/x-www-form-urlencoded, application/json ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๊ฑธ๊นŒ?

PHP ๋กœ ๋˜์–ด์žˆ๋˜ ์ฝ”๋“œ๋ฅผ JAVA ๋กœ ์ด๊ด€ํ•˜๋ฉด์„œ, Content-Type ์ด application/x-www-form-urlencoded, application/json ๋‘˜๋‹ค ์š”์ฒญ๋ฐ›์„ ์ˆ˜ ์žˆ๋˜ ์ฝ”๋“œ์—์„œ application/json ๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ๋œ ์ผ€์ด์Šค

velog.io