저번시간까지 HTTP에 대해서 알아보았는데,
GET 메서드와 POST 메서드에 대해 더 알아보고
HTTP 통신에 사용되는 쿠키와 세션에 대해 알아보려고 한다.
참고: https://github.com/WeareSoft/tech-interview/blob/master/contents/network.md#http%EC%99%80-https
HTTP를 알아보자 (1): https://slumpdev.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-HTTP%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
✔️ GET vs POST ?
앞선 HTTP 알아보자 1번 게시글에 간단한 GET과 POST 뜻을 알아보았다.
조금 더 deep하게는 의미가 해당 docs의 9.3.1과 9.3.2에 나와있다.
직역하면 다음과 같다. (https://httpwg.org/specs/rfc9110.html#GET)
The GET method requests transfer of a current selected representation for the target resource. A successful response reflects the quality of "sameness" identified by the target URI.
The HEAD method is identical to GET except that the server MUST NOT send content in the response. HEAD is used to obtain metadata about the selected representaition without transferring its representation data, often for the sake of testing hypertext links or finding recent modifications.
1) GET 메소드는 대상 리소스에 대한 현재 선택된 표현의 전송을 요청한다.
성공적인 응답은 대상 URI에 의해서 식별된 같은 품질을 반사한다.
2) HEAD 메소드는 응답으로 서버에 내용을 보내지 않아야 한다는 것을 제외하고는
GET과 동일하다. HEAD는 (be used to 동사원형) 획득하는데 사용된다.
표현 데이터를 전송하는 것 없이 선택된 표현에 관한 메타 데이터를.
종종 하이퍼텍스트 링크들을 테스트하거나 또는 최근 수정들을 찾거나 하기 위해서.
해석해보자면 GET 메소드는 서버에 요청을 하고 성공적으로 응답을 받으면
서버에 요청한 데이터를 가져와서 보여주는 것이다.
HEAD 메소드는 응답으로 내용을 전송하는 것을 제외하고 GET과 동일한데,
데이터를 가져와서 보여주는 것이 아닌 데이터(값)이나 상태를 변경하는 과정을
수행하여 해당 메타 데이터를 획득하는 데에 사용하는 것이다.
더 이해하기 쉬운 자세한 설명은 깃허브에 나와있다.
➡️ GET Method
- 정보를 조회하기 위한 메서드로 서버에서 어떤 데이터를
가져와서 보여주기 위한 메소드이다. (가져오는 것, SELECT)
- URL 끝에 ? 문자가 붙고, 요청 정보가 key=value 형태로 쌍을 이루면서 ? 문자 뒤에 붙는다.
- 붙은 문자는 서버로 전송되고, 요청 정보가 여러 개일 경우에는 & 문자로 구분한다.
- URL에 요청 정보가 이어붙기 때문에 대용량 데이터를 전송하기 어렵다.
- 요청 정보를 사용자가 쉽게 눈으로 확인할 수 있어서 POST 방식보다 보안상 취약하다.
- HTTP 패킷의 Body 부분은 빈 상태로 전송하는데, Body의 데이터 타입을 표현하는
Content-Type 필드도 HTTP Request Header에 들어가지 않는다는 것을 의미한다.
- GET 방식은 캐싱을 사용할 수 있고, POST 방식보다 빠른 장점이 있다.
➡️ POST Method
- 서버의 값이나 상태를 바꾸기 위한 용도의 메소드이다.
(수행하는 것, INSERT, UPDATE, DELETE)
- 요청 정보를 HTTP 패킷의 Body 내부에 숨겨 서버로 전송한다.
- Request Header의 Content-Type 필드에 해당 데이터 타입이 표현되고,
전송하고자 하는 데이터 타입을 적어야한다.
(Default는 application/octet-stream, txt는 text/plain, 파일은 multipart/form-data)
- Body 내부에 숨겨 요청 정보를 전송하므로 대용량 데이터를 전송하기에 적합하다.
- 전송 과정은 클라이언트가 데이터를 인코딩하여 서버로 전송하고,
전송받은 데이터를 서버가 디코딩하여 읽는다.
- 요청 정보를 쉽게 확인할 수 없어서 GET 방식보다 보안상 안전하다.
해당 깃허브에서 적혀있는 질문이 흥미로운데, 알고가면 좋을 것 같다.
Q. 조회하기 위한 용도로 POST 방식이 아닌 GET 방식을 사용하는 이유는?
1. 설계 원칙에 따라 GET 방식은 서버에게 다수의 요청에도 동일한 응답을 받아야한다.
이것을 멱등성, Idempotent라고 하는데 해당 용어는 연산을 여러 번 적용하더라도
결과가 달라지지 않는 것을 의미한다고 한다. GET 방식은 가져오는 것으로,
서버의 데이터나 상태를 변경시키지 않기 때문에 조회에 사용하는 것이다.
ex) 게시판 목록의 게시글 조회, 전체 게시글 조회 등
2. 웹에서 모든 리소스는 Link 할 수 있는 URL을 가져야 한다.
어떠한 웹 페이지를 보고 있을 때 다른 사람에게 주소를 공유하기 위한 URL이 존재해야 하고, 원하는 페이지로 바로 이동하거나 이동시키기 위해서는 해당 링크의 정보가 필요하다.
이때, POST 방식을 사용하면 링크의 정보가 Body에 존재하여 URL만 전달할 수 없으므로
GET 방식을 사용해야 한다. 하지만, 글을 저장하는 경우에는 URL을 제공할 필요가 없어서
POST 방식을 사용해야 한다.
✔️ 쿠키와 세션 ?
쿠키와 세션은 HTTP 프로토콜이 가지지 못하는 속성 때문에 만들어졌다고 한다.
HTTP 프로토콜은 앞서 공부한 것처럼 Connectionless와 Stateless 속성을 가지기 때문에,
모든 요청 동안에 의존관계가 없어서 현재 접속한 사용자가 과거에 접속했던 사용자와
동일한 사용자인지 확인할 방법이 없다. 통신할 때마다 새롭게 연결하기 때문에
사용자는 매 요청마다 인증을 해야한다는 단점을 해결하기 위해 이전 요청과 현재 요청이
같은 사용자의 요청인지 알기 위해 상태를 유지하는 기술로 쿠키와 세션을 사용하는 것이다.
🍪 쿠키
- 클라이언트(사용자)의 로컬 상에 저장되는 키와 값에 대한 파일이다.
- 이름, 값, 유효한 시간, 경로 등의 정보를 포함한다.
- 클라이언트의 상태 정보를 브라우저에 저장한다. (크롬 방문기록 삭제 항목처럼,,)
- 구성 요소로는 쿠키 이름(name), 쿠키 값(value),
쿠키 만료시간(Expires), 쿠키 전송할 도메인(Domain),
쿠키 전송 경로(Path), 보안 연결 여부(Secure), HttpOnly 여부(HttpOnly) 가 있다.
➡️ 쿠키의 동작 방식
1) 웹 브라우저(클라이언트)에서 서버에 요청한다.
2) 상태를 유지하고 싶은 값을 쿠키로 생성한다.
3) 서버에서 HTTP 헤더(Set-Cookie)에 쿠키를 함께 클라이언트에 전송한다.
4) 전달받은 쿠키는 웹 브라우저에서 관리하고 있다가,
다음 요청에 쿠키를 HTTP Header에 넣어서 전송한다.
5) 서버에서는 쿠키 정보를 읽고 이전 상태 정보를 확인한 다음 응답한다.
① GET /test > ③ Set-Cookie: id=guest > ④ GET /test Cookie: id=guest
🛤️ 세션
- 일정한 시간 동안에 동일한 브라우저로부터 들어오는 요청을 하나의 상태로 보고
그 상태를 유지하는 것으로 웹 브라우저를 통해 서버에 접속한 후부터
브라우저를 종료할 때까지 유지되는 상태이다. (흔히 얘기하는 로그인, 로그아웃)
➡️ 세션의 동작 방식
1) 웹 브라우저(클라이언트)가 서버에 요청한다.
2) 서버가 해당 웹 브라우저(클라이언트)에게 유일한 ID인 Session ID를 부여한다.
3) 서버가 응답할 때 HTTP Header인 Set-Cookie에 Session ID를 포함해서 전송하고,
쿠키에는 Session ID를 JSESSIONID라는 이름으로 저장한다.
4) 이후, 웹 브라우저는 브라우저를 닫기까지 다음 요청 때 부여된
Session ID가 담겨있는 쿠키를 HTTP Header에 넣어서 전송한다.
5) 서버는 Session ID를 확인하고, 해당 세션에 관련된 정보를 확인한 후 응답한다.
① POST /login > ③ Set-Cookie: JSESSIONID=azx2cv
> ④ GET /test Cookie: JSEESIONID=azx2cv
❗ 쿠키와 세션의 차이점 ?
깃헙에 정리된 쿠키와 세션의 차이점은 크게 4가지로 구성되어 있다.
1) 저장 위치: 쿠키는 클라이언트에, 세션은 서버에 저장된다.
2) 보안: 쿠키는 클라이언트에 저장되므로 보안에 취약하지만,
세션은 쿠키를 이용해 Session ID만 저장하고 해당 값으로 구분하여
서버에서 처리하기 때문에 비교적 보안성이 좋다.
3) 라이프사이클: 쿠키는 만료시간에 따라 브라우저를 종료해도 계속 남아있을 수 있지만,
세션은 만료시간을 정해도 브라우저가 종료되면 만료시간에 상관없이 삭제된다.
4) 속도: 쿠키는 클라이언트에 저장되어 서버에 요청 시 세션보다 빠르고,
세션은 실제 저장된 정보는 서버에 있어 서버의 처리가 필요해 쿠키보다 느리다.
이러한 쿠키와 세션, 올라가서는 HTTP 메소드,
더 올라가서는 HTTP 서버에 관해서 직접 만들어보고 공부해보면서
이론을 흡수해보는 방향으로 가면 될 것 같다.
화이팅 💪
'Study > 네트워크' 카테고리의 다른 글
[네트워크] NAT 그리고 SNAT/DNAT/FNAT (0) | 2024.06.30 |
---|---|
[네트워크] TCP vs UDP (0) | 2024.04.21 |
[네트워크] HTTP를 알아보자 (1) (0) | 2022.10.03 |