goal
- Browser
- Server
- API
- HTTP
- Ajax
- Fetch
- 웹이라는 공간에서 데이터가 어떤 형태로 전달되는지 이해한다
- 서버와 어떻게 통신하는지 이해한다
Web Architectures
- 클라이언트, 서버, API의 정의
- Browser의 역할
- Browser와 서버와의 연결이 어떤 규약(protocol)을 통해 이루어지는지
- 서버에서 정의한 API 문서를 통해, 서버가 제공하는 리소스를 이용해보기
- API를 활용해서 UI를 만들기
- AJAX가 무엇이고, 왜 필요한지
- AJAX 통신을 가능하게 하는 API (fetch API 등)을 이용하기
Browser Security Model
- CORS
- XSS
- CORS가 왜 필요한지
- XSS 및 CSRF가 어떤 원리를 통한 공격 방법인지
- XSS 및 CSRF를 어떻게 방지하는지
HTTP Request
URL + 요청메서드 ➡️ 서버HTTP Response
상태코드 + 응답body ⬅️ 서버아래를 참고
URL을 브라우저에 입력하면 어떤 순서로 컴퓨터는 일을 처리할까?
STEP 1: 도메인 이름 탐색
1) DNS 서버에 접속한 후, www.google.com 의 IP가 무엇인지 요청
2) DNS 서버는 요청에 대한 응답으로 216.58.197.196 리턴
STEP 2: 웹 서버(HTTP) 요청 (request)
1) 웹 서버의 라우팅(routing: 주소 탐색 규칙)에 따라 요청 처리
2) 서버가 요청에 대한 응답을 자원(resource: HTML/JS 파일 등)의 형태로 전달
3) 서버가 보내주는 자원을 브라우저에서 처리
API
: HTTP 요청으로 원격 서버에 요청(RPC: Remote procedure call)할 수 있도록 외부로 노출된 추상화된 인터페이스
REST (REpresentational State Transfer / 표현 상태 전송)
: API 디자인에 있어서 HTTP 프로토콜을 의도에 맞게 사용하도록 정의된 아키텍쳐 스타일 /
http 동사와 URL 명사의 특정 조합을 사용하는 서버 응용 프로그램에 대한 인터페이스를 구성하는 패턴
RESTFUL API
: 나머지 패턴을 따르는 인터페이스
Verbs | Endpoint | Action |
---|---|---|
GET | /api/users | 모든 사용자를 조회 |
POST | /api/users | 새 사용자를 리스트에 추가 |
PUT | /api/users/{username} | 특정 사용자의 정보를 갱신 |
DELETE | /api/users/{username} | 특정 사용자의 정보를 삭제 |
GET | /api/users/{username} | 특정 사용자의 정보를 조회 |
정의 : 데이터를 주고받을 수 있는 클라이언트와 서버 간 프로토콜(규약, 규칙, 약속)
: http 메시지는 항상 요청(request)과 응답(response)으로 이루어진다
요청 (request) | 응답 (response) |
---|---|
[구성 요소] - HTTP 메서드 클라이언트가 수행하고자 하는 동작을 정의한 GET, POST 등 - 가져오려는 리소스의 경로 예를 들면 프로토콜(http://), 도메인(developer.mozilla.org), or TCP 포트(80)인 요소들을 제거한 리소스의 URL - HTTP 프로토콜의 버전 - 서버에 대한 추가 정보를 전달하는 선택적 헤더들 - POST와 같은 몇 가지 메서드를 위한, 전송된 리소스를 포함하는 응답의 본문과 유사한 본문 | [구성 요소] - HTTP 프로토콜의 버전 - 요청의 성공 여부와, 그 이유를 나타내는 상태 코드 - 아무런 영향력이 없는, 상태 코드의 짧은 설명을 나타내는 상태 메시지 - 요청 헤더와 비슷한, HTTP 헤더들 - 선택 사항으로, 가져온 리소스가 포함되는 본문 |
- General 헤더 : Via와 같은 헤더는 메시지 전체에 적용됩니다. - Request 헤더 : User-Agent, Accept-Type와 같은 헤더는 요청의 내용을 좀 더 구체화 시키고(Accept-Language), 컨텍스를 제공하기도 하며(Referer), 조건에 따른 제약 사항을 가하기도 하면서(If-None) 요청 내용을 수정합니다. - Entity 헤더 : Content-Length와 같은 헤더는 요청 본문에 적용됩니다. 당연히 요청 내에 본문이 없는 경우 entity 헤더는 전송되지 않습니다. | - General 헤더 : Via와 같은 헤더는 메시지 전체에 적용됩니다. - Response 헤더 : Vary와 Accept-Ranges와 같은 헤더는 상태 줄에 미처 들어가지 못했던 서버에 대한 추가 정보를 제공합니다. - Entity 헤더 : Content-Length와 같은 헤더는 요청 본문에 적용됩니다. 당연히 요청 내에 본문이 없는 경우 entity 헤더는 전송되지 않습니다. |
: 기본적으로 HTTP request는 header와 body를 가진다.
: 기본적으로 HTTP response도 header와 body를 가진다.
header | body |
---|---|
: origin(어디서 보내는 요청인가?), content-type(컨텐츠 타입은 무엇인가?), user-agent(어떤 클라이언트를 이용해 보냈는가?) 등의 정보를 가진다. | : 서버에 데이터를 보내기 위한 공간으로 활용한다. / body에는 method들이 존재한다. ( GET, POST, PUT, DELETE, OPTIONS 등 ) |
MDN HTTP 헤더에 대한 자세한 내용은 👉️ 여기를 참고
0. 공통 헤더 | Request & Response header |
---|---|
Date | HTTP 메시지가 만들어진 시각. 자동생성. (Date: Thu, 12 Jul 2018 03:12:27 GMT) |
Connection | (Connection: keep-alive) |
Cache-Control | 중요 |
Content-Length | 요청과 응답 메시지의 본문 크기를 바이트 단위로 표시 (Content-Length: 52) |
Content-Type | 컨텐츠의 타입(MIME)과 문자열 인코딩(utf-8 등등)을 명시 (Content-Type: text/html; charset=utf-8) |
Content-Language | 사용자의 언어 |
Content-Encoding | 컨텐츠 압축 방식 (Content-Encoding: gzip, deflate) |
1. 요청 헤더 | Request header |
---|---|
Host | 서버의 도메인 네임이 나타나는 부분 (Host: www.zerocho.com) |
User-Agent | 현재 사용자가 어떤 클라이언트(운영체제와 브라우저 같은 것)를 이용해 요청을 보냈는지에 대한 정보 (User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36) |
Accept | 요청을 보낼 때 서버에 이런 타입(MIME)의 데이터를 보내줬으면 좋겠다고 명시할 때 사용 (Accept: text/html image/png, image/gif).. |
Authorization | 인증 토큰(JWT든, Bearer 토큰이든)을 서버로 보낼 때 사용하는 헤더 (Authorization: Bearer XXXXXXXXXXXXX) |
Origin | POST같은 요청을 보낼 때, 요청이 어느 주소에서 시작되었는지를 나타내는 정보 / 요청을 보낸 주소와 받는 주소가 다르면 CORS 문제가 발생 |
Referer | 이 페이지 이전의 페이지 주소 정보 (Referer: https://www.zerocho.com/category/JavaScript) |
2. 응답 헤더 | Response header |
---|---|
stateless
: http의 각 요청은 모두 독립적이다. -> http 매 요청은 독립적 이기 때문에 state라는 것이 없다.connectionless
: 한번의 요청에는 한번의 응답을 한다. -> 응답 이후에는 연결이 끊기기 때문에, 더이상 응답을 할 수 없다.GET : 서버에 자원을 요청
POST : 서버에 자원을 생성 / 데이터를 서버로 제출하는 용도로 사용하며, 서버 상태의 변화를 일으킴
PUT : 서버의 자원을 수정 / POST와 비슷하나, 연속적인 요청시에도 같은 효과를 가져옴. 기존 데이터를 교체하는 용도로 쓰일 수 있음
DELETE : 서버의 자원을 제거
HEAD
OPTIONS
CONNECT
TRACE
PATCH
자세한 MDN HTTP 응답 상태 코드는 👉️ 여기를 참고
200 : 요청 성공
/ Success304 : 요청에 대한 응답이 수정되지 않음 (Cache)
/ Redirect403 : 컨텐츠에 접근할 권한 없음
/ Client errors404 : 요청받은 리소스를 사용할 수 없음
/ Client errors500 : 서버가 처리할 수 없는 요청
/ Server errorsXMLHttpRequest | jQuery | Fetch |
---|---|---|