프로토콜이란 상호 간에 정의한 규칙을 의미하며 특정 기기 간에 데이터를 주고받기 위해 정의되었다. 웹 문서를 주고 받을 때는 HTTP를 사용해야하고 파일을 주고 받을 때는 FTP, 메일은 SMTP, POP 등 전송 계층과 유형에 따라 다양하게 만들어져있다.
HTTP는 Hypertext Transfer Protocol의 약자이며 인터넷에서 하이퍼텍스트 문서인 HTML로 만든 웹페이지를 전송하기 위해 사용되는 프로토콜이다. 위의 프로토콜 설명과 연관지어 쉽게 풀이하면 웹 브라우저와 웹 서버가 통신하는 절차와 형식을 규정한 것이다.
아래의 그림을 보고 알 수 있다시피 HTTP프로토콜에서는 클라이언트에 의해 전송되는 메시지를 요청(Request)이라 하고, 요청에 대해 서버에서 응답으로 전송하는 메시지를 응답(Response)이라고 한다.
현재 내가 배우는 JSP에서 컨테이너는 요청된 데이터를 바탕으로 javax.servlet.http.HttpServletRequest
객체를 만들어서 전달해준다.
우리는 이 request 객체를 통해서 클라이언트가 요청한 Parameter를 가져올 수 있고 Atrribute를 이용한 메소드를 통해 추가적인 객체를 request에 담아줄 수 있다.
JSP에서 클라이언트 요청 시 response - javax.servlet.http.HttpServletResponse
객체가 생성되고 요청에 대한 처리가 완료되면 소멸 된다.
우리는 이 response 객체를 헤더 정보에 추가로 내용을 넣거나 쿠키 전송, 클라이언트 페이지가 쿼리스트링을 가지고 다른 페이지로 이동할 수 있게 하도록 할 때 사용한다.
response 객체가 가진 정보는 HTML 코드나 getWriter() 메소드를 이용해서 출력이 가능하다.
만약 클라이언트가 서버에 요청을 보내면 응답을 받고 난 후에도 계속 서버에 접속된 상태로 남아있다면 서버에 접속하는 클라이언트의 수가 많아 질수록 서버에서 낭비되는 자원의 수가 커질것이다.
HTTP는 이와 반대로 서버에 연결하고, 요청해서 응답을 받으면 연결을 끊어버리는Connectionless
의 방식으로 작동한다. 그로인해 서로 요청과 응답만 처리하고 '상태'는 기록하지 않는 Stateless
의 특징도 가진다.
- Connectionless(비연결성)
기본적으로 하나의 연결에 하나의 자원처럼 최소한의 자원만 사용하며 클라이언트가 서버에 요청하여 응답을 받으면 TCP/IP를 끊어 연결을 유지하지 않는다. 덕분에 효율적으로 자원을 관리할 수 있으며 동시접속자가 아닌 수 많은 클라이언트의 요청도 대응할 수 있다.
하지만 이러한 특징때문에 단점이 생기기도 한다.
(1) 연결이 끊기고 다시 새로 연결될 때 TCP/IP 연결을 새로 맺어야 하므로 3-way handshake에 따른 시간이 추가된다.(Overhead)
(2) 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css, 추가 이미지 등 수 많은 자원이 함께 다운로드 된다.
※ 현재는 HTTP의 지속 연결(Persistent Connection)으로 문제 해결.- Stateless(무상태성)
비연결성으로 인해 연결이 끊어질 때 상태가 저장되지 않기 때문에 다시 연결될 때에 모든 정보를 담아서 요청한다. 그로인해 요청이 복잡해지지만 요청을 한 번에 주기 때문에 비용을 최소화할 수 있는 강점이 있다.
이 비용 부분은 서버가 확장될 수록 비용이 커지기때문에 서버의 확장성에 용이하다는 것과도 직결된다.
Stateful(상태유지)은 Stateless의 반대 개념이라고 생각하면 된다. 클라이언트-서버 관계에서 서버가 클라이언트의 '상태'를 보존하는 것이다. 이 상태를 보존하는 것으로 인해 Stateful 또한 다음과 같은 특징을 지닌다.
(1) 상태 저장에 대한 요청은 서버 측 상태에 따라 달라지게 된다.
(2) 상태에 대해 저장해야하기 때문에 백업 스토리지가 요구된다.
URI(Uniform Resource Identifier)은 통합 자원 식별자라고 하며 웹 기술에서 사용하는 논리적 또는 물리적 리소스를 식별하는 고유한 문자열 시퀀스이다. 고유 주소라는 의미를 가지며 우리가 보는 인터넷 웹 주소를 URL이라 부르지만 사실 URI라고 할 수 있다.
URI의 하위 요소로 URL과 URN이 존재한다.
URL(Uniform Resource Locators)은 네트워크 상에서 자원이 어디 있는지를 알려주기 위한 규약이다. 흔히 웹 사이트 주소로 알고 있지만, URL은 웹 사이트 주소뿐만 아니라 컴퓨터 네트워크상의 자원을 모두 나타낼 수 있다.
URN(Uniform Resource Name)은 통합 자원 이름이라고 하며 http와 같은 프로토콜을 제외하고 리소스의 name을 가리키는데 사용된다. 리소스가 이동해도 항상 리소스를 가리킬 수 있는 유일한 이름으로 이름을 변하지 않게 유지하는 한, 여러 종류의 네트워크 접속 프로토콜로 접근해도 문제없다.
그렇다고 할 수 있고 아니라고 할 수 있다. 검색으로 나온 수 많은 포스팅에서 스스로 끼워 맞췄다 라는 얘기가 많을 정도로 구분이 애매모호하다고 생각이 된다. 그리고 애초에 URN은 잘 사용하지 않기때문에 대부분 URL이자 URI인 것으로 보인다. 그러나 URI가 URL보다 상위 개념이자 URN이 더해진 것이기때문에 외국에서도 한참 전부터 URI로 부르고 있다. 즉 URI로 부르는 것이 더 정확한 표현이다.
https://velog.io/@younoah/uri-url-urn (url, uri, urn)
https://joshua1988.github.io/web-development/http-part1/ (HTTP)