# 1. 웹의 기초
- MIME : Multipurpose Internet Mail Extensions : 멀티미디어 타입
- 주타입/부타입 포맷 ex) text/html , image/jpeg
- URI : Uniform resource identifier
- URL : Uniform resource locator (URI와 URL은 보통 같은의미로 사용된다)
- 리소스가 어디있는지를 설명해서 리소스를 식별한다. (urn은 이름으로 식별)
- URN : Uniform resource name
- 리소스의 위치에 영향받지않는 유일무이한이름. 어떤 네트워크 프로토콜을 사용해도 동일한 리소스가 반환되어야한다.
- 텔넷 유틸리티는 키보드를 목적지로 TCP 포트로 연결해주고, 출력 TCP 포트를 원격화면을 출력해준다.
```sh
$ telneet www….com 80
~
$ GET /abc.html HTTP/1.1
$ HOST: www….com
~
응답
...
```
- nc (netcat)은 HTTP를 포함한 UDP 혹은 TCP기반의 트래픽을 조작하고 스크립트할 수 있게 해준다.
## 웹의 구성요소
- 프락시 : 클라~서버 사이 위치한 HTTP 중재자, 주로 보안 용도
- 캐시 : 자주 조회되는 리소스의 사본을 저장하는 특별한 종류의 HTTP 프락시 서버
- 게이트웨이 : 다른 서버들의 중재자 서버, 주로 HTTP 트래픽을 다른 프로토콜로 변환하기위해 사용.
- 터널 : 데이터를 열어보지않고 그대로 전달해주는 HTTP 애플리케이션
- 암호화된 SSL 트래픽을 HTTP 커넥션으로 전달하여 웹트래픽만 허용하는 사내방화벽을 통과시키는 예
- 에이전트 : 웹 요청을 만드는 애플리케이션은 뭐든 ex) 브라우저, 봇
# 2. URL과 리소스
- URL 문법
- `
://:@:/;?#`
- parameter : 특정 스킴에서 입력 파라미터를 기술하는 용도
- query : 스킴에서 애플리케이션에 파라미터를 전달하는데 쓰인다. &로 구분
- fragment : 서버로 전달되지는 않고, 브라우저에서 처리한다. ex) 스크롤이동
- 단축 URL (상대경로)
1. 기저 url 스킴 상속받는경우
2. html 에서는 기저 url을 가리키는 `` 태그 사용가능
- 안전하지 않은 문자
- 안전한 문자로 제공하고자 US-ASCII에서 지원하는 문자만 허용, 그외는 인코딩 필요
- 인코딩은 %12 같은 ASCII 코드로 표현되는 두개의 16진수 숫자로 이루어진 문자
- URL에서 예약어로 사용되는 문자의 경우 인코딩이 필수 -> java URL.encode()
> spring에서 parameter는 디코딩해서 들어올까??
- URN은 어떻게?
- 대략 프록시 방식으로 보임. resource resolver가 실제 리소스위치와 고정 Path를 매핑해주는 방식
# 3. HTTP 메서드
- 메세지 흐름
- 인바운드 : 서버방향
- 아웃바운드 : 사용자 에이전트 방향
- HTTP 메서드는 다운스트림으로 흐른다. client -> proxy1 -> proxy2 -> [server] -> proxy2 -> proxy1 -> client
- 요청에서 proxy1은 server의 업스트림,
- 응답에서 proxy1은 server의 다운스트림
- 메세지에서 버전번호는 어떤 애플리케이션이 지원하는 가장 높은 HTTP 버전을 가르킨다.
- 응답에서 HTTP/1.1 은 응답을 보낸 애플리케이션이 HTTP/1.1까지 이해할 수 있다는 의미
- 헤더의 컨텐츠가 길면 추가줄 앞에 하나의 스페이스 혹은 탭문자를 포함하여 줄내림을 할 수 있다.
## 메서드
- HEAD : HTTP/1.1 을 준수하기 위해서는 HEAD 메서드가 반드시 구현되어야한다.
- PUT : 새문서를 만들거나, 이미 존재한다면 교체하는 용도
- POST : 입력데이터를 서버에 전달하기 위한 용도 (?)
- TRACE : 주로 진단을 위해 사용되며, proxy를 거쳐 서버에 도달하는 과정을 추적, 본문없이 헤더에 포함되어야한다.
## 상태코드
- 100~199 : 정보성 상태코드
- 100 Continue : 클라이언트는 나머지 요청을 이어서 보내야함을 의미,
- client : header Expect 100-continue 를 포함해서 요청해야한다.
- server : 100 으로 응답.
- 의미가 애매해서 잘 사용되지 않음.
- 200~299 : 성공 상태코드
- 200 : 상태
- 201 created : post,put의 성공응답, 생성된 리소스에 대한 구체적 참조가 담긴 location 헤더를 포함해야한다.
- 202 accepted : 요청은 받아들여졌으나, 서버는 아직 어떤 동작도 수행하지 않은 상태
- 206 partitial content : 클라이언트가 Range 헤더를 포함하여 요청한경우, 서버는 Content-Range, Date 등의 헤더를 반드시 포함하여 범위요청 성공응답을 보내야한다.
- 300~399 : 리다이렉션 상태 코드
- 302 Found : HTTP/1.0 에서 클라이언트는 Location 헤더값으로 GET 요청을 보낼것.
- 303 SeeOther : HTTP/1.1에서 클라이언트는 Location 헤더값으로 GET 요청을 보낼것. (POST 요청이라도)
- 307 Temporary Redirected : HTTP/1.1 에서 302,307 혼란을 막기위해 장려하는 코드.
- 서버는 적절한 리다이렉트 코드 사용을 위해 클라이언트 버전 검사가 필요하다.
- 400~499 : 클라이언트 에러상태 코드