Study/FE-Study

[WEB] HTTP / HTTPS

seo0h 2023. 6. 2. 21:27

면접 질문

  1. HTTP 프로토콜에 대해 설명해주세요
    HTTP는 데이터를 주고받기 위한 프로토콜이며, 서버-클라이언트 모델을 따릅니다. 비연결성, 무상태성 이라는 특징을 가져 쿠키와 세션과 같은 상태 정보 유지 기술이 등장하게 되었습니다.

  2. HTTP와 HTTPS의 차이점은 무엇인가요?
    이 둘의 차이점은 보안입니다. HTTP는 데이터를 평문으로 전달하는 반면 HTTPS 는 데이터를 암호화하여 전송합니다. SSL또는 TLS 프로토콜을 사용하여 데이터를 암호화합니다. 따라서 보안이 중요한 웹사이트난 애플리케이션에서는 HTTPS를 사용하는것이 권장됩니다. 

  3. HTTP 메서드(GET, POST, PUT, DELETE 등)의 역할과 각각의 차이점은 무엇인가요?
    GET 메소드는 서버로부터 리소스를 요청할때 사용되며 주로 조회할때 사용합니다. POST 메서드는 새로운 리소스를 생성하거나 데이터를 제출하기 위해 사용합니다. PUT메소드는 리소스를 업데이트 하거나 새로운 리소스를 생성하도록 요청합니다. DELETE 메소드는 특정 리소스를 삭제하도록 요청합니다. 클라이언트가 서버에게 요청을 보낼때 어떤 동작을 수행할지 지정하는데 사용됩니다.

  4. HTTP 상태 코드(200, 404, 500 등)의 의미를 말해보세요.
    401 코드는 클라이언트가 인증되지 않음을 의미합니다.
    500 코드는 서버 내부에 오류가 있음을 의미합니다.
    404 코드는 요청한 리소스를 서버에서 찾을 수 없음을 의미하며
    200 코드는 요청이 성공적으로 처리되었음을 나타냅니다.

  5. HTTP 헤더는 어떤 정보를 포함하고 있으며, 일반적으로 어떤 용도로 사용되나요?
    HTTP 헤더는 클라이언트와 서버 간의 통신에서 전송되는 추가 정보를 포함하는 부분입니다. 헤더는 요청과 응답 모두에서 사용되며, 다양한 용도로 활용됩니다. 헤더에는 데이터 유형, 인증, 클라이언트 브라우저 정보, 쿠키 및 캐시에 대한 정보가 담겨있습니다.

  6. 쿠키(Cookie)와 세션(Session)의 차이점에 대해 말해주세요.
    둘 다 웹 애플리케이션에서 사용자 상태를 유지하고 관리하는 데 사용되는 메커니즘입니다.
    쿠키는 클라이언트에 저장되고 클라이언트의 요청과 응답에 포함되며, 작은 양의 데이터를 저장하는 데 사용됩니다. 세션은 서버에 저장되고 세션 식별자를 클라이언트에 전달하여 사용자 상태를 관리하고 중요한 데이터를 안전하게 저장하는 데 사용됩니다.

  7. GET 과 POST 메소드의 차이점에 대해 알려주세요.
    GET과 POST는 둘 다<form>태그의method 속성으로 사용할 수 있지만, 가장 큰 차이점은 데이터의 전송 방식입니다. GET은 데이터를 URL의 일부로 전송하며, POST는 HTTP 요청의 본문(body)에 데이터를 담아 전송합니다. 이로 인해 GET은 URL에 데이터가 노출되어 브라우저 기록에 남을 수 있으며, 북마크로 저장할 수도 있습니다. 이러한 특징으로 인해 GET은 POST보다 상대적으로 보안에 취약할 수 있습니다

HTTP란?

https://developer.mozilla.org/ko/docs/Web/HTTP/Overview

HTTP(Hypertext Transfer Protocol)는 클라이언트와 서버 간 통신을 위한 프로토콜입니다.

HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이기도 합니다.

하나의 완전한 문서는 여러 불러온(Fetched) 하위 문서로 재구성됩니다.

💡 프로토콜이란?

Protocol : 외교 의례, 의전 / (조약의) 초안 / 통신 규약
컴퓨터 네트워크에서 데이터를 주고받는 데 사용되는 규칙의 집합입니다. 프로토콜은 송신자와 수신자 사이의 통신을 원활하게 하기 위해 정의되며, 데이터의 전송 방식, 포맷, 오류 처리, 보안 등을 포함합니다.
💡 클라이언트 - 서버 프로토콜이란?

클라이언트 측에 의해 요청이 초기화되는 프로토콜을 의미합니다. 클라이언트는 요청을 보내는 주체로, 웹 브라우저, 모바일 어플리케이션, IoT 장치 등이 클라이언트의 역할을 할 수 있습니다. 서버는 클라이언트의 요청을 수신하고, 해당 요청을 처리하여 응답을 반환하는 역할을 합니다.


특징

  • 비연결성(Connectionless)
    클라이언트와 서버가 연결을 맺은 후 응답이 마무리되면 연결을 끊습니다
  • 무상태성 (Stateless)
    HTTP는 상태를 가지고 있지 않습니다. 이를 해결하기 위해 쿠키와 세션이 등장하게 되었습니다.
  •  

역사

HTTP는 월드 와이드 웹에 내재된 프로토콜입니다.

💡 월드 와이드 웹 (Wolrd Wide Web)

WWW, W3, Web 으로 불리는 Wolrd Wide Web은 인터넷을 통해 접근 가능한 공용 웹페이지의 상호연결 시스템을 의미합니다. 웹은 인터넷과 다르며, 인터넷을 기반으로 하는 많은 응용 프로그램 중 하나입니다.

(HTTP/number 가 클수록 최신 버전)

  1. HTTP/0.9 : GET 만 가능, 단일 라인 구성
  2. HTTP/1.0 : 헤더 도입
  3. HTTP/1.1 : 파이프라이닝 도입, 캐시 제어 메커니즘 도입, HOST 헤더 도입
  4. HTTP/2 : 텍스트가 아닌 이진 프로토콜을 이용해 메시지 전달 → 기존 1.1보다 효율적인 데이터 전송
  5. HTTP/3: 전송 계층 부분에 TCP/TLS 대신 QUIC가 사용

개발자 모드에서 전송 프로토콜 타입을 확인 가능합니다.


HTTP 메시지

HTTP 메시지는 서버와 클라이언트 간 데이터를 교환하는 방식입니다. 요청과 응답 두가지의 타입이 있으며 ASCII로 인코딩된 여러 줄의 텍스트 정보로 구성되어 있습니다.

 

기본 구조

https://developer.mozilla.org/ko/docs/Web/HTTP/Messages

요청과 응답의 구조는 서로 비슷합니다.

  1. 시작 줄 : 실행되어야 할 요청, 요청 수행에 대한 성공 또는 실패가 기록되어 있습니다. 이 줄은 무조건 한줄로 끝납니다.
  2. HTTP 헤더 (옵션) : 요청에 대한 설명, 메시지 본문에 대한 설명
  3. 빈 줄(blank line) : 요청에 대한 모든 메타 정보가 전송되었음을 의미
  4. 요청과 관련된 내용, 응답과 관련된 문서 등 (옵션) : 이것의 존재 유무는 첫 줄과 HTTP 헤더에 명시

HTTP 메시지의 시작줄 ~ HTTP 헤더를 묶어 요청 헤드(Head) 라고 부릅니다.

HTTP 메시지의 페이로드는 본문(Body)이라고 합니다.


HTTP 헤더

위에서 말했듯, HTTP 요청 및 응답에서 전달되는 메타데이터입니다.

헤더이름과 해당 값을 쌍으로 가지며, 클라이언트 및 서버 간 통신을 제어하고 조절하는데 사용됩니다.

요청 및 응답에서 사용되는 주요 헤더 값

  • Content-Type: 요청이나 응답의 본문에 포함된 데이터의 유형을 정의합니다.
  • Authorization: 요청에 인증 정보를 포함하여 보안 접근 제어를 위해 사용됩니다.
  • User-Agent: 클라이언트 애플리케이션 또는 브라우저의 정보를 서버에 전달합니다. 이를 통해 서버는 클라이언트의 특성에 따라 적절한 응답을 제공할 수 있습니다.
  • Cookie: 서버가 클라이언트에게 전송한 쿠키를 포함합니다. 클라이언트는 이 헤더를 통해 서버에 저장된 상태 정보를 유지하고 관리할 수 있습니다.
  • Cache-Control: 클라이언트와 중개 서버(프록시) 간의 캐싱 동작을 제어합니다. 이를 통해 클라이언트나 중개 서버가 요청을 다시 서버로 전달하지 않고 캐시된 응답을 사용할 수 있습니다.
  • Location: 리다이렉션 응답에서 사용되며, 클라이언트에게 새로운 위치(URI)를 알려줍니다. 이를 통해 클라이언트는 새로운 위치로 자동으로 이동할 수 있습니다.

요청 메서드

클라이언트가 서버에게 요청하는 동작을 지정하는 방법입니다.

 

GET : 리소스 조회 메서드 (Read)

/user?name=seo&id=seo0h

오직 데이터를 받아올때만 사용됩니다.

넘어가는 데이터의 정보가 URL 에 노출되기 때문에 민감한 데이터를 처리할때는 사용하면 안됩니다.

요청이 브라우저에 기록이 남습니다.

요청을 캐시 가능합니다.

동적 데이터 조회는 쿼리스트링을 이용해 전달됩니다.

 

POST: 전달 데이터 처리 및 생성 요청 메서드 (Creat)

POST /user HTTP/1.1
Host: helloseo.com

?name=seo&id=seo0h

메시지 Body를 통해 서버로 데이터 전달됩니다.

요청 본문은 Content-Type 헤더에 타입 명시해야 합니다.

요청이 캐시되지 않습니다.

보내는 데이터 길이에 대한 제한이 없습니다.

요청이 브라우저 기록이 남지 않습니다.

 

PUT : 리소스를 수정 또는 생성(Update)

새로운 리소스를 생성 또는 대상 리소스를 나타내는 데이터를 대체합니다.

요청 페이로드를 사용합니다.

 

PATCH: 리소스 일부를 변경 (Update)

 

DELETE: 특정 리소스를 삭제 (Delete)

 

💡 Content-Type 헤더

리소스의 미디어 타입을 나타내기 위해 사용합니다.

보내는 데이터가 json, text, xml 일 경우: application/json
보내는 데이터가 form 일 경우: application/x-www-form-urlencoded
보내는 데이터가 바이너리 데이터(파일 업로드 등) 일 경우 multipart/form-data

 

GET - POST 특징 비교

둘 다 <form> 테그의 method로 사용할 수 있습니다.

                                                                                              GET  POST
뒤로가기 / 리로드 부작용이 없으며 이전과 같은 결과 리턴 데이터가 다시 제출될 것
북마크 ✅ 가능 ❌ 불가능
캐시 ✅ 가능 ❌ 불가능
인코딩 타입 application/x-www-form-urlencoded application/x-www-form-urlencoded or multipart/form-data , (이진 데이터를 전송할 때 multipart 인코딩을 사용 EX. 파일 다운로드 등)
기록 파라미터는 브라우저 기록에 남음 파라미터가 브라우저 기록에 남지 않음
데이터 길이 제 GET메소드는 URL에 데이터를 넣어 보내야 하기에, URL 최대 길이만큼 제한되어 있음
(URL 길이제한 : 2048 char)
제한 없음
데이터 유형 제한 ASCII 문자만 허용 제한이 없으며 이진 데이터도 허용
보안 데이터가 URL에 포함되기 때문에
POST에 비해선 덜 안전 

❗민감한 정보는 GET을 통해 전송하면 절대 안됨
상대적으로 GET보다는 조금 더 안전. 
매개변수가 브라우저 기록이나 웹 서버에 남지 않기 때문.
가시성 URL에 있는 데이터는 모두가 볼 수 있음 데이터가 URL에는 표시되지 않음

 

상태 코드

HTTP 응답 상태 코드는 HTTP 요청이 성공적으로 완료되었는지를 알려줍니다.

아래는 일반적으로 많이 사용되고, 제가 프로젝트를 하며 많이 접했거나 흥미로운 응답 코드인 것들 위주로 모아두었습니다. 더 자세한 내용은 MDN에 가시면 확인하실 수 있습니다.

성공 응답 : 200번 대

200 OK: 요청 성공

201 Created : 요청 성공을 했으며 새로운 리소스 생성. 일반적으로 POST, 일부 PUT 에서 응답 

204 No Content : 성공 상태 응답 코드는 요청이 성공했으나 클라이언트가 현재 페이지에서 벗어나지 않아도 된다는 것을 의미. 글 작성 중에 중간 저장 같은 요청 할 때 사용.

리다이렉션 메시지 : 300번 대

304 Not Modified : 캐시를 목적으로 사용. 클라이언트에게 응답이 수정되지 않았음을 알려주며 캐시된 버전을 사용

클라이언트 에러 응답 : 400 번대

400 Bad Request : 잘못된 문법으로 인해 서버가 요청을 이해할 수 없음을 의미

401 Unauthorized : 요청된 리소스에 대한 유효한 인증 자격 증명이 없기에 클라이언트 요청이 완료되지 않음을 의미

403 Forbidden: 요청 컨텐츠에 접근할 권리가 없음을 의미. 401과는 다르게 서버는 클라이언트가 누구인지 알고 있음

404 Not Found : 서버는 요청받은 리소스를 찾을 수 없다는 의미. 브라우저에게 알려지지 않은 URL

서버 에러 응답 : 500번 대

500 Internal Server Error : 요청을 처리하는 과정에서 서버가 예상하지 못한 상황에 놓였다는 것을 의미

502 Bad Gateway : 서버가 게이트웨이나 프록시 서버 역할을 하면서 업스트림 서버로부터 유효하지 않은 응답을 받았다는 것을 의미


쿠키와 세션

HTTP는 위에서 말했듯 비상태성, 무연결성이라는 특징을 가집니다. 상태를 지니지 않고, 필요한 요청과 그에대한 응답이 종료하면 연결이 끊겨버립니다. 그러나 이런 특징만 가지고 있었다면 웹을 통한 많은 비즈니스는 불가능 했을 것입니다. 유저가 특정 서비스에 들어가 로그인을 통해 인가를 얻고, 그것을 기반으로 해당 서비스 안에서 그 유저를 인식할 수 있어야 하지 않을까요?

이런 특징의 단점을 극복하기 위해 등장한 기술이 바로 세션과 쿠키 입니다.

쿠키(Cookie)

쿠키는 서버가 클라이언트에게 전달하는 작은 데이터 조각입니다. 클라이언트 측에 저장이 되어 상태 정보를 유지합니다. 클라이언트가 이후 같은 서버에 요청을 보낼 때, 쿠키는 요청과 함께 전송되어 서버가 클라이언트의 상태를 식별하고 유지할 수 있게 해줍니다.

  • 쿠키는 text 형태로 저장
  • 하나의 쿠키는 대략 4KB(4096byte)
  • 최대 300개까지 저장 가능
  • 클라이언트에 저장
  • 만료일이 지정되지 않은 경우, 일반적으로 브라우저 종료 시 삭제
  • 웹 브라우저에 해당 서버의 쿠키 정보가 있으면 HTTP 헤더의 set-cookie값에 할당하여 요청

세션(Session)

세션은 서버가 클라이언트에게 고유한 세션 ID를 할당하고 그것을 db에 저장합니, 클라이언트는 세션 ID를 요청과 함께 서버에 전송하여 상태를 유지합니다. 세션 아이디는 헤더의 set-cookie 값에 할당됩니다.

  • 용량 제한 없음
  • 서버에서 세션 객체를 생성하여 클라이언트마다 세션 id값 부여
  • set-cookie 값을 사용하여 세션 id 값을 클라이언트에 전송
  • 웹 브라우저가 종료되면 세션 쿠키는 삭제

쿠키와 세션은 다른 개념이 아니며, 세션은 HTTP 헤더의 set-cookie 값을 이용해 전송됩니다. 둘의 큰 차이점이 있다면, 쿠키는 보안에 상대적으로 약하다는 것입니다.

따라서 중요한 정보는 세션 쿠키(세션 id)를 주어 식별 가능하도록 합니다.


HTTPS

HTTPS(HyperText Transfer Protocol over Secure Socket Layer)는 HTTP의 확장 버전 또는 더 안전한 버전입니다. HTTPS에서는 브라우저와 서버가 데이터를 전송하기 전에 안전하고 암호화된 연결을 설정합니다.

SSL(Secure Socket Layer) 또는 TLS(Transport Layer Security) 보안 프로토콜을 이용해 데이터를 암호화 한 후 전송합니다.


출처 자료

https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP

https://dev-coco.tistory.com/161

https://inpa.tistory.com/entry/WEB-🌐-HTTP-메서드-종류-통신-과정-💯-총정리#http_메서드_-_get

https://www.w3schools.com/tags/ref_httpmethods.asp#

https://noahlogs.tistory.com/38

잘못된 정보가 있다면 언제든 알려주시면 감사하겠습니다 😄