반응형

# 모든 개발자를 위한 HTTP 웹 기본 지식 학습

# 검증 헤더와 조건부 요청 1

## 캐시 시간 초과

  • 캐시 유효 시간이 초과해서 서버에 다시 요청하면 다음 두 가지 상황이 나타난다.
1. 서버에서 기존 데이터를 변경함

2. 서버에서 기존 데이터를 변경하지 않음

## 캐시 시간 초과

  • 캐시 만료후에도 서버에서 데이터를 변경하지 않음
  • 생각해보면 데이터를 전송하는 대신 저장해 두었던 캐시를 재사용 할 수 있다.
  • 단 클라이언트의 데이터와 서버의 데이터가 같다는 사실을 확인할 수 있는 방법 필요.

## 검증 헤더 추가

  • 첫 번째 요청
웹 브라우저
GET /start.jpg	(요청1)


서버
HTTP/1.1 200 OK
Content-Type: image/jpeg
cache-control: max-age=60
Last-Modified: 2020년 11월 10일 10:00:00	// 데이터가 마지막에 수정된 시간
Content-Length: 34012

asdsadsa234asdasdasd


브라우저 캐시
응답 결과를 캐시에 저장,
60초 유효,
데이터 최종 수정일 2020년 11월 10일 10:00:00
  • 두 번째 요청 - 캐시 시간 초과
웹 브라우저
GET /star.jpg
if-modified-since: 2020년 11월 10일 10:00:00	// 데이터 최종 수정일 값


서버
데이터 최종 수정일과 브라우저 캐시를 서버에서 검증
HTTP/1.1 304 Not Modified
Content-Type: image/jpeg
cache-control: max-age=60
Last-Modified: 2020년 11월 10일 10:00:00
Content-Length: 34012
-> HTTP Body가 없음. ( 기존 1.1M 전송에서 0.1M 전송으로 부하가 확 줄어든다. )

## 검증 헤더와 조건부 요청_정리

  • 캐시 유효 시간이 초과해도, 서버의 데이터가 갱신되지 않으면 
  • 304 Not Modified + 헤더 메타 정보만 응답 (바디x)
  • 클라이언트는 서버가 보낸 응답 헤더 정보로 캐시의 메타 정보를 갱신
  • 클라이언트는 캐시에 저장되어 있는 데이터 재활용
  • 결과적으로 네트워크 다운로드가 발생하지만 용량이 적은 헤더 정보만 다운로드
  • 매우 실용적인 해결책

 

출처 : 인프런 모든 개발자를 위한 HTTP 웹 기본 지식

반응형
반응형

# 모든 개발자를 위한 HTTP 웹 기본 지식 학습

# 캐시 기본 동작

## 캐시가 없을 때

  • 첫 번째 요청
웹 브라우저
GET /star.jpg

서버
HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 34012

sadasdasd1123.. star 이미지 관련 바이트 코드
  • 두 번째 요청 시 동일한 작업 진행
  • 즉, 캐시가 없을 때 아래와 같은 문제 발생
데이터가 변경되지 않아도 계속 네트워클르 통해서 데이터를 다운로드 받아야 한다.

인터넷 네트워크는 매우 느리고 비싸다.

브라우저 로딩 속도가 느리다.

느린 사용자 경험

## 캐시 적용

  • 첫 번째 요청
웹 브라우저
GET /star.jpg

서버
HTTP/1.1 200 OK
Content-Type: image/jpeg
cache-control: max-age=60 (캐시가 유효한 시간(초))
Content-Length: 34012

sadasdasd1123.. star 이미지 관련 바이트 코드

브라우저 캐시 (웹브라우저에서 캐시를 저장하는 저장소)
응답 결과를 캐시에 저장
  • 두 번째 요청 시 브라우저 캐시를 확인, 캐시가 유효한 시간인 경우 캐시에서 바로 가져온다. (네트워크 다운로드 발생X)
  • 캐시 적용 장점
캐시 덕분에 캐시 가능 시간동안 네트워크를 사용하지 않아도 된다.

비싼 네트워크 사용량을 줄일 수 있다.

브라우저 로딩 속도가 매우 빠르다.

빠른 사용자 경험
  • 세 번째 요청 : 캐시 시간 초과 시
브라우저 캐시
기존 데이터에 새로운 데이터를 덮어씌운다.
그리고 설정된 유효시간으로 다시 초기화

## 캐시 시간 초과

  • 캐시 유효 시간이 초과하면, 서버를 통해 데이털르 다시 조회하고, 캐시를 갱신한다.
  • 이때 다시 네트워크 다운로드가 발생한다.

 

출처 : 인프런 모든 개발자를 위한 HTTP 웹 기본 지식

반응형
반응형

# 모든 개발자를 위한 HTTP 웹 기본 지식 학습

# 쿠키

  • Set-Cookie : 서버에서 클라이언트로 쿠키 전달(응답)
  • Cookie : 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달

## 쿠키 미사용

  • 처음 Welcone 페이지 접근
웹 브라우저 
GET /welcome HTTP/1.1

서버
HTTP/1.1 200 OK
안녕하세요. 손님
  • 로그인
웹 브라우저
POST /login HTTP/1.1
user=홍길동

서버
HTTP/1.1 200 OK
홍길동님이 로그인했습니다.
  • 로그인 이후 welcome 페이지 접근
웹 브라우저
GET /welcome HTTP/1.1

서버
HTTP/1.1 200 OK
안녕하세요. 손님
( 서버 입장에서는 로그인 여부 구분이 x )

## 무상태 (Stateless)

  • HTTP는 무상태(Stateless) 프로토콜이다.
  • 클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어진다.
  • 클라이언트가 다시 요청하면 서버는 이전 요청을 기억하지 못한다.
  • 클라이언트와 서버는 서로 상태를 유지하지 않는다.

## 쿠키 미사용

  • 대안 - 모든 요청에 사용자 정보 포함
웹 브라우저
GET /welcome?user=홍길동 HTTP/1.1

서버
HTTP/1.1 200 OK
안녕하세요. 홍길동님
  • 위 대안의 문제점 : 모든 요청과 링크에 사용자 정보 포함

## 모든 요청에 정보를 넘기는 문제

  • 모든 요청에 사용자 정보가 포함되도록 개발 해야함
  • 브라우저를 완전히 종료하고 다시 열면?..

## 쿠키

  • 로그인
웹 브라우저
POST /login HTTP/1.1
user=홍길동

서버
HTTP/1.1 200 OK
Set-Cookie; user=홍길동;
홍길동님이 로그인했습니다.

쿠키 저장소
쿠키 저장소에 'user=홍길동' 저장
  • 로그인 이후 welcome 페이지 접근
웹 브라우저
GET /welcome HTTP/1.1
Cookie: user=홈길동

쿠키 저장소
쿠키 저장소에서 'user=홍길동' 조회

서버
HTTP/1.1 200 OK
안녕하세요. 홍길동님
  • 모든 요청에 쿠키 정보 자동 포함
  • 쿠키의 예
set-cookie: sessionId=abcde1234; expires=Sat, 26-Dec-2020 00:00:00 GMT; path=/; domain=.google.com; Secure
  • 쿠키의 사용처
사용자 로그인 세션 

광고 정보 트래킹
  • 쿠키 정보는 항상 서버에 전송됨
네트워크 트래픽 추가 유발

최소한의 정보만 사용(세션, id, 인증 토큰)

서버에 전송하지 않고, 웹 브라우저 내부에 데이터를 저장하고 싶으면 웹 스토리지 참고
  • 쿠키 주의사항!!
보안에 민감한 데이터는 저장하면 안된다. (주민번호, 신용카드 번호 등등)

## 쿠키- 생명주기 (Expires, max-age)

  • Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT
만료일이 되면 쿠키 삭제
  • Set-Cookie: max-age=3600 (3600초)
0이나 음수를 지정하면 쿠키 삭제
  • 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료시 까지만 유지
  • 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지

## 쿠키 - 도메인 (Domain)

  • 쿠키 도메인 예)
domain=example.org
  • 명시 : 명시한 문서 기준 도메인 + 서브 도메인 포함
domain=example.org를 지정해서 쿠키 생성

example.prg는 물론이고, dev.example.org도 쿠키 접근
  • 생력 : 현재 문서 기준 도메인만 적용
example.org에서 쿠키를 생성하고 domain 지정을 생략

example.org에서만 쿠키 접근, dev.example.org는 쿠키 미접근

## 쿠키 - 경로 (Path)

  • 쿠키 경로 예)
path=/home
  • 이 경로를 포함한 하위 경로 페이지만 쿠키 접근
  • 일반적으로 path=/ 루트로 지정
  • 예시)
path=/home 지정

/home 가능
/home/level1 가능
/home/level1/level2 가능

/hello 불가능

## 쿠키 - 보안 (Secure / HttpOnly / SameSite)

  • Secure
쿠키는 http, https를 구분하지 않고 전송

Secure를 적용하면 https인 경우에만 전송
  • HttpOnly 
XSS 공격 방지

자바스크립트에서 접근 불가 (document.cookie)

HTTP 전송에만 사용
  • SameSite
XSRF 공격 방지

요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송

 

 

 

출처 : 인프런 모든 개발자를 위한 HTTP 웹 기본 지식

반응형
반응형

# 모든 개발자를 위한 HTTP 웹 기본 지식 학습

# 협상 헤더(콘텐츠 네고시에이션)

  • 클라이언트가 선호하는 표현 요청
  • Accept : 클라이언트가 선호하는 미디어 타입 전달
  • Accept-Charset : 클라이언트가 선호하는 문자 인코딩
  • Accept-Encoding : 클라이언트가 선호하는 압축 인코딩
  • Accept-Language : 클라이언트가 선호하는 자연 언어
  • 협상 헤더는 요청시에만 사용

## 협상 헤더 적용 사례 1

  • Accept-Language 적용 전
한국어 브라우저 사용
/event
GET /evnet
로 보내면


다중 언어 지원 서버
1. 기본 영어(en)
2. 한국어 지원(ko)
Content-Language: en
hello (영어)
로 응답
  • Accept-Language 적용 후
한국어 브라우저 사용
/event
GET /evnet
Accept-Language: ko
로 보내면(Accept-Language 포함하여 전달)


다중 언어 지원 서버
1. 기본 영어(en)
2. 한국어 지원(ko)
Content-Language: ko
안녕하세요
로 응답

## 협상 헤더 사용 사례 2 (Accept-Language 복잡한 예시)

한국어 브라우저 사용
/event
GET /evnet
Accept-Language: ko
로 보내면(Accept-Language 포함하여 전달)


다중 언어 지원 서버
1. 기본 독일어(de)
2. 영어도 지원(en)
Content-Language: de
Hallo(독일어)
로 응답

## 협상과 우선순위 1

  • Quality Values(q) 값 사용
  • 0~1, 클수록 높은 우선순위
  • 생략하면 1
Accept-Language: ko-KR, ko; q=0.9, en-US; q=0.8, en; q=0.7

1 순위. ko-KR; q=1 (q생략)
2 순위. ko; q=0.9
3 순위. en-US; q=0.8
4 순위. en; q=0.7

## 협상 헤더 사용 사례 2 (Accept-Language 복잡한 예시) - 해결

한국어 브라우저 사용
/event
GET /evnet
Accept-Language: ko-KR, ko; q=0.8, en-US; q=0.8, en; q=0.7
로 보내면(Accept-Language / 우선순위 포함하여 전달)


다중 언어 지원 서버
1. 기본 독일어(de)
2. 영어도 지원(en)
Content-Language: de
Hello(영어)
로 응답

## 협상과 우선순위 2

  • 구체적인 것이 우선한다.
Accept: text/*, text/plain, text/plain;format=flowed, */*

1 순위. text/plain; format=flowed
2 순위. text/plain
3 순위. text/*
4 순위. */*

## 협상과 우선순위 3

  • 구체적인 것을 기준으로 미디어 타입을 맞춘다.
Accept: text/*; q=0.3, text/html; q=0.7, text/html;level=1, text/html; level=2; q=0.4, */*; q=0.5

Media Type : text/html; level=1 일 때 Quality : 1
Media Type : text/html 일 때 Quality : 0.7
Media Type : text/plain 일 때 Quality : 0.3
Media Type : image/jpeg 일 때 Quality : 0.5
Media Type : text/html; level=2 일 때 Quality : 0.4
Media Type : text/html; level=3 일 때 Quality : 0.7

 

# 전송 방식

  • Transfer-Encoding
  • Range, Content-Range

## 전송 방식 설명

  • 단순 전송
  • 압축 전송
  • 분할 전송
  • 범위 전송

## 단순 전송

  • Conten-Length
  • 요청을 하면 응답을 주는데, 메시지 바디에 대한 길이값을 지정하는 것
  • 한번에 요청하고 한번에 쭉 받는 것
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 3423

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

## 압축 전송

  • Content-Encoding
  • 서버에서 압축을 통해 용량을 줄이고, Content-Encoding을 설정(어떤 걸로 압축되어있는지)
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Content-Length: 521

lkj123kljoiaasdasdskljsdfj

## 분할 전송

  • Transfer-Encoding
  • 보낼 때 덩어리로 쪼개서 보내겠다는 것 (용량이 큰 것을 분할 전송하여 빠르게 전송)
  • Content-Length 넣으면 안됨 ( 처음에 Content-Length 예상 불가능)
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

5
Hello
5
World
0
\r\n

## 범위 전송

  • Range, Content-Range
  • 예) 이미지 전송 중 절반정도 받았을 경우 중간에 끊기면 다시 요청 해야 하는데, 처음부터 다시 요청하게 되면 용량 낭비, 그러므로 범위 전송을 통해 범위 설정
클라이언트
GET /event
Range: bytes=1001~2000


서버
HTTP/1.1 200 Ok
Content-Type: text/plain
Content-Range: bytes 1001~2000 / 2000

qweqwewq123qwedaswe

 

# 일반 정보

  • From : 유저 에이전트의 이메일 정보
  • Referer : 이전 웹 페이지 주소
  • User-Agent : 유저 에이전트 애플리케이션 정보
  • Server : 요청을 처리하는 오리진 서버의 소프트웨어 정보
  • Date : 메시지가 생성된 날짜

## From

  • 유저 에이전트의 이메일 정보
  • 일반적으로 잘 사용되지 않는다.
  • 검색 엔진 같은 곳에서 주로 사용
  • 요청에서 사용

## Referer

  • 이전 웹 페이지 주소
  • 현재 요청된 페이지의 이전 웹 페이지 주소
예)

구글에서 특정 입력 값 검색 후 개발자 도구 보면 아래와 같이 되어 있음을 볼 수 있다.
referer: http://www.google.com

=>
이전 웹 사이트 주소를 알려준다.
  • A 에서 B로 이동하는 경우 B를 요청할 때 Referer: A를 포함해서 요청
  • Referer를 사용해서 유입 경로 분석 가능
  • 요청에서 사용
  • 사용 : 주로 유입 경로 or 웹 사이트 분석 시 사용한다.
  • 참고로 referer는 단어 referrer의 오타이다.

## User-Agent

  • 유저 에이전트 애플리케이션 정보
예)
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
  • 클라이언트의 애플리케이션 정보 (웹 브라우저 정보, 등등)
  • 통계 정보
  • 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능
  • 요청에서 사용
  • 사용 : 특정 브라우저에서 문제 생길 경우 파악 등

## Server

  • 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보
  • Server : Apache/2.2.22 (Debian)
  • server: nginx
  • 응답에서 사용

## Date

  • 메시지가 발생한 날짜와 시간
  • Date : Tue, 15 Nov 1994 08:15:31 GMT
  • 응답에서 사용

 

# 특별한 정보

  • Host : 요청한 호스트 정보(도메인)
  • Location : 페이지 리다이렉션
  • Allow : 허용 가능한  HTTP 메서드
  • Retry-After : 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간

## Host

  • 요청한 호스트 정보 (도메인)
  • 요청에서 사용
  • 필수 헤더이다. (아주 중요)
GET /search?q=hello&hi=ko HTTP/1.1
Host: www.google.com
  • 하나의 서버가 여러 도메인을 처리해야 할 때
  • 하나의 IP 주소에 여러 도메인이 적용되어 있을 때
예)
가상 호스트를 통해 여러 도메인을 한번에 처리할 수 있는 서버, 실제 애플리케이션이 여러개 구동될 수 있다.

여기서 Host가 없으면 발생할 수 있는 문제?
=>
클라이언트가 아래와 같이 요청을 보내면
GET /hello HTTP/1.1 (/hello 요청 전달)

서버에서 /hello가 어디로 들어가야 할지(AAA.com / BBB.com / CCC.com 어디로?)구분할 방법이 없음.
(IP로만 통신하기 때문에)


해결방법) 
Host 사용
GET /hello HTTP/1.1
Host: AAA.com

## Location

  • 페이지 리다이렉션
  • 웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동 (리다이렉트)
  • 응답코드 3xx에서 설명
  • 201 (Created) : Location 값은 요청에 의해 생성된 리소스 URI
  • 3xx (Redirection) : Location 값은 요청을 자동으로 리다이렉션하기 위한 대상 리소스를 가리킴

## Allow

  • 허용 가능한 HTTP 메서드
  • 405 (Method Not Allowed)에서 응답에 포함해야 함
  • Allow: GET, HEAD, PUT

## Retry-After

  • 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
  • 503 (Service Unavailable) : 서비스가 언제까지 불능인지 알려줄 수 있다.
  • Retry-After : Fri, 31, Dec 1999 23:59:59 GMT (날짜 표기)
  • Retry-After : 120 (초단위 표기)

 

# 인증 헤더

  • Authorization : 클라이언트 인증 정보를 서버에 전달
  • WWW-Authenticate : 리소스 접근 시 필요한 인증 방법 정의

## Authorization 

  • 클라이언트 인증 정보를 서버에 전달
  • Authorization : Basic xxxxxxx
  • 참고 : 인증마다 value에 들어가는 건 다름

## WWW-Authenticate

  • 리소스 접근시 필요한 인증 방법 정의
  • 401 Unauthorized 응답과 함께 사용
WWW-Authenticate : Newauth Realm="apps", type=1, title="Login to\"apps\"", Basic realm="simple"

 

출처 : 인프런 모든 개발자를 위한 HTTP 웹 기본 지식

반응형

+ Recent posts