반응형
이번에는 HTTP의 구조에 대해서 궁금증이 생겨서 알아보았다.
1. HTTP 구조를 알아보자
1-1. 헤더 (Header)
- HTTP 헤더는 요청과 응답의 메타데이터를 담고 있으며, 키-값(key-value) 쌍으로 구성된다. 헤더는 다음과 같은 정보를 포함할 수 있다.
- 일반 헤더 (General Headers)
- Cache-Control: 캐싱 동작을 제어한다.
- Connection: 컨트롤 옵션을 지정한다. (예: keep-alive, close)
- 요청 헤더 (Request Headers)
- Accept: 클라이언트가 이해할 수 있는 미디어 타입을 지정한다.
- Host: 요청 대상 서버의 도메인 이름을 지정한다.
- User-Agent: 클라이언트의 애플리케이션 타입을 지정한다.
- 응답 헤더 (Response Headers)
- Location: 리다이렉션 대상 URL을 지정한다.
- Server: 웹 서버의 소프트웨어 정보를 지정한다.
- 엔터티 헤더 (Entity Headers)
- 엔터티 헤더는 바디의 속성과 정보를 설명한다. 엔터티 헤더는 바디의 길이, 타입, 인코딩 방식 등을 정의할 수 있다.
- Content-Type: 바디의 미디어 타입을 지정한다. (예: application/json)
- Content-Length: 바디의 길이를 바이트 단위로 지정한다.
- Content-Encoding: 바디의 인코딩 방식을 지정한다. (예: gzip)
- 엔터티 헤더는 바디의 속성과 정보를 설명한다. 엔터티 헤더는 바디의 길이, 타입, 인코딩 방식 등을 정의할 수 있다.
- 일반 헤더 (General Headers)
1-2. 바디 (Body)
- 바디는 HTTP 메시지에서 실제로 전송되는 데이터 부분을 나타낸다. 이를 엔티티 바디라고도 하며, 요청과 응답 모두 바디를 가질 수 있다. 바디의 형식은 헤더의 Content-Type 필드에 지정된 미디어 타입에 따라 결정된다.
- 요청 바디 (Request Body)
- 데이터 전송: POST, PUT과 같은 메서드에서 사용되며, 서버로 데이터를 전송한다.
- 형식: JSON, XML, 폼 데이터 등 다양한 형식이 가능하다.
- 엔터티 바디: 요청 바디는 엔터티 바디의 한 형태로, 클라이언트에서 서버로 전송되는 데이터를 포함한다.
- 응답 바디 (Response Body)
- 데이터 수신: 서버로부터 클라이언트에 전송되는 데이터를 포함한다.
- 형식: HTML, JSON, 이미지, 비디오 등 다양한 미디어 타입이 가능하다.
- 엔티티 바디: 응답 바디 역시 엔티티 바디의 한 형태로, 서버에서 클라이언트로 전송되는 데이터를 포함한다.
- 데이터 수신: 서버로부터 클라이언트에 전송되는 데이터를 포함한다.
- 요약
- 바디는 HTTP 메시지의 구성 요소로, 실제로 전송되는 데이터를 포함한다. 요청 바디와 응답 바디는 각각 클라이언트에서 서버로, 서버에서 클라이언트로 전송되는 데이터를 나타내며, 이들은 엔티티 바디라는 공통 개념 아래에 속한다. 엔티티 바디의 형식은 Content-Type 헤더에 의해 결정되며, 다양한 미디어 타입을 지원한다.
- 바디는 HTTP 메시지의 구성 요소로, 실제로 전송되는 데이터를 포함한다. 요청 바디와 응답 바디는 각각 클라이언트에서 서버로, 서버에서 클라이언트로 전송되는 데이터를 나타내며, 이들은 엔티티 바디라는 공통 개념 아래에 속한다. 엔티티 바디의 형식은 Content-Type 헤더에 의해 결정되며, 다양한 미디어 타입을 지원한다.
- 요청 바디 (Request Body)
1-3. Entity body - 엔티티 바디
- 엔티티 바디의 "형태"라는 표현은 엔터티 바디가 가질 수 있는 다양한 미디어 타입을 의미한다.
- HTTP에서 엔티티 바디는 다양한 형식의 데이터를 전송할 수 있으며, 이 형식은 Content-Type 헤더에 의해 지정된다. 주로 사용되는 미디어 타입은 다음과 같다.
- text/html:
- HTML 문서를 나타낸다. 웹 페이지의 내용을 전송할 때 사용된다.
- HTML 문서를 나타낸다. 웹 페이지의 내용을 전송할 때 사용된다.
- application/json:
- JSON 형식의 데이터를 나타낸다. 웹 API와 통신할 때 주로 사용된다.
- JSON 형식의 데이터를 나타낸다. 웹 API와 통신할 때 주로 사용된다.
- text/plain:
- 일반 텍스트를 나타낸다. 단순한 텍스트 정보를 전송할 때 사용된다.
- 일반 텍스트를 나타낸다. 단순한 텍스트 정보를 전송할 때 사용된다.
- application/xml:
- XML 형식의 데이터를 나타낸다. 구조화된 데이터 전송에 사용된다.
- XML 형식의 데이터를 나타낸다. 구조화된 데이터 전송에 사용된다.
- multipart/form-data:
- 여러 부분으로 구성된 데이터를 나타낸다. 파일 업로드와 같은 형태로 사용된다.
- 여러 부분으로 구성된 데이터를 나타낸다. 파일 업로드와 같은 형태로 사용된다.
- image/png, image/jpeg 등:
- 이미지 파일을 나타낸다. 이미지 리소스를 전송할 때 사용된다.
- 이미지 파일을 나타낸다. 이미지 리소스를 전송할 때 사용된다.
- audio/mpeg, video/mp4 등:
- 오디오나 비디오 파일을 나타낸다. 멀티미디어 리소스를 전송할 때 사용된다.
- 오디오나 비디오 파일을 나타낸다. 멀티미디어 리소스를 전송할 때 사용된다.
- application/octet-stream:
- 이진 데이터를 나타낸다. 특정 형식에 얽매이지 않고 이진 파일을 전송할 때 사용된다.
- 이진 데이터를 나타낸다. 특정 형식에 얽매이지 않고 이진 파일을 전송할 때 사용된다.
- text/html:
- 이러한 미디어 타입은 클라이언트와 서버 간에 어떤 형식의 데이터가 전송되는지를 명시하며, 적절한 처리를 위해 사용된다.
2. 웹개발에 사용되는 http 요청 예시
2-1. HTTP 요청 예시
- 개발 중에 HTTP 요청을 보내는 경우, 헤더와 바디를 다음과 같이 구성할 수 있다.
2-2. 요청 헤더
- Accept: 받아들일 수 있는 컨텐츠 타입을 지정한다.
- Content-Type: 요청 바디의 미디어 타입을 지정한다.
- Authorization: 인증 토큰을 포함할 수 있다.
GET /api/users HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN_HERE
2-3. 요청 바디
- POST나 PUT 요청의 경우, 요청 바디에 데이터를 포함할 수 있다.
{
"username": "john_doe",
"email": "john@example.com"
}
2-4. HTTP 응답 예시
- 서버로부터 받는 HTTP 응답도 헤더와 바디로 구성된다.
2-5. 응답 헤더
- Content-Type: 응답 바디의 미디어 타입을 지정한다.
- Content-Length: 응답 바디의 길이를 지정한다.
- Set-Cookie: 쿠키를 설정한다.
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 123
Set-Cookie: sessionId=abc123; Path=/; Expires=Wed, 09 Jun 2021 10:18:14 GMT
2-6. 응답 바디
- 응답 바디에는 JSON과 같은 형식의 데이터가 포함될 수 있습니다.
{
"id": 42,
"username": "john_doe",
"email": "john@example.com"
}
2-7. 개발 시 유의사항
- Content-Type 일치:
- 요청과 응답의 Content-Type 헤더는 바디의 형식과 일치해야 한다.
- 인코딩:
- 헤더에 적절한 문자 인코딩을 지정해야 할 수도 있다. (예: Content-Type: text/html; charset=UTF-8)
- 보안:
- 민감한 정보는 HTTPS를 통해서만 전송해야 하며, 헤더에 직접 노출되지 않도록 주의해야 한다.
- 캐싱 제어:
- 캐싱 동작은 Cache-Control 헤더를 통해 제어할 수 있으며, 필요에 따라 적절히 설정해야 한다.
- 캐싱 동작은 Cache-Control 헤더를 통해 제어할 수 있으며, 필요에 따라 적절히 설정해야 한다.
2-8. 요약
- HTTP 헤더와 바디는 웹 개발의 핵심 요소로, 요청과 응답의 구조와 동작을 제어한다.
- 헤더는 메타데이터를 담고, 바디는 실제 데이터를 담습니다. 개발 시에는 Content-Type, 인증, 인코딩, 보안, 캐싱 등을 적절히 다루어야 한다.
3. 실제 요청/응답 예시
3-1. HTTP 요청
POST /api/login HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
{
"username": "john_doe",
"password": "secret"
}
- POST /api/login HTTP/1.1: POST 메서드를 사용하여 /api/login 엔드포인트에 요청한다.
- Host: 요청 대상 서버의 도메인을 지정한다.
- Accept: 클라이언트가 받아들일 수 있는 컨텐츠 타입을 지정한다.
- Content-Type: 요청 바디의 미디어 타입을 지정한다.
- Authorization: 인증 정보를 포함합니다. 여기서는 Basic 인증을 사용하였다.
- 요청 바디: 사용자 이름과 비밀번호를 JSON 형식으로 전송한다.
3-2. HTTP 응답
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 150
Set-Cookie: sessionId=abc123; Path=/; Expires=Wed, 09 Jun 2021 10:18:14 GMT
Cache-Control: no-cache, no-store, must-revalidate
{
"id": 42,
"username": "john_doe",
"email": "john@example.com"
}
- HTTP/1.1 200 OK: HTTP/1.1 프로토콜을 사용하여 상태 코드 200 (성공)으로 응답한다.
- Content-Type: 응답 바디의 미디어 타입을 지정한다.
- Content-Length: 응답 바디의 길이를 바이트 단위로 지정한다.
- Set-Cookie: 세션 ID를 쿠키로 설정한다.
- Cache-Control: 캐시 제어 지침을 지정한다. 여기서는 캐시를 하지 않도록 설정하였다.
- 응답 바디: 사용자 정보를 JSON 형식으로 전송한다.
4. Spring에서 http 요청/응답을 처리하는 과정
4-1. 클라이언트에서 요청 보내기
- 클라이언트는 특정 URL로 HTTP GET 요청을 보낸다.
예시: GET 요청
GET /api/users?id=42 HTTP/1.1
Host: example.com
4-2. 스프링 부트에서 요청 처리
- @RestController 내의 메서드가 요청을 받아 처리하며, ResponseEntity<>를 반환한다.
예시: 컨트롤러 메서드
@RestController
public class UserController {
@GetMapping("/api/users")
public ResponseEntity<User> getUser(@RequestParam Long id) {
User user = userService.findUserById(id);
if (user == null) {
return ResponseEntity.notFound().build(); // 404 Not Found
}
return ResponseEntity.ok(user); // 200 OK, 바디에 user 객체 포함
}
}
4-3. 응답 보내기
- ResponseEntity<>를 통해 상태 코드, 헤더, 바디 등을 설정하여 응답을 보낸다.
예시: HTTP 응답
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 42,
"username": "john_doe",
"email": "john@example.com"
}
4-4. 요약
- ResponseEntity<>를 사용하면 응답의 상태 코드와 헤더, 바디를 명시적으로 설정할 수 있다. 이를 통해 성공 응답 뿐만 아니라 오류 응답 등도 세밀하게 제어할 수 있으며, 클라이언트와의 통신을 더 유연하게 구현할 수 있다.
5. 응답에 쿠키 세팅하기
- HTTP 응답에서 쿠키를 설정할 때 사용할 수 있는 여러 옵션과 속성이 있다. 쿠키는 클라이언트에 저장되는 작은 데이터 조각으로, 서버와 클라이언트 간의 상태를 유지하는 데 사용된다. Set-Cookie 헤더를 사용하여 쿠키를 설정하며, 다음과 같은 속성을 지정할 수 있다.
- 이름과 값:
- 쿠키의 기본 구성 요소로, 이름과 값의 쌍으로 구성된다.
- 예: username=john_doe
- Expires:
- 쿠키의 만료 날짜를 지정한다. 이 날짜가 지나면 쿠키는 삭제된다.
- 예: Expires=Wed, 09 Jun 2021 10:18:14 GMT
- Max-Age:
- 쿠키의 최대 수명을 초 단위로 지정한다. 이 시간이 지나면 쿠키는 삭제된다.
- 예: Max-Age=3600 (1시간)
- Domain:
- 쿠키를 전송할 도메인을 지정한다. 이 도메인 외에는 쿠키가 전송되지 않는다.
- 예: Domain=example.com
- Path:
- 쿠키를 전송할 경로를 지정한다. 이 경로와 일치하는 요청에만 쿠키가 포함된다.
- 예: Path=/users
- Secure:
- 쿠키가 HTTPS를 통해서만 전송되도록 지정한다. 보안 연결에서만 쿠키가 사용된다.
- 예: Secure
- HttpOnly:
- 쿠키가 JavaScript에서 접근할 수 없도록 지정한다. 이를 통해 크로스 사이트 스크립팅 (XSS) 공격을 방지할 수 있다.
- 예: HttpOnly
- SameSite:
- 쿠키가 같은 사이트에서만 전송되도록 제한한다. 크로스 사이트 요청 위조 (CSRF) 공격을 방지하는 데 도움이 된다.
- 예: SameSite=Strict
5-1. 쿠키세팅 전체 예시
Set-Cookie: sessionId=abc123; Path=/; Expires=Wed, 09 Jun 2021 10:18:14 GMT; Secure; HttpOnly
- 이러한 속성을 조합하여 쿠키를 설정하면, 클라이언트와 서버 간의 상태 유지, 보안, 성능 최적화 등을 구현할 수 있습니다.
5-2. jwt 토큰 쿠키적용 예시
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
@RestController
public class AuthController {
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest, HttpServletResponse response) {
// 인증 로직 (예: 사용자 확인, 비밀번호 검증 등)
// ...
// JWT 토큰 생성
String jwtToken = generateJwtToken(loginRequest.getUsername());
// 쿠키 생성
Cookie jwtCookie = new Cookie("jwt", jwtToken);
jwtCookie.setPath("/"); // 경로 설정
jwtCookie.setHttpOnly(true); // JavaScript에서 접근 불가능
jwtCookie.setSecure(true); // HTTPS에서만 전송
jwtCookie.setMaxAge(3600); // 유효 시간 (예: 1시간)
// 응답에 쿠키 추가
response.addCookie(jwtCookie);
return ResponseEntity.ok("Login successful");
}
// JWT 토큰 생성 로직
private String generateJwtToken(String username) {
// JWT 토큰 생성 코드
// ...
return "generated-jwt-token";
}
}
- 이 코드는 로그인 요청을 처리하고, 성공한 경우 JWT 토큰을 생성하여 쿠키로 클라이언트에게 전송한다. 쿠키의 속성은 보안과 관련된 중요한 설정을 포함하고 있으며, 필요에 따라 추가 설정을 할 수 있다.
- 참고로, 실제 프로덕션 환경에서는 JWT 토큰 생성 및 관리를 위해 적절한 라이브러리를 사용하는 것이 좋다. generateJwtToken 메서드는 해당 로직을 수행하는 예시로만 제공되었다.
2023.08.13 - [Spring 기초/기초 지식] - [스프링, 스프링부트] Spring MVC - Model, ModelAndView, ModelMap
반응형
'기타 > WEB, DB, GIT' 카테고리의 다른 글
Jenkins 깃허브 훅 설정 - GitHub hook trigger for GITScm Polling 설정하기 (0) | 2023.10.26 |
---|---|
Github Access Token발급받는 방법 (2) | 2023.10.26 |
IndexedDB: CSR 데이터베이스 (0) | 2023.10.20 |
GitHub에 다른일자 잔디심기 (macOS) (1) | 2023.10.19 |
Port 8080 was already in use: tomcat 8080포트 종료하는 방법 (0) | 2023.08.16 |