안녕하세요. 이름을 바꿨습니다. 이제 미더덕이예요.
토이프로젝트에 적용해두었던 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에 포함된 내용임
[주요 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 에 대해서 알아보겠습니다!
이 게시글과 연관성이 많으니 함께 알아보실 분들은 다음 게시글도 꼭 참고해주세요~
[출처]
'백엔드 > Spring' 카테고리의 다른 글
동기인듯 동기 아닌 동기 같은 너 - 비동기 블로킹 (Spring MVC에서 Flux 사용하기 by WebClient) (0) | 2024.12.24 |
---|---|
@ResponseBody VS ResponseEntity 클래스 VS 커스텀 응답 클래스 (2) | 2024.06.25 |
WAS 내부 요청 처리를 코드로 알아보자! - 1. EndPoint 분석 (0) | 2023.12.24 |
AOP 적용 방법 5가지 정리 (프록시를 이용한 트랜잭션 AOP) (0) | 2023.12.13 |
WAS(톰캣)의 내부 구성 및 작동 과정 - 1. 초기화 단계 (0) | 2023.12.10 |
안녕하세요. 이름을 바꿨습니다. 이제 미더덕이예요.
토이프로젝트에 적용해두었던 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에 포함된 내용임
[주요 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 에 대해서 알아보겠습니다!
이 게시글과 연관성이 많으니 함께 알아보실 분들은 다음 게시글도 꼭 참고해주세요~
[출처]
'백엔드 > Spring' 카테고리의 다른 글
동기인듯 동기 아닌 동기 같은 너 - 비동기 블로킹 (Spring MVC에서 Flux 사용하기 by WebClient) (0) | 2024.12.24 |
---|---|
@ResponseBody VS ResponseEntity 클래스 VS 커스텀 응답 클래스 (2) | 2024.06.25 |
WAS 내부 요청 처리를 코드로 알아보자! - 1. EndPoint 분석 (0) | 2023.12.24 |
AOP 적용 방법 5가지 정리 (프록시를 이용한 트랜잭션 AOP) (0) | 2023.12.13 |
WAS(톰캣)의 내부 구성 및 작동 과정 - 1. 초기화 단계 (0) | 2023.12.10 |