기록을 합시다.
HTTP, Session, Cookie 정리 본문
HTTP
HTTP 개념
- HTTP(Hypertext Transfer Protocol)이란 인터넷에서 데이터를 주고받기 위한 통신 규약으로, 웹에서 클라이언트와 서버 간에 데이터를 주고 받을 때 사용된다.
HTTP 목적
- 클라이언트와 서버 간에 웹 리소스(HTML 문서, 이미지, 동영상 등)을 주고 받는 것이다. 클라이언트는 웹 브라우저를 통해 서버에게 HTTP 요청을 보내고, 서버는 클라이언트에게 HTTP 응답을 전송해준다.
HTTP 특징
- 비연결성(Connectionless): 클라이언트가 요청을 보내고 서버가 응답을 보내면 연결이 끊긴다. 이런 특징으로 서버의 자원을 효율적으로 사용할 수 있다.
- 무상태성(Stateless): HTTP 요청과 응답은 서로 독립적으로 이루어지기 때문에, 서버는 클라이언트의 이전 상태를 기억하지 않는다. 이런 특징으로 서버의 부하를 줄일 수 있다.
- 요청 메서드(Method) : 클라이언트가 서버에 보내는 요청의 종류를 나타낸다. 대표적인 요청 메서드로는 GET, POST, PUT, DELETE가 있지만 GET, POST만 주로 사용한다. (관련 포스트 : rest - Is there any reason not to use HTTP PUT and DELETE in a web application? - Stack Overflow)
- 응답 코드(Status Code) : 서버가 클라이언트에게 보내는 응답의 상태이다.
응답코드 | 의미 |
1xx | 처리 중 |
100 | 계속 |
101 | 전환 |
2xx | 성공 |
200 | 요청 성공 |
201 | 작성됨 |
202 | 허용됨 |
204 | 내용 없음 |
3xx | 리다이렉션 |
300 | 다중 선택 |
301 | 영구적인 이동 |
302 | 임시적인 이동 |
304 | 수정되지 않음(캐시 사용) |
4xx | 클라이언트 오류 |
400 | 잘못된 요청 |
401 | 권한 없음 |
403 | 금지됨 |
404 | 찾을 수 없음 |
5xx | 서버 오류 |
500 | 내부 서버 오류 |
502 | 게이트웨이 오류 |
503 | 서비스를 사용할 수 없음 |
504 | 게이트웨이 시간 초과 |
HTTP 단점
- 보안성 부족 : HTTP는 평문으로 데이터를 주고받기 때문에 데이터가 노출될 확률이 있다. (HTTPS로 단점 보완 가능)
- 상태 정보의 부재 : HTTP는 상태 정보를 유지하지 않기 때문에, 모든 요청에 대해 새로운 연결을 생성해야 한다.(Session, Cookie가 쓰이는 이유)
- 성능 : HTTP는 단순한 프로토콜이기 때문에 대용량 데이터 전송 혹은 비동기적 통신에 적합하지 않다.
- 대역폭 문제 : HTTP는 각가의 요청에 대해 별도 연결을 생성하기에, 대규모 트래픽이 발생하면 지연이 일어날 수 있다. (캐싱, CDN, 헤더 최적화, HTTP/2 혹은 HTTP/3 사용으로 문제 해결 가능)
HTTP 종류
- HTTP/1.1 : 현재 가장 널리 사용되는 HTTP 버전
- HTTP/2 : 2015년에 발표된 HTTP 버전, 성능 개선 및 보안 강화 등의 특징을 갖고 있다.
- HTTP/3 : 기존의 TCP 대신 QUIC 프로토콜을 사용하여 전송 속도를 높인 특징을 갖고 있다. (한국에서는 네이버가 최초로 웹페이지에 HTTP/3을 도입했다고 한다.)
HTTP 요청 메시지/응답 메시지
HTTP 요청/응답 메시지 형태
[HTTP 요청 라인]
[HTTP 요청 헤더]
[빈 줄]
[HTTP 요청 바디 => GET 요청 시에는 사용 안 하고, POST, PUT 요청 시에는 사용한다.]
- HTTP 요청 라인에는 요청 메서드, 요청 URI, HTTP 프로토콜 버전이 포함된다.
- HTTP 요청 헤더에는 클라이언트의 요청에 대한 추가 정보를 포함한다. (GET 요청 시, 추가 정보를 헤더에 담는다. 바디에 담게 되면 404에러 뜨니 조심)
- HTTP 요청 바디는 POST나 PUT과 같은 요청 메서드를 사용할 때 전송되는 데이터를 포함한다.
Cookie
Cookie 개념
- 쿠키(Cookie)는 웹사이트가 클라이언트의 웹 브라우저에 저장하는 작은 데이터 조각이다. 주로 인증, 세션 관리, 개인화 등의 목적으로 사용된다. 쿠키는 클라이언트와 서버 간의 상태를 유지하고 정보를 교환하는 데 사용된다.
Cookie 목적
- 세션 관리: 쿠키는 사용자의 세션을 식별하고, 로그인 상태를 유지하며, 사용자의 활동을 추적하는 데 사용된다.
- 개인화: 쿠키는 사용자의 선호 설정이나 기타 사용자 지정 요소를 기억하여 개인화된 경험을 제공하는 데 사용된다.
- 추적 및 분석: 쿠키는 사용자의 웹사이트 방문 기록을 추적하고 분석하여 웹사이트의 성능을 개선하거나 광고 타겟팅을 위한 정보를 수집하는 데 사용된다.
Cookie 특징
- 상태 저장: 쿠키는 클라이언트의 웹 브라우저에 저장되어, 클라이언트와 서버 간의 상태를 유지한다.
- 작은 용량: 쿠키는 작은 크기의 데이터이기 때문에 브라우저의 로컬 저장소에 쉽게 저장할 수 있다.
- 제한된 수명: 쿠키는 만료 날짜 또는 수명을 가지며, 지정된 기간 이후에는 자동으로 삭제된다.
Cookie 구현 방식
- 웹 서버는 HTTP 응답 헤더에 Set-Cookie 헤더를 포함하여 쿠키를 생성한다. 이 때, Set-Cookie 헤더는 쿠키의 이름, 값, 속성 및 옵션을 포함한다.
- 생성된 쿠키는 HTTP 응답 헤더를 통해 클라이언트의 웹 브라우저로 전송한다. 클라이언트는 쿠키를 웹 브라우저의 쿠키 저장소에 저장한다.
- 이후 클라이언트의 웹 브라우저는 동일한 웹 사이트에 대한 요청을 보낼 때마다, 자동으로 해당 웹 사이트와 관련된 쿠키를 HTTP 요청 헤더에 포함하여 서버로 전송한다.
- 웹 서버는 클라이언트로부터 받은 HTTP 요청 헤더에서 쿠키를 읽어서 필요한 작업을 수행하며, 쿠키의 값을 활용하여 세션 관리, 사용자 식별, 개인화 등을 할 수 있다.
Cookie 단점
- 쿠키는 클라이언트 측에 저장되므로 개인정보 유출의 위험이 있다. 쿠키에는 사용자 식별 정보, 선호 설정, 검색 기록 등이 저장될 수 있으며, 이러한 정보가 불법적으로 탈취되거나 악용될 수 있다. '
- 쿠키는 클라이언트와 서버 간의 통신을 위해 사용되므로 보안 취약점이 될 수 있다. 쿠키가 조작되거나 탈취되면 중간자 공격, 세션 하이재킹 등의 공격이 발생할 수 있다.
- 용량 제한: 쿠키는 작은 크기의 데이터만 저장할 수 있기 때문에, 복잡한 정보나 대량의 데이터를 저장하기에는 제한이 있다. 큰 용량의 데이터를 저장해야 할 경우에는 다른 저장 방식을 고려해야한다.
Session
Session 개념
- Session은 웹 서버에서 클라이언트를 구분하고, 그 상태를 유지하기 위한 기술이다.
Session 특징
- 클라이언트별로 구분되어 데이터를 저장하고 유지한다.
- 서버에 Session 데이터를 저장하기 때문에 요청을 빠르게 처리할 수 있다.
- Session ID를 이용하기 때문에 클라이언트 정보를 암호화하고 유지한다.
- 서버의 메모리를 이용하기 때문에, 많은 클라이언트가 접속하면 서버 부하가 일어날 수 있다.
Session 구현 방식
- Session은 대개 쿠키와 함께 사용된다. 클라이언트가 서버에 최초로 요청을 하면, 서버는 클라이언트를 식별할 수 있는 Session ID를 생성하고, 쿠키에 담아 응답한다.
- 클라이언트는 이후 요청에 서버로부터 받은 SessionID가 들어있는 쿠키를 포함하여 서버에 요청하고, 서버는 클라이언트가 보낸 쿠키의 SessionID를 확인 및 Session 데이터를 참조해 사용자임을 식별하고 요청에 대한 응답을 보내준다.
Session 단점
- 세션은 대부분 서버에 저장되기 때문에 서버 메모리가 부족해질 수 있고, 또한 SessionID를 탈취하여 클라이언트 정보를 유출할 수 있다는 보안상의 문제가 있다.
Spring을 공부하다가, 세션과 쿠키에 대한 지식이 매우 많이 부족한 것 같아서 공부하는 겸 한 번 정리해봤다..
특히 세션과 쿠키가 무슨 연관이 있는지 궁금했었는데, 이 포스트를 작성하면서 많이 이해한 것 같다.
'공부 > etc' 카테고리의 다른 글
[NCP] 네이버 클라우드에서 MySQL 서버 구축하기 (0) | 2023.06.23 |
---|---|
[docker] docker-compose를 이용하여 mariadb+apache2+tomcat9 연동하기 (0) | 2023.05.25 |
Hyper-V Ubuntu 디스크 용량 늘리기 (0) | 2023.04.21 |
[docker] Mount 명령어를 이용해 컨테이너끼리 폴더 공유 하기(feat. Apache, Tomcat) (0) | 2023.04.21 |
[docker] network 명령어를 이용해 Apache2+Tomcat9+MariaDB 연결하기(feat. WAR 파일) (0) | 2023.04.21 |
Comments