이 영역을 누르면 첫 페이지로 이동
나눔코딩 블로그의 첫 페이지로 이동

나눔코딩

페이지 맨 위로 올라가기

나눔코딩

03. 기술면접 - 네트워크 - HTTP 와 HTTPS 프로토콜

  • 2021.09.29 09:16
  • ∞. 기술 면접/2. 네트워크
공부목적으로 다른 블로그의 글을 그대로 따라치면서 작성되었습니다. 저작권 문제 시, 비공개 처리하겠습니다

 

HTTP 프로토콜

- 개념 
    - Hyper Text Transfer Protocol
    - 하이퍼 텍스트 교환 방식 (Hyper Text) -> HTML (Hyper Text Markup Language)
    - 웹상에서 클라이언트와 서버간에 요청/응답(request/response) 으로 정보를 주고 받을 수 있는 프로토콜

- 특징
    - 주로 HTML 문서를 주고 받는 데 쓰인다
    - 주로 HTML 문서를 주고 받는 데 쓰인다
    - TCP 와 UDP 를 사용하며 80번 포트를 사용한다
    - 비연결(Connectionless)
        - 클라이언트가 요청을 서버로 보내고 서버가 적절한 응답을 클라이언트에 보내면 바로 연결이 끊어진다
    - 무상태성(Stateless)
       - 연결을 끊는 순간 클라이언트와 서버의 통신은 끝나며 상태 정보를 유지하지 않는다
       - 이전에 요청한 결과를 갖고있지 않는다

HTTPS 프로토콜

- 개념
    -
Hyper Text Transfer Over Secure Socket Layer ( 또는 HTTP over TLS, 또는 HTTP over SSL 이라고도 불린다)
    - 웹 통신 프로토콜인 HTTP 에 보안을 강화한 프로토콜이다
    - HTTP 프로토콜에 데이터 암호화가 추가된 프로토콜

- 특징
    -
HTTPS의 기본 TCP/IP 포트로 443 포트를 사용
    - HTTPS 는 socket 통신에서 일반 텍스트를 이용하는 대신에, 웹 상에서 정보를 암호화하는 SSL 이나 TLS 프로토콜을통해 세션 데이터를 암호화한다

    - TLS(Transport Layer Security) 프로토콜은 SSL(Secure Socket Layer) 프로토콜에서 발전한 것이다
    - 두 프로토콜으 주요 목표는 기밀성(사생활 보호=개인정보), 데이터 무결성, ID 및 디지털 인증서를 사용한 인증을 제공한다
    - 데이터의 적절한 보호를 보장한다
        - 보호의 수준은 개발자의 웹 구현능력과 암호화 알고리즘에 달리게 된다

    - https 프로토콜을 적용하는 이유는 클라이언트와 서버간의 통신 중 데이터를 탈취했을 때 데이터를 알아볼 수 없게 보안하기 위함이다
    - 사용자의 데이터를 공개키 암호화(공개키를 얻은 인증된 사용자)
    - 서버로 전송 (데이터를 가로채도 개인키가 없으므로 복호화할 수 없다)
    - 서버의 개인키를 통해 복호화 하여 요청을 처리한다

- HTTPS 의 장단점
    - 
장점
        -
네트워크 상에서 열람, 수정이 불가능하므로 안전하다

    - 단점
        -
암호화를 하는 과정이 웹 서버에 부하를 준다
        - HTTPS 는 설치 및 인증서를 유지하는 추가 비용이 발생 (유료)
        -
HTTP 에 비해 느리다 (오늘날에는 크게 느껴지지 않는다)
        - 인터넷 연결이 끊긴 경우 재인증 시간이 소요된다
            - HTTP 는 비연결형으로 웹 페이지를 보는 중 인터넷 연결이 끊겼다가 다시 연결되어도 페이지를 계속 볼 수 있다
            -
그러나 HTTPS 의 경우에는 socket(데이터를 주고 받는 경로) 자체에서 인증을 하기 때문에 인터넷 연결이 끊기면 socket 도 끊어져서 다시 HTTPS 인증이 필요하다

 

티스토리의 HTTPS 인증서 정보이다 (공개키로 암호화하여 해당 서버에서 인증한 정보임을 알려 사용자들은 신뢰성을 보장받는다)
HTTPS 암호화 와 복호화

https 과정

 

HTTP(S) 요청 응답 헤더
  • HTTP 헤더 내 일반 헤더 (General Header 항목)
    • 요청 및 응답 메시지 모두에서 사용 가능한 일반 목적의 (기본적인) 헤더 항목
    • 주요 항목들
      • Date : HTTP : 메시지를 생성한 일 시
      • Connection : 클라이언트와 서버 간 연결에 대한 옵션 설정
        • Connection : close -> 현재 http 메시지 직후 tcp 접속을 끊는다는 것을 알림
        • Connection Keep-Alive -> 현재 tcp 커넥션을 유지
      • cache-control
      • pragma
      • trailer

네이버 Network 캡처

  • HTTP 헤더 내 엔티티/개체 헤더 (Entity Header) 항목
    • 콘텐츠, 본문, 리소스
      • Content-Type
      • Content-Encoding
      • Content-Length
      • ....
  • HTTP 헤더 내 요청 헤더 (Request Header) 항목
    • Host : 호스트명 또는 호스트명+포트
    • User-Agent : 클라이언트명 (크롬, 사파리 등..)
    • Cookie : 모든 쿠키 정보
    • Referer : 이전 페이지 주소
    • If-Modified-Since : 제시한 일시 이후로만 변경된 리소스를 취득 요청
    • Authorization : 인증 토큰 담는 곳
    • Origin 
      • 서버로 POST 요청을 보낼 때, 요청이 어느 주소에서 시작되었는지 나타냄
      • 여기서 요청을 보낸 주소와 받는 주소가 다르면 CORS 에러가 발생
      • 응답 헤더의 Access-Control-Allow-Origin와 관련
  • HTTP 헤더 내 응답 헤더 (Response Header) 항목
    • 특정 유형의 HTTP 요청이나 특정 HTTP 헤더를 수신했을 때, 이에 응답한다.
    • 주요 항목들
      • Server: 서버 소프트웨어 정보
      • Accept-Range
      • Set-Cookie: 서버측에서 클라이언트에게 세션 쿠키 정보를 설정 (RFC 2965에서 규정)
      • Expires: 리소스가 지정된 일시까지 캐시로써 유효함
      • Age: 캐시 응답. max-age 시간 내에서 얼마나 흘렀는지 알려줌(초 단위)
      • ETag: HTTP 컨텐츠가 바뀌었는지를 검사할 수 있는 태그
      • Proxy-authenticate
      • Allow: 해당 엔터티에 대해 서버 측에서 지원 가능한 HTTP 메소드의 리스트를 나타냄
        • 때론, HTTP 요청 메세지의 HTTP 메소드 OPTIONS에 대한 응답용 항목
          • OPTIONS: 웹서버측 제공 HTTP 메소드에 대한 질의
        • Allow: GET,HEAD => 웹 서버측이 제공 가능한 HTTP 메서드는 GET,HEAD 뿐임을 알림 (405 Method Not Allowed 에러와 함께)
      • Access-Control-Allow-Origin: 요청을 보내는 프론트 주소와 받는 백엔드 주소가 다르면 CORS 에러가 발생
        • 서버에서 이 헤더에 프론트 주소를 적어주어야 에러가 나지 않는다.
        • Access-Control-Allow-Origin: www.zerocho.com
          • 프로토콜, 서브도메인, 도메인, 포트 중 하나만 달라도 CORS 에러가 난다.
        • Access-Control-Allow-Origin: *
          • 만약 주소를 일일이 지정하기 싫다면 *으로 모든 주소에 CORS 요청을 허용되지만 그만큼 보안이 취약해진다.
        • 유사한 헤더로 Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Headers 등이 있다.  
          스프링에서는 위와 같이 해당 헤더를 설정하여 요청을 허용할 주소를 명시해준다

 

HTTP 와 HTTPS 동작 과정
HTTP 동작 과정
서버 접속 -> 클라이언트 -> 요청 -> 서버 -> 응답 -> 클라이언트 -> 연결 종료

①. URL 을 통한 서버 접속 (http://www.naver.com)
②. DNS 서버에 의해 웹 서버의 호스트 이름을 IP 주소로 변경 (http://www.naver.com -> http://123.4567.12:8080)
③. 웹 서버와 연결 시도 (3 way handshaking) -> 핸드 쉐이킹 거친 후 서버와 연결완료
④. 클라이언트가 서버에게 요청=Request (GET) 
    - HTTP Request Message = Request Header + 빈 줄 + Request Body
    - Request Header
        - 요청 메소드 + 요청 URI + HTTP 프로토콜 버전
            - GET /background.png HTTP/1.0 POST / HTTP 1.1
            - Header 정보(key-value 구조)
    - 빈 줄
        - 요청에 대한 모든 메타 정보가 전송되었음을 알리는 용도
    - Request Body
        - GET, HEAD, DELETE, OPTIONS처럼 리소스를 가져오는 요청은 바디 미포함
        - 데이터 업데이트 요청과 관련된 내용 (HTML 폼 콘텐츠 등)
⑤. 서버가 클라이언트에게 데이터 응답
    - HTTP Response Message = Response Header + 빈 줄 + Response Body
    - Response Header
        - HTTP 프로토콜 버전 + 응답 코드 + 응답 메시지
            - ex. HTTP/1.1 404 Not Found.
        - Header 정보(key-value 구조)
    - 빈 줄
        - 요청에 대한 모든 메타 정보가 전송되었음을 알리는 용도
    - Response Body
        - 응답 리소스 데이터
            - 201, 204 상태 코드는 바디 미포함

 

HTTP 프로토콜에서 사용한다는 TCP 와 UDP 에 대한 이해

HTTP 는 비연결성이다. 하지만 TCP 는 연결성이다
둘 다 프로토콜이고 HTTP 는 TCP 기반으로 만들어진 프로토콜이라고 한다
HTTP 는 OSI 7 계층 중 Application Layer 이며, TCP 와 UDP 는 Trasnfer Layer 이다
때문에 TCP 로 요청 (request) 와 응답(response) 은 하나의 연결성을 가지고 있다
그리고 서버로 부터 응답이 된 후에는 HTTP 프로토콜 특성상 연결을 끊어버린다 
연결을 끊어버렸기 때문에 상태를 갖지 않고 있어 stateless (무상태성) 인 것 이다
통은 TCP 기반으로 socket 통신하며 Streaming 서비스를 해야하는 경우 UDP 기반 socket 통신을 사용한다
HTTP 버전 1 보다는 HTTP 버전 2 가 빠르며 HTTP 버전 3 도 있는데 HTTP 버전 3은 UDP 기반 통신이다

공개키와 대칭키 간단 요약

- 대칭키 암호화
    - 하나의 비밀키로 암호화 복호화 (클라이언트 & 서버 같은 비밀키 사용)
    - 보안에 취약
    - 속도가 공개키보다 빠름

- 공개키 암호화 = 비대칭키 암호화 > 예) SSL
    - 공개키와 비밀키를 갖으며 공개키로 암호화 하며, 비밀키로 복호화를 진행 (클라이언트 암호화, 서버 복호화)
    - 보안에 강함
    - 속도는 대칭키보다 느림
    - 공개키를 통해 누구나 암호화 할 수 있지만 복호화는 비밀키를 갖고 있는 서버만 가능하게 된다

HTTPS 암호화 방식
공개키 암호화 방식
과 대칭키 암호화 방식의 장점을 활용해 하이브리드 사용 데이터를 대칭키 방식으로 암복호화하고, 공개키 방식으로 대칭키 전달

https://gaeko-security-hack.tistory.com/123

 

OKKY 참고

https://okky.kr/article/787738

 

저작자표시 (새창열림)

'∞. 기술 면접 > 2. 네트워크' 카테고리의 다른 글

06. 기술면접 - 네트워크 - 쿠키, 세션, 로컬 스토리지, 세션 스토리지  (0) 2021.09.30
05. 기술면접 - 네트워크 - GET 과 POST  (0) 2021.09.30
04. 기술면접 - 네트워크 - CORS  (1) 2021.09.30
02. 기술면접 - 네트워크 - TCP & UDP  (0) 2021.09.28
01. 기술면접 - 네트워크 - OSI 7 계층  (0) 2021.09.27

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 05. 기술면접 - 네트워크 - GET 과 POST

    05. 기술면접 - 네트워크 - GET 과 POST

    2021.09.30
  • 04. 기술면접 - 네트워크 - CORS

    04. 기술면접 - 네트워크 - CORS

    2021.09.30
  • 02. 기술면접 - 네트워크 - TCP & UDP

    02. 기술면접 - 네트워크 - TCP & UDP

    2021.09.28
  • 01. 기술면접 - 네트워크 - OSI 7 계층

    01. 기술면접 - 네트워크 - OSI 7 계층

    2021.09.27
다른 글 더 둘러보기

정보

나눔코딩 블로그의 첫 페이지로 이동

나눔코딩

  • 나눔코딩의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (316)
    • ∞. 읽은 거리 (3)
    • ∞. 기술 면접 (61)
      • 1. 자료구조 (0)
      • 2. 네트워크 (9)
      • 3. 운영체제 (11)
      • 4. 데이터베이스 (13)
      • 5. 디자인 패턴 (0)
      • 6. 알고리즘 (0)
      • 7. 자바 (15)
      • 8. 자바스크립트 (7)
      • 9. 스프링 (5)
      • 10. 시큐리티 (1)
      • 11. 기타 (0)
      • 12. Vue (0)
    • ∞. 웹개발 유용한 사이트 (14)
    • ∞. 트러블 슈팅 + TIL (7)
    • 00. 출발 (9)
    • 01. 엑셀 (9)
      • 기초 (4)
      • 컴활 1급 (4)
      • VBA (0)
    • 02. 엑세스 (9)
      • 기초 (5)
      • 컴활 1급 (4)
    • 04. Oracle (1)
      • 기초 (1)
    • 03. JAVA (8)
      • 기초 (7)
      • 객체지향 프로그래밍 (0)
    • 05. HTML (13)
      • 기초 (1)
      • css (10)
      • sass (0)
      • less (0)
    • 06. Javascript (16)
      • 기초 (13)
      • ES6 모듈 (2)
      • Canvas (0)
    • 07. JSP (0)
      • 기초 (0)
    • 08. jQuery (0)
      • 기초 (0)
    • 09. BootStrap (1)
      • 기초 (0)
      • v4 - Layout (1)
    • 10. Spring (30)
      • 기초 (3)
      • 실험 (4)
      • MVC (1)
      • BOOT (6)
      • Security (10)
      • Lib (Library) (2)
      • 벤치마킹 (0)
      • JUnit5 (2)
      • DevTools (0)
      • Socket (1)
      • Batch (0)
      • Mobile (0)
      • WebFlux (0)
      • Cloud (0)
      • Thymleaf (0)
      • Actuator (0)
      • 성능 테스트 (1)
    • 11. JetBrains (34)
      • 기초 (1)
      • IntelliJ IDEA (33)
      • WebStorm (0)
      • Pycham (0)
    • 12. API (0)
      • 기초 (0)
      • 네이버 API (0)
      • 카카오 API (0)
      • 구글 API (0)
      • 인스타그램 API (0)
    • 13. AutoHotkey (1)
    • 14. Python (8)
      • 기초 (3)
      • Selenium (2)
      • Beautiful Soup (0)
      • openpyxl (1)
      • Pyqt5 (0)
      • Deep learning (open CV) (0)
      • Geocoder (0)
      • Anaconda (0)
      • DeepLearning (0)
      • Jupyter Nootbook (0)
    • 14.5. R (0)
    • 15. JMeter (0)
      • 다운로드 (0)
    • 16. Vue JS (23)
      • 기초 (3)
      • Vue 2 (15)
      • Vue 3 (5)
      • Vuetify 2.5.8 (0)
    • 17. Git (12)
      • 기초 (8)
      • ItelliJ IDEA (4)
      • SourceTree (0)
    • 18. AWS (5)
      • 기초 (2)
      • Jira (3)
    • 19. Naver Cloud Platform (0)
    • 20. Google Cloud Platform (0)
      • 기초 (0)
      • stt & tts (0)
    • 21. Kotlin (0)
    • 22. Android (0)
      • 기초 (0)
      • Java (0)
      • Kotlin (0)
      • Flutter FrameWork (0)
    • 23. Clean Code [JAVA] (1)
    • 24. BuildTool (1)
      • Maven (1)
      • Gradle (0)
    • 25. 자료 구조와 알고리즘 (18)
      • JAVA (1)
      • Java Script (1)
      • 프로그래머스 (0)
      • 백준 알고리즘 (0)
      • 나의 알고리즘 (14)
      • Brilliant 공부 (0)
    • 26. React (1)
      • 기초 (0)
      • 강의 정리 (1)
    • 27. PostMan (0)
      • 기초 (0)
    • 28. 프로그래머스 (9)
    • 29. Leet Code (0)
    • 30. MySQL (3)
      • 기초 (2)
      • 문제 (1)
    • 73. GraphQL (0)
    • 74. Nuxt JS (0)
    • 75. Electron (0)
    • 76. UX & UI Design Tool (0)
      • 기초 (0)
      • Axure (0)
      • Sketch (0)
      • Figma (0)
    • 77. MarkDown (1)
      • 기초 (1)
    • 78. Tomcat (1)
      • 메모 (1)
    • 79. Element JS (0)
    • 80. Parallax JS (0)
      • 기초 (0)
    • 81. Player JS (0)
      • 기초 (0)
    • 82. Smart Maker (0)
    • 83. Vim (0)
      • 기초 (0)
    • 84. Linux (0)
      • 기초 (0)
      • Centos 7 (0)
      • Ubuntu (0)
    • 85. Node JS (2)
      • 기초 (1)
      • WebRTC (0)
      • NVM (1)
    • 86. Propeller JS (0)
    • 87. FullPage JS (0)
      • 기초 (0)
    • 88. 아두이노 (0)
    • 89. Tensorflow (0)
    • 90. 웹 패킷 분석 (0)
    • 91. 크롬 개발자도구 (0)
    • 92. 디자인 패턴 (7)
      • 생성(Creational) (3)
      • 구조(Structral) (1)
      • 행위(Behavioral) (2)
      • SOLID 패턴 (0)
    • 95. Linux Shell Script (0)
    • 96. 구글 애널리스틱 (0)
    • 97. ffmpeg (0)
    • 98. ShareX (1)
    • 자료실 (0)
    • 기타 (2)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 엑셀 기본작업
  • 졵
  • 깁
  • 엑셀 분석작업
  • 엑셀 글씨
  • 엑셀 가운데맞춤
  • 엑셀 기타작업
  • 엑셀 표시형식

나의 외부 링크

  • 비전공자 개발자
  • 자바 디자인 패턴
  • 자바 디자인 패턴
  • 스프링 블로그
  • 해킹보안 & 웹 관련
  • ERD 생성
  • 전문 기술 블로그
  • Servlet에 대한 개념없이 스프링을 했네요?
  • 스프링 FitlerChainList
  • 알고리즘 파워 블로그

정보

THE HEYDAZE의 나눔코딩

나눔코딩

THE HEYDAZE

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © THE HEYDAZE. Designed by Fraccino.

티스토리툴바