일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- transaction
- 프록시서버
- 데이터베이스
- 얕은복사
- 정규화
- forward프록시
- index
- mutable
- proxy
- reverse프록시
- Database
- 불변객체
- RDBMS
- 깊은복사
- 조인
- binarySearch
- 알고리즘
- 인덱스
- NoSQL
- 방어적복사
- java
- 이진탐색
- immutable
- acid
- 자료구조
- ERD
- Today
- Total
jacketList
기술면접 - 네트워크 본문
2023.11.16ver ing
HTTP 프로토콜에 대해서
HTTP(Hyper Text Transfer Protocol)란 데이터를 주고 받기 위한 프로토콜이며, 서버/클라이언트 모델을 따름
HTTP는 상태 정보를 저장하지 않는 Stateless의 특징과 클라이언트의 요청에 맞는 응답을 보낸 후 연결을 끊는 Connectionless의 특징을 가지고 있음
장점
- 통신간의 연결 상태 처리나 상태 정보를 관리할 필요가 없어 서버 디자인이 간단
- 각각의 HTTP 요청에 독립적으로 응답만 보내주면 됌
단점
- 이전 통신의 정보를 모르기 때문에 매번 인증을 해줘야 함
- 이에 대한 방안으로 세션 (session) 쿠키(cookie)를 사용해서 데이터를 처리함
HTTP와 HTTPS의 차이점
HTTP는 암호화 되지 않은 평문 데이터를 전송하기 때문에 보안에 취약 -> HTTPS는 HTTP에 데이터 암호화가 포함된 프로토콜
HTTP + SSL = HTTPS
※SSL(Secure Socket Layer) 인터넷을 통해 전달되는 정보를 보호하기 위해 개발한 통신 규약
HTTPS의 동작방식
- 브라우저가 도메인에 접속하면 웹 서버는 CA에서 발급받은 인증서(CA의 개인키로 암호화된 사이트의 정보와 공개키)를 웹 브라우저에 보냄
- 웹 브라우저는 이미 가지고 있는 인증기관의 공개키로 웹 서버에서 받은 인증서를 복호화해서 확인
- 웹 브라우저는 실제 데이터의 암호화에 사용될 대칭키 (비밀키)를 생성하고 인증서에서 꺼낸 웹 서버의 공개키로 암호화하여 웹 서버로 보냄
- 웹 서버는 브라우저에서 받은 암호화된 대칭키를 개인키로 복호화하여 확인
- 웹 서버는 복호화한 대칭키를 통해 데이터를 주고 받음
대칭키와 비대칭키
대칭키: 암호화와 복호화에 같은 암호 키를 쓰는 알고리즘 -> 중간에 누군가 암호키를 가로챌 경우 암호화된 정보가 유출될 가능성이 있음
비대칭키: 암호화와 복호화할 때 키를 서로 다른 키로 사용하는 암호화 알고리즘 -> 노출되면 안되는 개인키(private key)와 개방되어 있는 공개키(public key)를 쌍으로 이룬 형태
OSI 7Layer와 각 계층이란?
통신 체계를 7개로 구분하고, 규격화한 개념적 프레임워크
- 7 계층(응용 계층) : 사용자에게 통신을 위한 서비스 제공, 인터페이스 역할
- 6 계층(표현 계층) : 데이터의 형식을 정의하는 계층 (코드 간의 번역을 담당)
- 5 계층(세션 계층) : 컴퓨터끼리 통신을 하기 위해 세션을 만드는 계층
- 4 계층(전송 계층) : 최종 수신 프로세스로 데이터의 전송을 담당하는 계층(단위: segment) (ex TCP, UDP)
- 3 계층(네트워크 계층) : 패킷을 목적지까지 가장 빠른 길로 전송하기 위한 계층(단위 : packet) (ex Router)
- 2 계층(데이터링크 계층) : 데이터의 물리적인 전송과 에러 검출, 흐름 제어를 담당하는 계층 (단위 : Frame) (ex 이더넷)
- 1 계층(물리 계층) : 데이터를 전기 신호로 바꾸어 주는 계층 (단위: bit) (장비: 케이블, 리피터, 허브)
TCP와 UDP? 둘의 차이점?
TCP: 연결형 서비스로 3way-handshaking 과정을 통해 연결을 설정하기 때문에 높은 신뢰성 보장, 속도가 비교적 느림
UDP: 비연결형 서비스 3way-handshaking 사용x -> 신뢰성이 떨어짐, 데이터 수신 여부를 확인하지 않기 때문에 속도가 빠름
TCP는 신뢰성이 중요한 파일 교환과 같은 경우에 쓰이고 UDP는 실시간성이 중요한 스트리밍에 자주 사용된다.
프로토콜 종류 | TCP | UDP |
연결방식 | 연결형 서비스 | 비연결형 서비스 |
패킷 교환 방식 | 가상 회선 방식 | 데이터그램 방식 |
전송 순서 | 전송 순서 보장 | 전송 순서가 바뀔 수 있음 |
수신 여부 확인 | 확인O | 확인 X |
통신 방식 | 1:1통신 | 1:1 or 1:N or N:N |
신뢰성 | ↑ | ↓ |
속도 | 느림 | 빠름 |
TCP 통신은 종료시에도 3way-handshaking 사용?
TCP는 3way-handshaking 과정으로 연결하고 4way-handshaking과정으로 연결을 해제
3way-handshake와 4way-handshake 에 대해
3way-handshake: TCP 네트워크에서 통신하는 장치가 서로 연결이 잘 되어있는지 확인하는 방법 - 송신자와 수신자는 총 3번에 걸쳐 데이터를 주고 받으며 통신이 가능한 상태인지 확인
4way-handshake: TCP 네트워크에서 통신하는 장치의 연결을 해제하는 방법 - 송신자와 수신자는 총 4번에 걸쳐 데이터를 주고 받으며 연결을 끊음
HTTP Method와 각각의 메소드가 사용되는 경우
HTTP 메소드는 클라이언트가 서버에게 사용자 요청 목적을 알리는 '수단'
GET: 데이터 조회
POST: 요청 데이터 처리(보통 데이터 등록 사용)
PUT: 데이터 변경(해당 데이터가 없으면 생성)
PATCH: 일부 데이터만 변경
DELETE: 데이터 삭제
GET과 POST의 차이
GET은 데이터를 조회하기 위해 사용되는 방식으로 데이터를 헤더에 추가하여 전송
URL에 데이터가 노출되므로 보안적으로 중요한 데이터를 포함해서는 안된다.
POST는 데이터를 추가 또는 수정하기 위해 사용되는 방식으로 데이터를 바디에 추가하여 전송
완전히 안전하진 않지만 URL에 데이터가 노출되지 않아 GET보다 안전
GET방식 | POST방식 | |
URL 데이터 노출 여부 | O | X |
URL 예시 | http://localhost:8080/boardList?name=제목 | http://localhost:8080/addBoard |
데이터 위치 | Header(헤더) | Body(바디) |
캐싱 여부 | O | X |
명등성 여부 | O | X |
※ 멱등이란?
연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질 이라는 사전적 정의로
GET은 리소스를 단순히 조회만 한다는 점에서 여러 번 요청을 하더라도 응답이 똑같을 것이고,
POST는 리소스를 새로 생성하거나 업데이트할 때 사용하기 때문에 응답이 그때그때 다를 것이다.
세션 기반 인증과 토큰 기반 인증의 차이
세션 기반 인증: 클라이언트로부터 요청을 받으면 클라이언트의 상태 정보를 저장하므로 Stateful한 구조를 가짐
토큰 기반 인증: 상태 정보를 서버에 저장하지 않으므로 Stateless한 구조를 가짐
Stateful한 세션 기반 인증 방식을 사용하면 어떤 단점이 있는지?
1. 서버에 세션을 저장하기 때문에 사용자가 많아지면 서버에 과부하가 걸려 확장성이 낮다
2. 해커가 훔친 쿠키를 이용해 요청을 보내면 서버는 올바른 사용자가 보낸 요청인지 구분할 수 없음(세션 하이재킹)
각각의 방법은 어느 경우에 적합한지?
단일 도메인일땐 세션 기반 아닐땐 토큰 기반이 적합하다고 판단
이유는?
세션을 관리할 때 사용되는 쿠키는 단일 도메인 혹은 서브 도메인에서만 작동하도록 설계되어 있기 때문에 여러 도메인에서 관리하는 것이 어렵다 (CORS 문제)
※CORS란?
교차 출처 리소스 공유(Cross-Origin-Resource Sharing)는 추가 HTTP헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처(프로토콜, 도메인, 포트번호)의 리소스에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체재
쿠키(Cookie) 와 세션(Session)
쿠키 : 사용자 인증에 필요한 정보를 클라이언트에 저장하는 방식, 세션보다 속도 빠름
세션 : 사용자 인증에 필요한 정보가 서버에 저장되는 방식, 보안적으로 쿠키보다 뛰이남, 추가 처리가 필요해 속도 느림
왜 사용?
HTTP 프로토콜의 특징이 Stateless하고 Connectionless하기 때문에 매번 연결 상태를 처리하고 인증해야 하는 번거로움이 있어 이를 해결하기 위해 사용
쿠키(Cookie) | 세션(Session) | |
저장 위치 | 클라이언트(=접속자 PC) | 웹 서버 |
저장 형식 | text | Object |
만료 시점 | 쿠키 저장시 설정 (브라우저가 종료되도, 만료시점이 지나지 않으면 삭제되지 않음) |
브라우저 종료시 삭제(기간 지정 가능) |
사용하는 자원(리소스) | 클라이언트 리소스 | 웹 서버 리소스 |
용량 제한 | 총 300개 하나의 도메인 당 20개 하나의 쿠키 당 4KB(=4096byte) |
서버가 허용하는 한 용량제한 없음 |
속도 | 세션보다 빠름 | 쿠키보다 느림 |
보안성 | 세션보다 약함 | 쿠키보다 좋음 |
www.naver.com에 에 접속할 때 생기는 과정(웹 동작 방식의 이해)
- 사용자가 브라우저에 URL(www.naver.com) 입력
- DNS(Domain Name Service) 서버에 도메인 네임으로 서버의 진짜 주소 찾음
- IP주소로 웹 서버에 TCP 3 way handshake로 연결 수립
- 클라이언트는 웹 서버로 HTTP 요청 메시지를 보냄
- 웹 서버는 HTTP 응답 메시지를 보냄
- 도착한 HTTP 응답 메시지는 웹 페이지 데이터로 변환되고, 웹 브라우저에 의해 출력
※ DNS란?
사람이 읽을 수 있는 도메인 이름에서 IP주소로 맵핑하는 체계
해당 IP를 이용해서 컴퓨터는 웹사이트나 인터넷상의 리소스를 찾고, 연결할 수 있음(ex: 전화번호부)
JWT 토큰 이란
JSON 포맷을 이용하는 Claim 기반의 웹 토큰이며, 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달함
JWT는 헤더(Header), 내용(payload), 서명(signature)로 구성되며 각 파트를 점(.)으로 구분
헤더(Header) : 토큰의 타입과 해시 암호화 알고리즘(방식지정)으로 이루어져 있다.
내용(Payload) : 토큰에 사용자가 담고자 하는 정보를 담는다. 내용에는 Claim이 담겨있고, JSON(key/value) 형태의 한 쌍으로 이뤄져 있다.
서명(Signature) : 토큰을 인코딩하거나 유효성 검증할 때 사용하는 고유한 암호화 코드이다. 헤더와 내용의 값을 인코딩한다.
- 장점
- 다른 토큰 기반 인증 방식에 비해 JSON형식을 사용하기 때문에 크키가 작아 전달하기에 좋다.
- Header와 Payload를 통해 Signature를 생성하므로 데이터 위변조를 막을 수 있다.
- 토큰 탈취의 위험성을 낮추기 위해 refresh token을 활용할 수 있다.
- 단점
- 토큰의 Payload에 세 종류의 Claim을 저장하기 때문에, 정보가 많아질수록 길이가 늘어나 네트워크에 부하를 줄 수 있다 .
- Payload에 담기는 데이터들은 모두 Base64로 디코딩 될 수 있기 때문에 중요한 정보를 담을 수 없다.
JWT의 동작과정
- 사용자가 사용자 정보를 통해 로그인 한다.
- 서버에서는 사용자 정보를 증명하고 JWT토큰을 응답으로 반환하는데 이때 access token과 함께 refresh token을 같이 전송한다.
- 그 이후에 사용자는 access token을 통해 서버에 요청을 보내는데 만약 토큰이 만료되었다면, 서버에서는 만료된 토큰임을 확인하고 401에러를 반환한다.
- 웹 브라우저가 토큰이 만료됐음을 확인하면, 자동으로 refresh token으로 새로운 토큰 발급 요청을 보낸다.
- 서버는 refresh token을 검증한다.
- 검증이 끝난 후에 새로운 access token과 refresh token을 반환한다.
- 사용자는 새로운 토큰으로 서버에 요청을 보낼 수 있다.
💡Refresh Token은 어디에 저장되는가?
서버에서는 Refresh Token을 DB에 저장한다. 클라이언트에서는 Refresh Token을 어디에 저장하느냐에 대한 의견이 다양한데 가장 문제되는 것은 역시 보안이다.
로드 밸런싱(Load Balancing)이란?
분산식 웹 서비스로, 여러 서버에 부하(Load)를 나누어주는 역할을 한다. Load Balancer를 클라이언트와 서버 사이에 두고, 부하가 일어나지 않도록 여러 서버에 분산시켜주는 방식이다.
서비스의 규모가 커지고 이용자 수가 늘어나게 되면 기존의 서버만으로 트래픽을 감당하기 힘들어지기 때문에 원활한 서비스 이용이 힘들어 질 수 있다.
이에 대한 대처로는
- 기존 서버의 성능을 확장하는 Scale-up 방식
- 기존 서버와 성능이 동일하거나 낮은 서버를 증설하는 Scale-out방식
Load Balancer가 서버를 선택하는 방식
- 라운드 로빈(Round Robin)
- 서버에 들어온 요청을 순서대로 돌아가며 배정하는 방식
- 클라이언트의 요청을 순서대로 분배하기 때문에 여러 대의 서버가 동일한 스펙을 갖고 있고, 서버와의 연결(세션)이 오래 시속되지 않는 경우에 활용하기 적합함
- 가중 라운드로빈 방식(Weighted Round Robin Method)
- 각각의 서버에 가중치를 매기고 가중치가 높은 서버의 클라이언트 요청을 우선 배분
- 주로 서버의 트래픽 처리 능력이 상이한 경우 사용된다. (ex A서버가 5의 가중치 B서버가 2의 가중치를 갖고 있다면 A서버에 5 B서버에 2만큼의 요청을 전달한다.)
- IP해시 방식(IP Hash Method)
- 클라이언트의 IP주소를 특정 서버로 매핑하여 요청을 처리하는 방식
- 사용자의 IP를 해싱해(※Hashing: 임의의 길이를 지닌 데이터를 고정된 길이의 데이터로 매핑하는 것, or 그러한 함수) 로드를 분배하기 때문에 사용자는 항상 동일한 서버로 연결되는 것을 보장 받을 수 있다.
- 최소 연결 방식(Least Connection Method)
- 요청이 들어온 시점에 가장 적은 연결 상태를 보이는 서버에 우선적으로 요청을 배분한다.
- 세션이 길어지거나, 서버에 분배된 트래픽들이 일정하지 않은 경우 적합
- 최소 응답 시간 방식(Least Response Time Method)
- 서버의 현재 연결 상태와 응답 시간을 모두 고려하여 트래픽 배분
- 가장 적은 연결 상태와 짧은 응답 시간을 보이는 서버에 우선 배분
References
https://lealea.tistory.com/235
https://dev-coco.tistory.com/161
https://juran-devblog.tistory.com/203
'면접' 카테고리의 다른 글
기술면접 - 운영체제 (0) | 2023.09.07 |
---|---|
기술면접 준비 - Java (0) | 2023.08.23 |
기술면접 - Spring (0) | 2023.08.22 |
기술면접 - 데이터베이스 (0) | 2023.08.22 |