728x90

이번엔 캐시에 대해서 더 자세히 배운다.

 

저번 시간에 캐시에 대해 대충은 공부를 했을 것이다.

캐시가 없을 때는 헤더와 바디에 해당하는 내용을 몇번이고 다시 전송해야 한다.

인터넷 네트워크가 메모리와 디스크에 비해 느리기 때문에 사용자가 기다리는 시간이 길어진다.

 

여기에 캐시를 추가해보자.

이렇게 캐시를 추가하면 캐시가 유효한 60초 동안은 HTTP 바디에 해당하는 부분은 전송할 필요가 없다.

그렇게 되면 사용자가 기다리는 시간이 훨씬 줄어들게 된다.

 

근데 만약 60초의 시간이 지나간 후에는 어떻게 될까?

당연히 서버에서 데이터를 다시 조회하고 캐시를 갱신해야 할 것 같다.

하지만 서버에서도 데이터가 변하지 않았다면 굳이 캐시를 갱신해야할까?

 

  • 캐시 시간 초과

캐시 만료후에도 서버에서 데이터를 변경하지 않았다면, 저장해두었던 캐시를 재사용 할 수 있을 것이다.

하지만 서버에서 데이터가 변하지 않았다고 확인을 받아야 할 것이다.

 

그 방법에 대해 살펴보자.

이렇게 HTTP 헤더에 그 데이터가 마지막으로 수정된 시각을 포함해서 보낸다.

 

그리고 그 다음에 GET으로 조회를 한다면 요청에 마지막 수정된 시각을 포함해서 확인을 받는다.

만약 서버에서 확인을 한 후 변동이 없다면 304로 데이터가 수정되지 않았음을 알리고 해당 캐시데이터를 재사용한다.

 

이렇게 하면 데이터가 상대적으로 작은 헤더끼리만 보내도 데이터를 사용할 수 있어 매우 실용적인 해결책이다.

 

이 방법도 굉장히 좋지만 여기에 추가로, 같은 데이터를 수정해서 데이터는 같지만 수정된 날짜만 다른 경우도 생각을 해보자.

이런 경우 캐시를 사용하면 되지만, 서버에서는 용량이 상대적으로 큰 데이터를 전송해주게 될 것이다.

 

그렇기에 ETag라는 검증 헤더를 추가하게 된다.

ETag(Entity Tag)는 캐시용 데이터에 고유한 이름을 달아두고, 데이터가 변경될 때마다 이 이름을 바꾼다.

그냥 서버에서 ETag를 확인하고 현재 데이터의 ETag와 같으면 캐시를 사용하고, 다르면 HTTP 바디 내용을 재전송하는 간단한 방식이다.

위에 방법처럼 서버에서 응답할 때 ETag를 같이 캐시에 저장한 후

다시 클라이언트에서 요청할 경우 ETag를 같이 확인 받는 방법이다.

이렇게 캐시를 확인 받을 수 있다.

 

  • 캐시와 조건부 요청 헤더

Cache-Control

- Cache-Control: max-age

캐시 유효 시간(초)

- Cache-Control: no-cache

데이터는 캐시해도 되지만, 항상 origin 서버에 검증한 후에 사용

- Cache-ControlL no-store

데이터를 저장하면 안됨

 

Validator(검증 헤더)

- ETag

위에 보았듯이 ETag를 확인

- Last-Modified

마지막 수정시간을 확인

 

조건부 요청 헤더

- If-Match, If-None-Match

ETag를 확인하여 조건부로 HTTP 메시지 바디까지 전송 요청

- If-Modified-Since, If-Unmodified-Since

Last-Modified를 확인하여 조건부로 HTTP 메시지 바디까지 전송 요청

 

  • 캐시 무효화

Cache-Control: no-cache, no-store, must-revalidate를 사용한다.

 

- Cache-Control: no-cache

데이터는 캐시해도 되지만, 항상 Origin 서버에 검증하고 사용

- Cache-Control: no-store

데이터를 저장하면 안됨

- Cache-Control: must-revalidate

Origin 서버 접근 실패시 반드시 오류가 발생

'백엔드 > HTTP' 카테고리의 다른 글

HTTP 7일차  (0) 2023.03.10
HTTP 6일차  (0) 2023.03.09
HTTP 5일차  (1) 2023.03.09
HTTP 4일차  (0) 2023.03.08
HTTP 3일차  (0) 2023.03.06
728x90

HTTP 헤더에 대해서 공부하자.

 

HTTP 헤더는 지금까지 나왔겠지만

해당 부분들을 말한다.

HTTP 헤더는 HTTP 전송에 필요한 모든 부가정보를 담고 있다.

 

헤더는 데이터를 해석할 수 있는 정보를 제공하게 되었다. (데이터 유형, 데이터 길이...)

 

Content-Type

표현 데이터의 형식을 담고 있다.

예로는 text/html; charset=utf-8, application/json 등이 있다.

 

Content-Encoding

표현 데이터를 압축하기 위해 사용한다.

데이터를 전달하는 곳에서 압축 후 인코딩 헤더를 추가한다.

예로는 gzip, deflate 등이 있다.

 

Content-Language

표현 데이터의 언어를 표현한다.

예로는 ko, en 등이 있다.

 

Content-Length

표현 데이터의 길이를 표현한다.

데이터는 바이트 단위로 표현한다.

 

  • 콘텐츠 협상

클라이언트는 서버에 원하는 표현을 요청할 수 있다.

이 협상 헤더는 요청 시에만 사용할 수 있다.

 

Accept: 클라이언트가 선호하는 미디어 타입을 전달

Accept - Charset: 클라이언트가 선호하는 문자 인코딩을 전달

Accept - Encoding: 클라이언트가 선호하는 압축 인코딩을 전달

Accept - Language: 클라이언트가 선호하는 자연 언어를 전달

 

하나의 표현만 요청하는 것이 아니라 여러 개의 값들을 우선순위로 지정해 요청할 수 있다.

0 ~ 1의 값을 사용하며 클수록 높은 우선순위를 가진다. (생략하면 1)

GET /page
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.8

이런 식으로 사용한다.

 

그리고 당연히 늘 그렇듯이 더 구체적인 코드를 우선한다.

GET /page
Accept: text/*, text/plain, */*

이렇게 되어 있다면

1. text/plain

2. text/*

3. */*

이 우선순위로 따라가게 된다.

 

  • 전송 방식

전송 방식으로는 단순 전송, 압축 전송, 분할 전송, 범위 전송 4가지가 있다.

 

단순 전송

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3456

<html>
	<body>...</body>
</html>

그냥 단순하게 이런 코드를 전송하는 것이다.

Content-Length를 적어주어야 한다.

 

압축 전송

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Encoding: gzip
Content-Length: 521

asdfasdfgh42523yhshadsgaasdfds...

말 그대로 압축해서 보내는 것이다.

압축을 했기 때문에 Content-Encoding으로 어떻게 압축했는지 알려주어야 한다.

 

분할 전송

HTTP/1.1 200 OK
Content-Type: text
Transfer-Encoding: chunked

2
My
4
Name
2
is
2
sk

이렇게 하나의 데이터를 보낼 때마다 바이트 수와 분할해서 보내는 것이다.

처음부터 Content-Length로 바이트 수를 알려주면 안 된다.

 

범위 전송

클라이언트가 특정 범위를 요청할 때 보내는 방법으로

만약 클라이언트가

GET /page
Range: bytes=501-1000

이런 요청을 보냈다면 그 범위에 맞게

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Range: byes 501-1000/1000

adsfsdafasdfasdfahsdfn

해당 범위의 데이터만 응답으로 보내는 것이다.

 

  • 일반 정보

그냥 일반 정보로는

Form: 유저의 이메일 정보

Referer: 이전 웹 페이지 주소

User-Agent: 유저 에이전트 애플리케이션 정보

Server: 요청을 처리하는 origin 서버의 소프트웨어 정보

Date: 메시지가 생성된 날짜

가 있다.

 

From

요청에서 사용하며, 검색 엔진들이 주로 사용한다.

일반적으로는 많이 사용하지 않는다.

 

Referer

현재 요청된 페이지의 이전 웹 페이지 주소이며, 요청에서 사용한다.

Referer를 사용해서 유입 경로를 분석한다.

 

User-Agent

클라이언트의 애플리케이션 정보이며, 요청에서 사용한다.

어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능하다.

 

Server

서버의 소프트웨어 정보로, 응답에서 사용한다.

 

Date

메시지가 발생한 날짜와 시간으로, 응답에서 사용한다.

 

  • 특별한 정보

Host: 요청한 호스트 정보

Location: 페이지 리다이렉션

Allow: 허용 가능한 HTTP 메서드

Retry-After: 유저가 다음 요청을 하기까지 기다려야 하는 시간

 

특별한 헤더로는 이렇게 있으며, 공통부분이 없으니 그냥 하나씩 바로 알아보자.

 

Host

요청한 호스트 정보를 적어주어야 해당 서버의 어떤 도메인으로 접근할 것인지를 알 수 있다.

 

Location

페이지 리다이렉션으로 웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, 그 위치로 자동 이동한다.

 

Allow

허용 가능한 HTTP 메서드를 알려주며, 메서드 오류인 405(Method Not Allowed) 응답에 포함되어야 한다.

 

Retry-After

요청을 처리할 수 있는 시간을 알려주며, 503(Service Unavailable)에 포함한다.

Retry-After: Sat, 4 Dec 1999 10:12:56 GMT

 

  • 쿠키

쿠키가 무엇인지는 저번 JSP 공부에서 배웠을 것이다.

만약 쿠키를 사용하지 않는다면 로그인 후 해당 도메인의 다른 페이지에 접근할 때 서버에서 유저를 기억하지 못할 것이다.

클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어지고, 서버는 이전 요청을 기억하지 못한다.

 

그렇다고 모든 GET에 사용자의 정보를 쿼리를 넘길 수도 없을 것이다.

 

그렇기 때문에 클라이언트에 쿠키를 남긴다.

이렇게 Set-Cookie로 쿠키를 저장하고 나면 쿠키 저장소에서 조회해가며 Cookie를 이용해 헤더에 추가한다.

 

쿠키는 네트워크 트래픽을 추가로 유발하기 때문에 최소한의 정보만 사용하는 것이 좋다.

보안에 민감한 데이터는 저장하면 안된다.

 

Expries, max-age로 쿠키의 생명 주기를 설정할 수 있다.

Set-Cookie: expires=Sat, 4-Dec-1999 10:19:21 GMT

만료일이 되면 쿠키를 삭제한다.

 

Set-Cookie: max-age=3600

0이나 음수를 지정하면 쿠키 삭제

 

도메인

쿠키의 도메인을 명시한다면 명시한 문서 기준 도메인 + 서브 도메인 포함하여 쿠키가 접근한다.

쿠키의 도메인을 명시하지 않는다면 현재 문서의 도메인만 적용하여 쿠키가 접근한다.

예를 들면 domain=seungkyu.com을 지정하면

seungkyu.com은 물론이고 ???.seungkyu.com에도 쿠키가 접근한다.

하지만 생략을 한다면 seungkyu.com에만 접근하게 된다.

그리고 지정한 경로의 하위 페이지에만 쿠키가 접근하게 된다.

 

완성된 Set-cookie의 예를 보자면

Set-Cookie: id=1232145; expires=Sat, 4-Dec-1999 12:04:11 GMT; path=/; domain=seungkyu.com;Secure

이런식으로 작성이 되게 된다.

'백엔드 > HTTP' 카테고리의 다른 글

HTTP 8일차  (0) 2023.03.10
HTTP 6일차  (0) 2023.03.09
HTTP 5일차  (1) 2023.03.09
HTTP 4일차  (0) 2023.03.08
HTTP 3일차  (0) 2023.03.06
728x90

HTTP 상태코드에 대해서 배워보자.

 

  • 상태 코드

상태코드는 서버에서 클라이언트에게 보내며, 클라이언트가 보낸 요청에 대한 응답의 상태를 알려준다.

 

- 1XX (Informational) : 요청이 수신되어 처리 중인 상태

- 2XX (Successful) : 요청 정상 처리 상태

- 3XX (Redirection) : 요청을 완료하려면 추가 행동이 필요한 상태

- 4XX (Client Error) : 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없는 상태

- 5XX (Server Error) : 서버 오류, 서버가 요청을 처리하지 못하는 상태

 

1XX (Informational)

요청이 수신되어 현재 처리 중인 상태로, 현재는 거의 사용하지 않는다고 한다.

 

2XX (Successful)

클라이언트의 요청을 정상적으로 처리한 상태이다.

 

- 200 OK

가장 평범한, 요청 성공이다.

- 201 Created

요청에 성공해서 새로운 리소스가 생성이 된다.

- 202 Accepted

요청은 접수 되었으나, 처리가 완료되지 않은 상태이다.

- 204 No Content

서버가 요청을 정상적으로 수행했지만, 응답으로 보낼 데이터는 없다.

버튼을 눌러도 같은 화면을 유지해야 하는 상황에서 사용하며, 결과 내용이 없어도 204만으로도 성공을 인식할 수 있다.

 

3XX (Redirection)

요청을 완료하기 위해 추가적인 조치가 필요한 상태이다.

웹 브라우저는 3XX 응답의 결과에 Location 헤더가 있으면, 그 위치로 자동 이동한다.

 

- 300 Multiple Choices

- 301 Moved Permanently

- 302 Found

- 303 See Other

- 304 Not Modified

- 307 Temporary Redirect

- 308 Permanent Redirect

 

일단 흐름을 이해하면 이렇게 된다.

Location에 있는 페이지로 이동한다.

 

리다이렉션의 종류에는

- 영구 리다이렉션 (301, 308)

특정 리소스의 URI가 영구적으로 이동했을 때

원래의 URL을 사용하지 않으며, 검색 엔진 등에서도 변경을 인지한다.

301은 Moved Permanently로 리다이렉트 요청 메서드가 GET으로 변하고, 바디 부분이 제거될 수 있다.

308은 Permanent Redirt로 리다이렉트시 요청 메서도와 본문이 유지된다.

- 일시 리다이렉션 (302, 307, 303)

리소스의 URI가 일시적으로 변경된 상태이다.

302는 Found로 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있다.

307는 Temporary Redirect로 리다이렉트시 요청 메서드와 본문을 유지한다.

303은 See Other로 리다이렉트시 요청 메서드가 GET으로 변경

 

만약 POST 방식으로 결제를 한 후 웹 브라우저를 새로고침하면 중복 주문이 되는 문제가 생길 수 있다.

이렇게 DB에 주문데이터가 중복으로 2개 들어간다.

이 문제를 해결하기 위해서 POST로 결재 후에 결재 화면을 GET 메서드로 리다이렉트한다.

그러면 POST로 가지 않기 때문에 중복 결재가 되는 일이 없어진다. (조회만 하기 때문에)

- 특수 리다이렉션

304는 Not Modified로 캐시 목적으로 사용한다.

클라이언트에게 리소스가 수정되지 않았음을 알려, 로컬에 저장된 캐시를 재사용하게 한다.

 

4XX (Client Error)

클라이언트 요청에 따라 잘못된 문법등으로 서버가 요청을 수행할 수 없는 상태이다.

오류의 원인이 클라이언트에 있을 때 4XX 오류가 발생한다.

 

400은 Bad Request로 클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없을 때이다.

401은 Unauthorized로 클라이언트가 해당 리소스에 대한 인증이 필요한 상태이다.

403은 Forbidden로 서버가 요청을 이해했지만 승인을 거부한 상태이다.

404은 Not Found로 요청 리소스를 찾을 수 없는 상태이다.

 

 5XX (Servor Error)

서버 문제로 오류가 발생한 모든 경우이다.

의도적으로 만드는 페이지는 아닐 것이다.

'백엔드 > HTTP' 카테고리의 다른 글

HTTP 8일차  (0) 2023.03.10
HTTP 7일차  (0) 2023.03.10
HTTP 5일차  (1) 2023.03.09
HTTP 4일차  (0) 2023.03.08
HTTP 3일차  (0) 2023.03.06
728x90

HTTP 메서드로 API를 설계해보자.

 

  • 서버로 데이터 전송

서버로 데이터를 전달하는 방식은 2가지이다.

쿼리 파라미터, 메시지 바디 두 가지이지만 사실 GET과 GET을 제외한 나머지이다.

 

- 쿼리 파라미터

GET

데이터를 조회할 때 사용

 

- 메시지 바디

POST, PUT, PATCH

회원 가입, 상품 주문, 리소스 등록

 

클라이언트에서 서버로 데이터를 전송하는 상황은 데이터를 조회하거나, HTML form을 통한 데이터 전송, HTTP API를 통한 데이터 전송할 때이다.

차례로 살펴보자.

 

- 정적 데이터 조회

어차피 정적이기 때문에 쿼리 파라미터를 사용하지 않는다.

 

- 동적 데이터 조회

정적 데이터 조회와는 다르게 쿼리 파라미터를 사용하여 동적으로 결과를 받아온다.

 

- HTML form을 이용하여 데이터 전송

우선 HTML Form 전송은 GET, POST만 지원을 한다.

그러니 조회를 제외한 대부분은 POST를 사용한다.

 

POST 방식으로 파일도 전송이 가능하다.

이렇게 다른 종류의 여러 파일과 폼의 내용을 함께 전송하려면 Content-Type: multipart/form-data를 사용한다.

 

-HTTP API 데이터 전송

보통 이렇게 API 데이터만 전송하는 경우는 서버 to 서버로 사람이 보지 않을 때이다.

Content-type: application/json이 사실상 표준이 되었다.

 

  • HTTP API 설계

우선 등록을 POST로 하는 POST 기반 등록부터 알아보자.

 

POST 기반 등록

- 학생 목록 /students -> GET

- 학생 등록 /students -> POST

- 학생 조회 /students/{id} -> GET

- 학생 수정 /students/{id} -> PATCH, PUT, POST

- 학생 삭제 /students/{id} -> DELETE

 

클라이언트는 등록될 리소스의 URI를 모르기 때문에 서버가 새로운 리소스 URI를 생성해준다.

그리고 이렇게 만든 리소스를 관리하는 디렉토리를 컬렉션이라고 한다.

 

PUT 기반 등록

- 파일 목록 /files -> GET

- 파일 조회 /files/{filename} -> GET

- 파일 등록 /files/{filename} -> PUT

- 파일 삭제 /files/{filename} -> DELETE

- 파일 ???  /files -> POST

 

POST 기반 등록과는 다르게 클라이언트가 리소스의 URI를 알고 있어야 한다.

클라이언트가 직접 리소스의 URI를 지정하기 때문에 클라이언트가 리소스를 관리하고 그 저장소를 스토어라고 한다.

 

HTML FORM 사용

- 학생 목록 /students -> GET

- 학생 목록 폼 /students/new -> GET

- 학생 등록 /students/new -> POST

- 학생 조회 /students/{id} -> GET

- 학생 수정 폼 /students/{id}/edit -> GET

- 학생 수정 /students/{id}/edit -> POST

- 학생 삭제 /students/{id}/delete -> POST

 

HTML FORM은 GET, POST만 지원한다.

그렇기 때문에 어쩔 수 없이 동사로 된 리소스 경로를 사용한다.

HTTP 메서드로도 어쩔 수 없는 경우에만 사용한다.

'백엔드 > HTTP' 카테고리의 다른 글

HTTP 7일차  (0) 2023.03.10
HTTP 6일차  (0) 2023.03.09
HTTP 4일차  (0) 2023.03.08
HTTP 3일차  (0) 2023.03.06
HTTP 2일차  (0) 2023.03.02
728x90

HTTP 메서드에 대해 알아본다.

 

  • HTTP API를 만들어보자

만약 학생 정보 관리 API를 만들어라 라고 한다면

지금의 우리는 URI를

- 학생 목록 조회 /read-member-list

- 학생 조회 /read-member-by-id

- 학생 등록 /create-member

- 학생 수정 /update-member

- 학생 삭제 /delete-member

 

이렇게 설계할 것이다.

 

하지만 이렇게 설계하는 것은 좋지 않은 방법이다.

리소스가 식별이 되도록 설계를 해야한다.

여기서는 '학생 목록 조회'가 리소스가 아니라, 학생 그 자체가 리소스이다.

조회든, 수정이든 신경쓰지 않고 학생이라는 리소스만 식별하면 되기 때문에 학생 리소스를 URI에 매핑한다.

그럼 이렇게 리소스가 학생이라는 것을 알았는데, 조회나 수정은 어떻게 해야할까?

우리는 이 행위를 메서드에 넘기게 된다.

 

  • HTTP 메서드

HTTP 주요 메서드 종류에는

GET : 리소스 조회

POST : 요청 데이터 처리, 주로 등록에 사용

PUT : 리소스를 대체, 해당 리소스가 없으면 생성

PATCH : 리소스 부분 변경

DELETE : 리소스 삭제

가 있다.

 

GET

리소스 조회

서버에 전달하고 싶은 데이터를 query를 통해 전달한다.

 

이렇게 서버에 리소스 조회를 한다.

 

POST

요청 데이터 처리

메시지 바디를 통해 서버로 요청 데이터를 전달하며, 들어온 데이터를 처리하는 모든 기능을 수행한다.

POST는 서버가 아직 식별하지 않은 새 리소스를 생성하거나 요청 데이터를 처리하거나, 아니면 다른 메서드로 처리하기 애매한 경우에 사용한다. (거의 만능이라고 한다)

 

PUT

기존에 있던 리소스를 대체한다.

리소스가 있으면 대체하고 리소스가 없으면 생성한다.

POST와의 차이점은 PUT은 클라이언트가 리소스의 위치를 알고 URI로 지정한다.

 

리소스를 대체하는 경우만 살펴보자.

 

PATCH

PUT과 같이 대체하는 것이 아니라 부분만 변경한다.

 

DELETE

리소스를 제거해버린다.

 

HTTP 메서드의 속성

- 안전

호출해도 리소스를 변경하지 않는다.

- Idempotent

호출 횟수에 관계 없이 같은 결과가 나온다.

- 캐시 가능

응답 결과 리소스를 캐시해서 사용해도 되는가?

 

이러한 속성들이 있다.

각각의 메서드들에 살펴보면

HTTP 메서드 안전 Idempotent 캐시 가능
GET O O O
POST X X O
PUT X O X
DELETE X O X
PATCH X X O

 

'백엔드 > HTTP' 카테고리의 다른 글

HTTP 6일차  (0) 2023.03.09
HTTP 5일차  (1) 2023.03.09
HTTP 3일차  (0) 2023.03.06
HTTP 2일차  (0) 2023.03.02
HTTP 1일차  (0) 2023.03.01
728x90

이제 부터 제대로 HTTP에 대해 알아보자.

 

  • HTTP의 기본 개념

HTTP는 HyperText Transfer Protocol의 약자로

최근에는 이 HTTP 메시지에 모든 것을 전송하고 있다.

HTML 뿐만아니라 이미지, 영상, JSON 거의 모든 형태의 데이터를 전송 가능하다.

 

지금 가장 많이 사용하는 HTTP는 1.1 버전으로 1997년에 등장하게 되었다.

그 뒤로는 2, 3 버전이 나왔으며 현재는 섞어서 사용하고는 있지만 그래도 1.1 버전을 가장 많이 사용한다.

 

전에 배웠던 TCP, UDP 중에서 TCP가 가장 좋아 쭉 TCP를 사용할 것 같지만

3 버전 이후로는 속도가 빠른 UDP를 사용하며 2와 1.1도 점점 사용하는 추세이다.

 

  • 클라이언트 서버 구조

JSP에서 공부했던 것처럼 Request와 Response 구조이다.

클라이언트는 서버에 요청을 보내고, 응답을 대기한다.

그러면 서버가 요청에 대한 결과를 만들어서 응답하는 것이다.

  • 무상태 프로토콜

서버가 클라이언트의 상태를 보존하지 않는 것을 말한다.

무상태로 서버를 만들면 응답 서버를 쉽게 바꿀 수 있다.

 

예를 들어보자.

이렇게 상태를 유지하는 서버가 있다.

클라이언트는 첫번째 서버로 A 물품, 3개의 Request의 요청을 보낸다.

그러다가 갑자기 첫번째 서버에 고장이 나면

첫번째 서버에서 상태를 저장하고 있기 때문에 큰 일이 난다.

 

하지만 상태를 저장하지 않고 요청에 정보를 담아 보내는 무상태 서버라면 그냥 다른 곳으로 응답을 요청하면 된다.

어차피 고장난 서버에서 상태를 저장하고 있지 않기 때문에

그리고 같은 이유로 서버 확장에도 유리하다.

하지만 모든 것을 무상태로 설계 할 수는 없다.

로그인과 같은 경우에는 상태 유지로 설계를 해야한다.

 

  • 비 연결성

연결을 유지하는 모델은 이렇게 응답을 받아도 TCP/IP 연결을 계속 유지한다.

하지만 연결을 유지하지 않는 모델은 응답을 받으면 TCP/IP 연결을 종료한다.

HTTP는 기본이 연결을 유지하지 않는 모델이다.

어차피 일반적으로 초 단위 이하의 빠른 속도로 응답하기 때문이다.

덕분에 서버 자원을 매우 효율적으로 사용할 수 있다.

 

하지만 아무리 빠른 속도로 응답을 하더라도 3 way handshake 시간이 추가된다.

또한 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css등의 자원이 함께 다운로드 된다.

그렇기에 HTTP도 지속 연결을 사용하기도 한다.

 

HTTP 지속연결은 아래와 같이 자원을 한번에 받고 연결을 종료하는 방법이다.

 

  • HTTP 메시지

위에서 HTTP 메시지에 모든 것을 전송할 수 있다고 했었다.

그럼 그 메시지들을 한 번 보도록 하자

이게 가장 대표적인 예시로 요청과 응답에 사용했던 HTTP 요청 메시지, HTTP 응답 메시지이다.

 

HTTP 메시지의 기본 구조는 아래와 같다.

이 기본 구조만 지키면 되는 것이다.

그럼 이 구조들을 하나씩 살펴보자.

 

시작 라인

이 부분은 요청과 응답이 살짝 다르다.

 

우선 요청부터 보자면

request-line = [method] [request-target] [HTTP-version]엔터

위의 요청 메시지에서 HTTP method는 GET이었고, 요청 대상은 /search?q=hi&hl=ko이며 HTTP/1.1임을 나타내고 있다.

 

method는 서버가 수행해야 할 동작을 지정하며

종류에는 GET, POST, PUT, DELETE가 있다.

 

request-target은 절대경로[?query]의 형식으로 경로와 넘길 커리를 지정한다.

 

HTTP-version은 사용한 HTTP 버전을 나타낸다.

 

응답을 보면

status-line=[HTTP-version] [status-code] [reason-phrase]

 

HTTP-version은 위처럼 사용한 HTTP 버전이다.

 

status-code는 성공과 실패를 나타낸다.

200은 성공, 400은 클라이언트 요청 오류, 500은 서버 내부 오류등을 나타낸다.

 

reason-phrase는 사람이 이해할 수 있도록 설명을 적는 곳이다.

 

헤더

header-field=[field-name:] [field-value]의 구조를 가진다.

HTTP 전송에 필요한 모든 부가정보를 담는다.

예를 들면 메시지 바디의 내용, 메시지 바디의 크기....

 

HTTP 메시지 바디

실제 전송할 데이터를 담는다.

HTML 문서, 이미지, 영상, JSON등을 모두 전송 가능하다.

'백엔드 > HTTP' 카테고리의 다른 글

HTTP 6일차  (0) 2023.03.09
HTTP 5일차  (1) 2023.03.09
HTTP 4일차  (0) 2023.03.08
HTTP 2일차  (0) 2023.03.02
HTTP 1일차  (0) 2023.03.01
728x90

URI와 웹 브라우저 요청에 대해 알아보자.

 

URI(Uniform Resource Identifier)

URI라고 하면 뭔가 URL의 오타같이 느껴질 것이다.

URL은 많이 봤어도 URI는 처음 봤을 것이다.

URI는 URL(locator), URN(name)로 나뉘고 URL은 그 종류일 뿐이다.

 

URI는

Uniform: 리소스를 식별하는 통일된 방식

Resource: 자원, URI로 식별할 수 있는 모든 것

Identifier: 다른 항목과 구분하는데 필요한 정보

의 약자이다.

 

URL: Uniform Resource Locator

URN: Uniform Resource Name

 

URL은 리소스가 있는 위치를 지정하고 URN은 리소스에 이름을 부여한다. 하지만 URN 이름만으로 실제 리소스를 찾을 수 있는 방법이 보편화 되지 않았기 때문에 보통 URL을 사용한다.

 

URL 분석

https://www.naver.com/search?q=hi&hl=ko 

를 타겟으로 분석해보자.

 

일단 URL의 전체 문법은

scheme://[userinfo@]host[:port][/path][?quert][#fragment] 이다.

 

  • scheme

주로 프로토콜(어떤 방식으로 자원에 접근할 것인가 하는 약속 규칙, http와 https 등등) 사용

http는 80포트, https는 443 포트를 사용하며 이 포트들은 생략이 가능하다.

 

  • userinfo

URL에 사용자정보를 포함해서 인증... 한다고 한다.

거의 사용하지 않기 때문에 그냥 넘어가도 될 듯 하다.

 

  • host

호스트명이다.

주로 도메인명을 사용하지만 IP 주소를 직접 사용할 수 있다.

 

  • port

어디에 접속하는지를 나타내는 포트이다.

 

  • path

리소스 경로이다.

ex) /home/target1.jpg

  • query

key=value형태로 나타낸 데이터이다.

?로 시작을 하며, 추가 할 때마다 &로 이어주면 된다.

 

  • fragment

서버에 전송하는 정보가 아닌 html 내부 북마크 등에 사용한다.

 

기본 문법을 알아보았으니, 타겟 주소로 분석을 해보자.

우선 www.google.com을 DNS 서버에서 조회해 IP 주소를 얻은 후 그곳으로 보낼 HTTP 요청 메시지를 생성한다.

 

그 때 HTTP 요청 메시지는

이렇게 만들어 질 것이다.

그 HTTP 요청 메시지가 단계를 거치며 포장이 되어 서버로 갈 것이다.

위 그림은 그 과정을 나타낸 것이다.

 

그 때 만들어진 패킷은

이렇게 메시지를 감싸서 만들어지게 될 것이다.

 

이렇게 만들어진 패킷을 서버에 보내면 서버에서 확인을 하고 응답 메시지를 만들어 보낼 것이다.

그러면 클라이언트는 이 응답 메시지를 웹 브라우저에서 렌더링하여 화면을 표시할 것이다.

'백엔드 > HTTP' 카테고리의 다른 글

HTTP 6일차  (0) 2023.03.09
HTTP 5일차  (1) 2023.03.09
HTTP 4일차  (0) 2023.03.08
HTTP 3일차  (0) 2023.03.06
HTTP 1일차  (0) 2023.03.01
728x90

HTTP 1일 차로 인터넷 네트워크에 대해서 공부한다.

 

  • 인터넷 통신

만약 컴퓨터 두 대가 직접적으로 연결이 되어 있다면

이렇게 직접 통신을 하면 될 것이다.

 

하지만 수많을 컴퓨터들이 있는 인터넷 내에서는 어떻게 통신을 할까?

이렇게 수많은 노드들을 거친 후에 서버에 도착해야 할 것이다.

과연 어떤 방법으로 서버를 찾아가게 될까?

  • IP

그 방법으로는 컴퓨터마다 고유의 번호를 부여하고 그 번호로 찾아가게 하는 것이다.

고유의 번호를 IP 주소라고 한다.

지정한 IP 주소에 패킷이라는 통신 단위로 데이터를 저장하게 된다.

이렇게 전송 데이터에 IP 관련된 정보를 넣어서 감싼 단위를 패킷이라고 한다.

패킷 안에는 IP 정보가 들어가 있기 때문에 해당 정보를 이용하여 목적지까지 패킷을 운반한다.

하지만 이 IP 프로토콜에도 한계가 있다. 

- 비연결성

만약 패킷을 받을 대상이 없거나 서비스 불가 상태여도 데이터를 전송한다.

 

- 비신뢰성

데이터가 중간에 소실될 수 있고, 패킷이 순서대로 오지 않을 수도 있다.

 

- 프로그램 구분

같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면 어느 애플리케이션으로 가야 하는지 알 수 없다.

  • TCP, UDP

해당 방법을 TCP에서 해결할 수 있다.

 

프로토콜 계층을 살펴보면

인터넷 프로토콜 스택의 4계층이다.

애플리케이션 계층 - HTTP, FTP
전송 계층- TCP, UDP
인터넷 계층 - IP
네트워크 인터페이스 계층

 

    이거를 사용하는 단계까지 같이 표현을 해보자면

이렇게 나타내진다.

데이터를 전송할 때에는 이 모든 과정을 거쳐 전송하게 된다.

IP 패킷으로 포장하기 전에 TCP 하나를 추가하게 되는 것인데

TCP는 이전에 IP 프로토콜에서 생겼던 문제들을 해결할 수 있다.

TCP 특징

- 연결지향(TCP 3 way handshake, 가상연결)

데이터를 전송하기 전에 서버에 접속 요청을 보낸 후, 서버에서 요청 수락을 하고 서버에서 클라이언트로 접속 요청을 보내면 그것에 응답하여 서로 연결이 된 것을 확인한 후 데이터를 전송하는 방법이다.

클라이언트와 서버 간에는 연결이 된 것을 확인할 수 있지만, 그 중간의 노드들은 접속이 된 것을 알지 못하기 때문에 가상 연결이라고도 한다.

 

- 데이터 전달 보증

데이터를 수신하면 데이터를 수신한 곳에서 송신한 곳으로 수신이 완료되었음을 알리는 신호를 보낸다.

이렇게 하면 데이터가 전달되었다는 것을 보증할 수 있다.

 

- 순서 보장

순서가 맞지 않는다면, 맞지 않는 곳에서부터 재전송을 요청하여 순서대로 도착함을 보장한다.

이렇게 TCP에 대해 알아보았다.

 

UDP는 이와 정반대의 특징을 가지는데

연결지향, 데이터 전달 보증, 순서 보장의 특징을 가지지 않아 IP와 거의 비슷하지만 속도가 훨씬 빠르다.

  • PORT

이렇게 한 번에 둘 이상 연결할 경우가 있다.

이럴 때에는 어떤 데이터가 어디에 쓰이는지 어떻게 구별할 수 있을까?

 

이럴 때에는 위에 같이 포장되어 있는 PORT의 정보를 이용한다.

 

이렇게 포트 번호를 보고 어디에서 온 데이터인지 구별하여 사용한다.

  • DNS

IP는 숫자로만 구성되어 있어 기억하기 어렵다.

우리가 웹 사이트에 접속할 때마다 저 번호를 기억해서 치고 들어가면 상당히 힘들 것이다.

그렇기 때문에 우리는 DNS(Domain Name System)을 사용한다.

도메인 명을 IP 주소로 변환해 주는 방법이다.

우리가 google에 접속하려고 하면 구글의 google.com을 치고 접속한다.

그러면 도메인 서버에서 해당 도메인명에 일치하는 IP주소를 찾아 접속을 해준다.

그러면 우리는 IP 주소를 몰라도 google에 접속할 수 있게 되는 것이다.

'백엔드 > HTTP' 카테고리의 다른 글

HTTP 6일차  (0) 2023.03.09
HTTP 5일차  (1) 2023.03.09
HTTP 4일차  (0) 2023.03.08
HTTP 3일차  (0) 2023.03.06
HTTP 2일차  (0) 2023.03.02

+ Recent posts