
회사마다 좋아하는 질문들이 있다. 그럼에도 공통적으로 물어보는 것들이 있는데 그러한 기초적인 질문들을 포함하여 알아둬서 나쁠 것 없는 질문들을 정리해보려 합니다.
참고로 아래의 답변들은 내가 아는 내용 + 조사해서 적은 내용이다. 맞지 않는 정보일 수도 있으니 참고하려면 검수를 꼭 하길 바랍니다.
또한, 맞지 않는 정보라면 댓글로 달아주시면 정말 고마울 것 같습니다.
면접 질문 대비는 시리즈로 작성할 예정입니다.
웹, HTML, CSS, JS, TS, React까지 다룰 생각입니다.
만약, 면접대비에 관련한 글을 적고 시간적 여유가 생긴다면 CS도 따로 정리해보도록 하겠습니다.
HTTP는 클라이언트-서버구조로 되어있고, 서버가 클라이언트의 상태를 저장하지 않는 무상태 프로토콜입니다. 또한, 요청을 주고받을 때만 연결을 유지하고 응답 이후 연결이 끊어지는 비연결성을 갖고 있습니다.
HTTP와 HTTPS는 웹에서 데이터를 주고받는 프로토콜이지만, 보안 측면에서 차이가 있습니다.
HTTPS는 HTTP에 SSL/TLS 프로토콜을 추가하여 보안이 강화된 프로토콜입니다. 따라서, HTTPS의 경우 모든 데이터가 암호화되어 전송됩니다.
또한, 기본 포트번호도 HTTP의 경우는 80, HTTPS의 경우는 443입니다.
과거에는 HTTPS의 암호화 과정 때문에 성능 저하가 우려되었지만, 최근에는 멀티플렉싱이나 압축과 같이 성능이 최적화되어 성능 차이가 거의 없습니다.
HTTP 멱등성(idempotent)이란 하나의 요청이 아닌 여러번 동일한 요청을 보냈을 때 서버가 같은 상태를 가지는 것을 멱등성이라고 합니다. 따라서 GET, PUT, DELETE와 같은 메서드는 멱등성을 갖고, POST나 PATCH의 경우는 멱등성을 갖지 않습니다.
PUT의 경우 업데이트를 할 때 전체의 데이터를 보내야하고, 데이터가 없다면 데이터를 생성합니다.
PATCH의 경우 업데이트를 할 때 원하는 데이터만 보내도 됩니다.
주요상태 코드만 설명을 하자면
DNS(Domain Name System)는 도메인 네임을 IP 주소로 변환하는 시스템입니다.
DNS는 먼저 브라우저 캐시, 로컬 캐시, 로컬 DNS 서버 순으로 IP주소를 가져옵니다. 만약 캐싱된 정보가 없다면, 루트 네임 서버에 TLD(Top-Level Domain) 네임 서버의 주소를 요청합니다.
이를 통해, 원하는 주소에 대한 네임서버 주소를 얻을 수 있습니다.
TLD를 통해 알아낸 권한 네임 서버에 최종적으로 실제 주소의 IP주소를 반환받습니다.
여기서 받은 IP주소는 캐싱하여 저장합니다.
웹 소켓(WebSocket)은 서버와 클라이언트 간의 양방향, 실시간 통신을 가능하게 하는 프로토콜입니다.
웹소켓은 클라이언트가 서버로 웹소켓 핸드쉐이크를 요청합니다. 서버가 연결을 수락하게 되면, 기존 HTTP 연결을 웹소켓으로 전환됩니다.
CDN(Content Delivery Network)은 웹 콘텐츠(HTML, CSS, JavaScript, 이미지, 동영상 등)를 사용자와 가까운 서버에서 제공하여 로딩 속도를 최적화하는 분산 네트워크 시스템입니다.
TCP의 연결과정과 해제과정은 각각 3-way handshake, 4-way handshake 과정을 겪습니다.
클라이언트가 서버로 SYN를 보내 연결을 요청하고 서버에서 클라이언트로 SYN + ACK를 보냅니다. 이를 클라이언트에서 수신받으면 서버로 ACK를 보내며 TCP가 연결됩니다.
클라이언트가 연결을 해제하기 위해 FIN요청을 보냅니다. 서버는 이를 받아 ACK를 보내고 남은 요청들을 처리 후 FIN을 클라이언트에게 보냅니다. 클라이언트가 이를 수신하여 ACK를 서버에게 보내고, 혹시나 지연된 데이터응답이 있을 수 있기에 일정시간 기다린 후 연결을 종료합니다.
TCP와 UDP는 둘다 OSI 7계층 중 전송계층에 해당하는 프로토콜입니다.
TCP는 가상회선(Virtual Circuit)을 사용하고 UDP는 데이터그램(Datagram)방식을 사용합니다.
가상회선 방식의 경우 초기 연결 설정이 필요합니다.
각각의 패킷은 독립적이지 않아서 고장난 링크나 노드를 만나면 새로운 연결을 설정해야 하는 stateful방식입니다.
데이터그램 방식의 경우 초기 연결 설정을 하지 않습니다.
또한, 각각의 패킷은 독립적으로 포워드하기 때문에 보낸순서와 받는순서가 다를 수 있습니다.
포워딩 과정 중 고장난 링크나 노드를 우회하여 라우팅을 하는 stateless방식이지만 인터넷의 경우 라우팅 테이블에 timeout(TTL)을 두어 stateful과 stateless가 공존하는 soft state상태입니다.
위와같은 차이를 통해 TCP는 신뢰성이 높고, UDP는 신뢰성이 낮습니다.
즉, TCP는 패킷의 순서가 보장되지만 UDP는 보장되지 않아 쓰임이 다릅니다. 속도 측면에서도 TCP는 느리고 UDP는 빠릅니다. 또한, UDP는 브로드캐스트도 지원합니다.
CORS(cross origin resource sharing)란 HTTP 헤더를 기반으로 브라우저가 다른 오리진에 대한 리소스 로드를 허용할지 말지에 대한 메커니즘입니다.
SOP(Same Origin Policy)는 같은 오리진끼리만 요청을 허가하는 정책인데 다른 오리진끼리도 요청이 필요한 경우 CORS를 허용해야 합니다.
simple request와 preflight request라는 두가지의 요청이 있습니다.
simple request의 경우는 허용된 메서드타입, 헤더에 해당된 내용이면 사전요청없이 바로 서버에 요청하는 방식입니다.
반면, preflight request는 허용되지 않은 메서드타입이나 헤더가 있는 경우 보안검사를 위해 OPTION요청을 먼저 보내고 이를 서버에서 수락하면 실제 요청을 보내게 됩니다.
서버에서는 Access-control-과 같은 헤더로 응답하여 해당 헤더에 요청한 오리진이 없다면 CORS에러가 나오고 요청한 오리진이 있다면 정상작동합니다.
CORS문제를 해결하려면 서버단에서 Access-Control-Allow-Origin을 서버 응답 헤더에 추가하면 됩니다. 원하는 도메인에서만 요청이 가능하도록 설정할 수도 있습니다.
프론트엔드단에서도 해결이 가능한데 이는 proxy를 설정하여 같은 오리진에서 요청을 보내는 것처럼 할 수도 있습니다.
<script>태그를 만나면 JavaScript 실행브라우저가 리소스를 요청을 할 때, 캐시에 해당 리소스가 있는지 확인하고 있다면 유효한지 확인 후 해당 리소스를 사용합니다.
브라우저는 캐시 데이터를 메모리 캐시 혹은 디스크 캐시에 저장가능합니다.
메모리 캐시의 경우 현재 열린 탭에서 저장하고 브라우저가 닫히면 사라지지만, 디스크 캐시는 브라우저가 파일을 디스크에 저장하여 브라우저를 닫아도 유지됩니다.
브라우저에 발생할 수 있는 메모리 누수 방지 방법은 여러가지가 있습니다.
var를 통해 선언된 전역 변수는 메모리에 계속 유지되므로, 사용을 최소화 해야합니다.removeEventListener()와 같은 함수를 사용해서 필요없는 이벤트 리스너는 제거해야 합니다.브라우저의 렌더링을 담당하는 주요 엔진이 있습니다.
자바스크립트 코드를 해석하고 실행하는 여러 엔진이 있습니다.
이벤트 리스너 + 브라우저 렌더링
사용자의 입력이 발생하게 되면 브라우저는 입력이벤트를 감지하고 해당 입력값을 DOM에 반영합니다. 이벤트 리스너가 input에 등록되어있다면 이벤트 리스너가 호출됩니다.
렌더링 엔진은 DOM의 변경을 감지하고, DOM트리와 CSSOM트리를 결합한 렌더트리를 만들고 이를 바탕으로 레이아웃 계산, 페인팅 과정을 거칩니다. (브라우저 렌더링)
반응성은 시스템이 사용자 입력에 얼마나 빠르게 응답하는가의 의미이고, 부하는 시스템이 처리해야하는 작업량을 의미합니다.
세가지 전부 브라우저에 캐싱을 함으로써 서버의 부담을 줄이고 더 빠르게 데이터를 받아올 수 있습니다.
차이점으로는 여러 항목으로 구분할 수 있습니다.
최대저장용량은 세션과 로컬스토리지가 쿠키보다 많습니다.
접근범위는 세션은 탭이지만, 쿠키와 로컬스토리지는 오리진입니다.
만료기한은 쿠키는 수동으로 설정하고, 세션은 탭을 닫으면 소멸되고, 로컬스토리지는 영구적입니다.
쿠키는 세션과 로컬스토리지와 다르게 요청과 함께 서버에 자동전송됩니다.
인증은 사용자의 신원을 확인하는 과정이고, 인가는 사용자가 특정 리소스나 기능에 접근할 권한이 있는지 확인하는 과정입니다.
사용자가 로그인하면 서버는 사용자를 인증한 후에 Access Token, Refresh Token을 발급합니다. 사용자는 이후 요청 시에 헤더에 토큰을 포함하여 전송합니다. 서버는 토큰을 검증하여 요청을 처리하고, 만료된 경우 Refresh Token을 통해 새로운 Access Token을 발급받습니다.
JWT는 클라이언트에서 보관하므로 XSS공격으로 쉽게 유출될 수 있습니다.
이를 해결하기 위해 로컬스토리지 대신 HttpOnly 쿠키를 사용하던지, 토큰을 짧게 유지하고 Refresh Token을 저장하면 됩니다.
XSS는 공격자가 악성 스크립트를 웹사이트에 삽입하여 실행시키는 공격 기법입니다.
이를 방지하는 방법 중 하나는 쿠키 탈취 방지를 위해 HttpOnly 속성을 설정하거나 Secure 속성을 추가하여 HTTPS 환경에서만 쿠키가 전송되도록 설정하면 됩니다.
크로스 브라우징이란 다양한 웹 브라우저(Chrome, Firefox 등)에서 동일한 사용자 경험을 제공하기 위해 웹사이트를 개발하는 기법입니다.
크로스 브라우징 문제를 해결하기 위해 여러가지 방법이 있습니다.
REST API는 REST(Representational State Transfer) 아키텍처 스타일을 따르는 API를 의미합니다. REST는 자원을 HTTP URI로 표현하고, HTTP 메서드(GET, POST, PUT, DELETE 등)를 활용하여 자원을 관리하는 방식입니다.
REST는 아키텍처 스타일이고, RESTful은 REST원칙을 지킨 API입니다.
리플로우는 레이아웃 단계에서 발생하는 연산으로, 요소의 위치와 크기를 다시 계산하는 과정입니다.
리페인트는 레이아웃 계산없이 화면의 픽셀을 다시 그리는 과정입니다. 스타일 변화만 있는 경우 발생합니다.
하지만, 리플로우가 발생하면 리페인트도 발생합니다.
리플로우는 DOM 요소의 크기, 위치, 레이아웃이 변경될 때 발생합니다.
즉, DOM요소가 추가 및 삭제가 일어나거나 레이아웃과 관련된 CSS(width, height, margin, padding, display 등)가 변경되는 경우, 스크롤 발생 등 다양한 이유로 발생합니다.
애니메이션 시 transform이나 opacity를 사용합니다. (리페인트만 발생)
레이아웃을 변경할 요소들은 position을 absolute나 fixed로 설정하여 독립적으로 배치합니다.
SEO(검색 엔진 최적화)는 웹사이트나 웹 페이지가 검색 엔진에서 더 잘 노출되도록 하는 일련의 최적화 작업입니다.
메타 태그, 헤더 태크 혹은 시멘틱 태그 등을 활용하여 SEO를 올릴 수 있습니다. 또한, 이미지에 Alt설명을 넣는 것도 SEO를 올릴 수 있습니다.
SSR은 서버에서 HTML을 생성하여 클라이언트로 전송하는 방식이고, CSR은 클라이언트 측에서 JavaScript를 사용하여 동적으로 콘텐츠를 생성하는 방식입니다.
placeholder를 볼 수 있음placeholder자리에 넣어줌SPA는 한개의 페이지로 구성된 Application입니다. 서버로부터 완전한 페이지를 불러오지 않고 현재의 페이지를 동적으로 다시 작성합니다.
또한, 웹 애플리케이션에 필요한 모든 정적 리소스를 최초 접근 시 단 한번만 다운로드 합니다.
따라서, 이후의 새로운 페이지 요청시 페이지 갱신에 필요한 데이터만 JSON으로 전달받아 페이지를 갱신합니다.
MPA는 여러개의 페이지로 구성된 Application입니다. 새로운 페이지를 요청할 때마다 서버에서 렌더링된 정적 리소스를 다운로드합니다.
페이지를 이동하거나 새로고침을 하게되면 해당 페이지를 다시 렌더링합니다.
위의 내용은 여러번 내용이 수정되거나 추가 및 삭제될 수 있습니다.
HTML이나 CSS 등의 면접 대비 질문은 다음 포스팅 때 올리도록 하겠습니다.