안녕하세요. 이름을 바꿨습니다. 이제 미더덕이예요.
 
토이프로젝트에 적용해두었던 Lucy-XSS-Servlet-Filter가 Jakarta패키지를 지원하지 않음에 따라 XSS 방지 기능을 리팩토링하는 시간을 갖게 되었습니다. 
이번 기간에 제가 부족한 부분을 많이 느껴 경험했던 이슈를 기초부터 자세히 정리하고 넘어가고자 합니다.
 
사실 이번 게시글은 XSS 방지에 대한 글이라기 보단 XSS 방지를 해결하기 위해 알아야할 선수 지식들에 대한 정리입니다.

 


[이번 주제에서 다룰 내용들]

1.  HTTP - Method & Content-Type

2. Spring Web Annotations

3. HttpServletRequestWrapper 

4. HttpMessageConverter 


 

이번 게시글에선 가장 기초가 되는 HTTP에 대해 먼저 정리해보도록 하겠습니다!

  

1. HTTP 

HTTP METHOD

GET

- Prarameter : URL의 쿼리 파라미터로 전달

- Body : 사용하지 않음

* 하지만 정확한 스펙을 살펴보자면 GET 요청의 Body는 금지되어 있는 것은 아니다. 
그러나 의미가 정의되어 있지 않아 사용하지 않는 것이 바람직하고, 스프링에서도 요청을 별도로 조작하지 않은 한 GET 요청에서의 Body를 읽을 수 없다.

 

POST

- Parameter : 사용 가능 하지만 주로 Body를 사용.

- Body : 생성 혹은 제출할 데이터로 사용

 

PUT & PATCH

- Parameter : 사용 가능 하지만 주로 URL 경로에 식별자를 담음

- Body : 업데이트할 데이터로 사용

 

DELETE

- Parameter : 사용 가능 하지만 주로 URL 경로에 식별자를 담음

- Body : 사용 가능 하지만 일반적으로 사용하진 않음

 

 

[정리] 

정리해보자면 HTTP 로 데이터를 요청 시 모든 메서드가 Parameter와 Body를 '사용은 가능하다'

하지만 대부분 주로 사용되고 권장되는 방식이 존재한다.

[주요 사용법]
GET & DELETE : Paramter만 사용
POST & PUT & PATCH : Body만 사용

 

 


HTTP Content-Type

 

Content-Type은 전송되는 Body의 데이터 형식에 대한 설명이다.

그러므로 일반적으로 GET과 DELETE 요청에 대한 Content-Type은 명시하지 않는다.

[참고] Content-Type은 표준 MIME에 포함된 내용임

더보기
더보기
더보기

[MIME]

전자 우편을 위한 인터넷 표준 포맷이다. 전자우편은 7비트 ASCII 문자를 사용하여 전송되기 때문에, 8비트 이상의 코드를 사용하는 문자나 이진 파일들은 MIME 포맷으로 변환되어 SMTP로 전송된다. 실질적으로 SMTP로 전송되는 대부분의 전자 우편은 MIME 형식이다. MIME 표준에 정의된 content types은 HTTP와 같은 통신 프로토콜에서 사용되며, 점차 그 중요성이 커지고 있다.
- 위키백과 -

 

[주요 Content-Type 정리]

1. application/json
- JSON 형식의 데이터를 전송할 때 사용.

POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "name": "John Doe",
  "email": "john@example.com",
  "age": 30
}


2. application/x-www-form-urlencoded
- HTML 폼 데이터를 URL 인코딩 형식으로 전송할 때 사용.

- 인코딩을 해야하므로 파일 같은 바이너리 데이터 전송에 적합하지 않다.

POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded

username=johndoe&password=secret


3. multipart/form-data

- 두 종류 이상의 데이터를 구분해서 함께 전송하는 것이 필요할 때 multipart/form-data 을 사용

- 주로 HTML <form> 태그로 files, non-ASCII data, binary data를 다른 타입의 데이터와 함께 전송할 때 사용됨

- 폼 데이터는 여러 파트로 나누어서 전송된다.

POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 682

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="formdata"
Content-Type: application/x-www-form-urlencoded

key1=value1&key2=value2
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg

[...이미지 바이너리 데이터...]
------WebKitFormBoundary7MA4YWxkTrZu0gW--

 

4. application/octet-stream

- 모든 이진파일의 제네릭한 타입
- 어떤 방법을 사용하여 텍스트를 해석할지 모를 때 사용

[참고] 스웨거 multipart/form-data 사용시 'application/octet-stream' is not supported'  에러

더보기
더보기
더보기

스웨거 multipart/form-data 사용 시 Content-Type 'application/octet-stream' is not supported' 이슈 존재함

- mutipart/form-data는 각각의 파트에 Content-Type을 명시해줘야 하는데 스웨거가 각 파트에 Content-Type 명시하는 것을 지원하지 않아서 발생하는 문제 (@RequestPart 사용 시 Content-Type이 null인 경우 application/octet-stream으로 임의 지정됨)

- 관련 게시글 : https://goalinnext.tistory.com/195

HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="example.zip"

(binary data here)

 

 

여기까지 우선 HTTP Method와 Content-Type을 간략 정리해보았습니다.

다음 게시글에선 Spring Web Annotations 에 대해서 알아보겠습니다! 
이 게시글과 연관성이 많으니 함께 알아보실 분들은 다음 게시글도 꼭 참고해주세요~

 

 

[출처]

https://pygmalion0220.tistory.com/entry/HTTP-Content-Type