[네트워크] 신입 개발자 면접 질문 정리

lea_hwang·2023년 4월 24일
1
post-custom-banner

✅OSI 7계층

네트워크 프로토콜이 통신하는 구조를 7개의 계층으로 분리하여 각 계층간 상호 작동하는 방식을 정해 놓은 것을 말합니다.

제일 아래에서부터 물리 계층, 데이터링크 계층, 네트워크 계층, 전송 계층, 세션 계층, 표현 계층, 응용 계층이 있습니다.

물리계층은 전기적, 기계적인 특성을 이용해 데이터를 전송하는 계층입니다. (케이블, 리피터, 허브)

데이터링크 계층은 인접한 두 장치 간의 신뢰성있는 정보 전송(오류 파악, 재전송)을 담당하는 계층입니다. MAC 주소를 이용해 통신하며 프레임 단위로 데이터가 구성됩니다.(브리지, 스위치)

네트워크 계층은 라우팅 기능을 맡고 있는 계층으로 목적지까지 안전하고 빠르게 데이터를 보낼 수 있도록 하는 계층입니다. IP 주소를 통해 어디로 데이터를 보내야 할지 판단하며, 패킷 단위로 데이터가 구성됩니다. (라우터, L3 스위치)

전송 계층은 종단 간 신뢰성있고 정확한 데이터 전송을 담당하는 계층입니다. 오류 검출 및 복구, 흐름제어와 중복 검사를 통해 신뢰성있고 효율적인 데이터 전송을 꾀하며 Port 번호를 사용합니다. TCP와 UDP가 이 계층에 속하며 세그먼트/데이터그램 단위로 데이터가 구성됩니다.

세션 계층은 통신 장치 간 상호작용 및 동기화를 제공합니다. 세션에서 에러발생시 복구를 관리합니다.

표현 계층은 데이터를 어떻게 표현할 지 정하는 계층으로 암호화/복화화, 압축 등의 기능을 담당하고 있습니다.

응용 계층은 사용자와 가장 밀접한 계층으로 인터페이스 역할을 합니다.

✅TCP/IP 4계층

TCP/IP 프로토콜이 미 국방성 통신 표준으로 채택되면서, 해당 프로토콜의 통신 과정을 크게 4개의 계층 구조로 나눠 설명한 것을 말합니다.

네트워크 접근 계층, 인터넷 계층, 트랜스포트 계층, 어플리케이션 계층 의 총 4계층으로 구성됩니다.

네트워크 접근 계층은 물리적으로 데이터가 네트워크를 통해 어떻게 전송되는지를 정의합니다. 물리적인 주소로 MAC을 사용하며 에러검출 및 패킷의 프레임화를 담당합니다. (Ethernet, Token Ring)

인터넷 계층이란 통신 노드 간의 IP 패킷을 전송하는 기능과 라우팅 기능을 담당합니다. 대표적인 프로토콜로 IP가 있으며, IP 주소를 기반으로 데이터를 주고 받습니다.

전송 계층은 통신 노드 간의 연결을 제어하고 신뢰성있는 데이터 전송을 담당합니다. TCP, UDP가 여기에 속하며 포트 번호를 이용해 전송합니다.

응용 계층은 사용자와 가장 가까운 계층으로 인터페이스 역할을 합니다. HTTP, FTP, SSH 등이 여기에 포함됩니다.

✅TCP와 UDP

TCP란 두 개의 호스트를 연결하고 신뢰성 있게 데이터를 전송해주는 프로토콜입니다. 데이터와 패킷이 순서대로, 에러, 분실, 중복 없이 전달될 수 있도록 합니다. 뿐만 아니라 흐름제어와 혼잡제어를 통해 데이터를 효율적으로 잘 받을 수 있도록 합니다.

UDP란 두 개의 호스트를 연결하지 않고 신뢰성있지 않게 데이터를 전송하는 프로토콜입니다. 데이터를 빠르게 전달할 수 있다는 장점이 있습니다.

✅3-way handshake & 4-way handshake

3-way handshake란 TCP 프로토콜에서 정확한 전송을 보장하기 위해 두 호스트의 연결을 성립하는 과정을 의미합니다.

  1. 클라이언트가 서버에게 SYN 패킷을 보냄 (sequence : x)
  2. 서버가 SYN(x)을 받고, 클라이언트로 받았다는 신호인 ACK와 SYN 패킷을 보냄 (sequence : y, ACK : x + 1)
  3. 클라이언트는 서버의 응답은 ACK(x+1)와 SYN(y) 패킷을 받고, ACK(y+1)를 서버로 보냄 이렇게 3번의 통신이 완료되면 연결이 성립된다. (3번이라 3 way-handshake인 것)

4-way handshake란 TCP 프로토콜에서 연결을 해제하기 위한 과정입니다.

  1. 클라이언트는 서버에게 연결을 종료한다는 FIN 플래그를 보낸다.
  2. 서버는 FIN을 받고, 확인했다는 ACK를 클라이언트에게 보낸다. (이때 모든 데이터를 보내기 위해 CLOSE_WAIT 상태가 된다)
  3. 데이터를 모두 보냈다면, 연결이 종료되었다는 FIN 플래그를 클라이언트에게 보낸다.
  4. 클라이언트는 FIN을 받고, 확인했다는 ACK를 서버에게 보낸다. (아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 TIME_WAIT을 통해 기다린다.) - 서버는 ACK를 받은 이후 소켓을 닫는다 (Closed) - TIME_WAIT 시간이 끝나면 클라이언트도 닫는다 (Closed) 이렇게 4번의 통신이 완료되면 연결이 해제된다.

✅HTTP & HTTPS

HTTP란 인터넷 상에서 클라이언트와 서버가 자원을 주고 받을 때 사용하는 통신 규약입니다. HTTP는 누군가 네트워크에서 신호를 가로채면 내용이 노출되는 보안이슈가 발생할 수 있는데 이를 보완한 것이 HTTPS입니다.

HTTPS란 인터넷 상에서 정보를 암호화하는 SSL 프로토콜을 사용해 클라이언트와 서버가 자원을 주고 받을 때 쓰는 통신 규약으로 공개키 암호화 방식을 사용합니다.

✅HTTP1 vs HTTP2

HTTP1.1은 1999년 출시 이후 지금까지 가장 많이 사용되고 있습니다. HTTP는 웹상에서 클라이언트와 웹서버간 통신을 위한 프로토콜 중 하나입니다. HTTP1.1은 기본적으로 연결당 하나의 요청과 응답을 처리하기 때문에 동시전송 문제와 다수의 리소스를 처리하기에 속도와 성능 이슈를 가지고 있습니다.

이렇다 보니, HOL(Head Of Line) Blocking-특정응답지연, RTT(Round Trip TIme) 증가, 헤비한 Header구조라는 문제점들을 가지고 있습니다. 이러한 문제점들을 해결하기 위해, UI 개발자/프론트엔드개발자는 이미지 스프라이트, 도메인샤딩, CSS/JavaScript 압축, Data URI 등을 업무에 사용하였습니다.

그렇게 고군분투 하던 중, HTTP2가 세상에 소개되었습니다. HTTP2는 성능 뿐만 아니라 속도면에서도 월등한 녀석입니다. Multiplexed Streams(한 커넥션에 여러개의 메세지를 동시에 주고 받을 수 있음), Stream Prioritization(요청 리소스간 의존관계를 설정), Server Push(HTML문서상에 필요한 리소스를 클라이언트 요청없이 보내줄 수 있음), Header Compression(Header 정보를 HPACK압충방식을 이용하여 압축전송)을 사용하여 선을을 획기적으로 향상 시켰습니다

✅쿠키와 세션의 차이

쿠키와 세션은 HTTP의 특성인 비연결성(connectionless), 비상태성(stateless) 때문에 사용하게 됩니다.

비연결성: 요청을 보내고 난 뒤 응답을 받고 연결이 끊어지는 것을 의미

비상태성: 커넥션을 끊는 순간 상태정보를 유지하지 않는 것을 의미

그러나, 로그인이나 장바구니 같은 기능을 구현하기 위해선 상태 정보를 유지할 필요가 있는데요. 이런 stateful한 상황을 대처하기 위해 쿠키와 세션을 사용합니다.

쿠키는 서버에서 만들어 클라이언트에 넘긴 작은 정보파일입니다. 클라이언트 측에서 특정 이벤트를 수행하며 쿠키를 수정할 수 있고 이를 다시 서버에 요청과 함께 넘겨 특정 데이터를 요청할 수 있습니다. 쿠키는 브라우저가 종료돼도 삭제되지 않습니다.

그러나 이 쿠키는 서버가 가지고 있는 것이 아니기 때문에 임의로 고치거나 가로챌 수 있어 보안에 취약합니다.

httponly cookie: document.cookie로 접근 불가능 (XSS 공격 대비)

secure cookie: https 프로토콜 상에서 암호화된 요청일 경우에만 요청되는 쿠키

세션은 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보는 것을 의미합니다. 사용자가 접속할 경우 서버에서는 세션을 만들어 session_id를 발급하고 클라이언트 측에서는 해당 sid를 쿠키에 저장합니다. 그래서 서버에 요청할 때마다 해당 쿠키를 전달하는 방식으로 동작합니다. 세션은 브라우저가 종료되면 만료 기간에 상관없이 삭제되며 sid로 사용자를 구분하기 때문에 보안 측면에서 그냥 쿠키 만을 사용했을 때 보다 안전합니다.

✅CORS

CORS란 서로 다른 Origin 간에 자원을 공유하는 것을 의미합니다. 여기서 Origin이란, Protocol, Host, Port를 모두 합친 것을 의미합니다. 기본적으로 Origin이 서로 같을 때만 자원을 공유할 수 있습니다. 이를 SOP라 부릅니다. 그런데, 서버와 클라이언트의 요청처럼 서로 다른 Origin 간의 데이터를 공유할 필요가 있는 경우가 있습니다. 이렇게 SOP의 예외사항을 둘 것이 CORS라고 할 수 있습니다. CORS에 대한 설정은Access-Control-Allow-Origin 의 값에 자원을 공유할 다른 Origin의 정보를 담으면 됩니다.

✅REST API

REST API란, 자원의 이름으로 해당 자원의 상태를 주고 받는 것을 의미합니다. HTTP URI를 통해 자원을 명시하고 HTTP Method를 통해 해당 자원에 대한 CRUD operation을 적용할 수 있으며 서버는 요청에 대한 응답으로 JSON, XML과 같은 HTTP Method Payload를 받을 수 있습니다.

✅웹 브라우저에 www.naver.com을 입력하면 일어나는 일

  1. 주소창에 www.naver.com을 입력한다.
    • protocol, domain, path 등의 형식으로 입력되면 브라우저가 해당 도메인 네임에 대한 IP 주소를 요청한다.
    • protocol을 따로 명시하지 않는다면 기본적으로 https로 요청한다.
  2. DNS 서버에 도메인 네임을 전달하여 IP 주소를 받아온다.
  3. 가져온 IP 주소를 토대로 서버에 TCP 요청을 날린다.
    1. 3-way handshake 과정을 거쳐 http 요청을 날리게 된다.
  4. 서버 측에서 클라이언트로 HTTP 응답 메세지를 전송한다.
  5. 이렇게 받은 html 문서를 브라우저에 넣어준다.
    1. 브라우저에서는 html 문서를 파싱하여 DOM 트리를 구축하고 CSS 파일 링크를 찾아 CSSOM 트리를 구축한다.
    2. 둘을 사용해 렌더 트리를 구축한다.
    3. 렌더트리를 이용해 각 노드들의 위치를 지정하는 레이아웃 과정을 거친다.
    4. 화면에 paint 한다.

✅DNS

Domain name을 IP 주소로 바꿀 수 있도록 도와주는 분산 시스템을 의미합니다.

도메인 주소는 .을 기준으로 나뉘게 되며, 가장 오른쪽에서 부터 해석됩니다. 이러한 도메인 주소는 통으로 관리되는 것이 아니라, 트리 구조로 분리한 다음 관리하게 되는데, 이 전체 트리 구조를 도메인 네임 스페이스라 부르고 각각의 도메인을 네임서버가 처리하게 됩니다.

실제로 DNS가 동작하는 방식은, 먼저 리졸버가 사용자로부터 요청 받은 domain name을 가지고 네임 서버에 DNS 쿼리를 날립니다. 네임 서버는 해당 domain을 가지고 IP주소를 찾아 리졸버에게 넘겨줍니다. 리졸버는 DNS 서버로부터 최종 결과를 응답 받아 웹 브라우저로 전달합니다.

✅응답 상태 코드

응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 알려줍니다. 이러한 상태코드는 응답의 의미에 따라 5가지로 나뉩니다.

현재 작업의 진행상황과 관련된 정보를 알려주는1xx,

요청이 성공적으로 받아들여졌음을 의미하는 2xx,

요청이 완료되기 위해선 리다이렉트가 필요함을 의미하는 3xx,

클라이언트의 요청이 올바르지 않는 것을 의미하는 4xx,

서버 쪽에서 처리하는데 문제가 생겼음을 암시하는 5xx

대표적인 응답 상태 코드로는

get 요청을 잘 받았음을 의미하는 200,

post 요청이 성공적으로 되었음을 의미하는 201,

csrf token을 받지 못했을 때 발생하는 forbidden 403,

요청한 페이지가 없음을 의미하는 404 등이 있습니다.

✅GET, POST 방식의 차이

GET 방식은 클라이언트에서 서버로 어떤 자원을 요청하기 위해 사용하는 메서드 이며, POST 방식은 클라이언트에서 서버로 자원을 저장하기 위해 데이터를 보낼 때 사용하는 메서드 입니다.

GET은 요청 메시지에 body가 없지만, POST는 body에 데이터를 담아 보냅니다. 이러한 GET 요청은 몇 번을 요청해도 결과가 똑같지만, POST는 여러 번 요청하면 리소스가 새로 생성되거나 업데이트 되기 때문에 멱등이 아닙니다.

✅KeepAlive

HTTP는 기본적으로 connectionless입니다. 한번 요청 후 응답을 받으면 연결을 끊어버립니다. 이러한 연결을 끊지 않고 계속 요청을 보낼 수 있도록 하는 것이 keepalive 입니다. 이는 ConnectionKeep-Alive 헤더를 설정하여 사용할 수 있다. keepalive를 사용함으로써 3-way handshake로 인한 지연 시간을 줄일 수 있습니다.

✅무상태성

HTTP에서 서버가 클라이언트의 상태를 보존하지 않는 것을 의미합니다. 서버의 개수가 많아지면 그만큼 정보를 많이 공유해야 하기 때문에 비싸질 수 밖에 없는데, stateless하게 사용하면 정보 공유가 최소화되어 비용 절감이 가능합니다.

✅공인 IP와 사설 IP의 차이

공인 IP란 ISP(인터넷 서비스 공급자)가 제공하는 IP 주소이며, 외부에 공개되어 있는 IP 주소를 의미합니다. 사설 IP란 일반 가정이나 회사 내에서 할당된 IP 주소를 의미하며 공유기(라우터)에 로컬 네트워크 상의 PC나 장치에 할당됩니다.

공인 IP의 경우 전 세계에서 유일하지만, 사설 IP는 하나의 네트워크 안에서 유일합니다. 공인 IP는 외부, 내부 상관없이 해당 IP에 접속할 수 있으나, 사설 IP는 내부에서만 접근이 가능합니다.

이렇게 사설IP로 연결된 PC에서 외부 네트워크에 통신을 하려면 라우터가 이를 사설 IP를 공인 IP로 변환하고 응답받은 공인 IP 주소를 다시 사설 IP로 변환하는 기술을 NAT(Network Address Translation)이라 부릅니다.

profile
끊임없이 도전하는 개발자, 황희원입니다 :)
post-custom-banner

0개의 댓글