[cs] 스터디 2주차 - IP주소와 HTTP
1. HTTP 프로토콜에 대해 설명해 주세요.
HTTP는 웹 상에서 데이터를 주고받기 위한 프로토콜입니다. 기본적으로 요청-응답 모델을 따르며, 클라이언트가 서버에 요청을 보내면 서버는 이에 대한 응답을 반환합니다.
HTTP는 stateless 프로토콜로, 각각의 요청이 서로 독립적이며 이전 요청과 상태를 공유하지 않습니다. 따라서 통신 간 연결 상태 처리나 상태 정보를 관리할 필요가 없어 서버 디자인이 간단합니다. 그러나 이전 통신의 정보를 모르기 때문에, 쿠키나 세션을 사용해 매번 인증을 진행해야 합니다.
----------------------------------------------------------------------------------------------------------------------
2. HTTP와 HTTPS의 차이점을 설명해 주세요.
HTTP는 보안 기능이 없는 평문 데이터를 주고받기 때문에, 제3자에 의해 조회 및 조작될 가능성이 있습니다. 이를 해결하기 위해 HTTP에 암호화를 추가한 HTTPS 프로토콜이 등장하였습니다. HTTPS에 도입된 SSL(Secure Socket Layer)는 보안 세션을 기반으로 데이터를 암호화합니다. 현재는 SSL 대신 주로 TLS (Transport Layer Security)가 사용되며, 이는 중간에서 데이터를 가로채거나 조작하는 것을 방지하여 안전한 통신을 제공합니다
----------------------------------------------------------------------------------------------------------------------
3. 쿠키와 세션의 차이점을 설명해 주세요.
쿠키와 세션은 모두 사용자와 서버 간의 상태를 유지하는 데 사용됩니다. 세션은 서버 측 세션 저장소에 저장되며, 클라이언트는 세션 ID만을 가지고 있습니다. 이는 실제 데이터가 서버에서 관리되기 때문에 일반적으로 더 안전합니다. 그러나 세션 ID의 전송과 저장에 있어서도 안전한 접근 방식이 필요합니다.
쿠키는 웹사이트 접속 시 클라이언트 측에 저장되는 작은 텍스트 파일입니다. 클라이언트에 저장되므로 보안에 취약하며, 브라우저가 종료되어도 만료 기간을 설정하지 않으면 삭제되지 않습니다.
----------------------------------------------------------------------------------------------------------------------
4. 세션 기반 인증과 토큰 기반 인증은 어느 경우에 적합한가요?
세션 기반 인증은 서버에 의존하므로 1) 서버 사이드 렌더링 웹 애플리케이션에 적합합니다. 또한, 세션은 서버에 저장되기 때문에 보안이 더 중요하다면 세션 방식을 채택하는 것을 고려하겠지만, 사용자가 많을 경우 서버의 부하가 증가할 수 있으므로 이를 고려하여 신중히 선택해야 합니다. 클라이언트와 서버가 별도의 독립적인 시스템으로 운영되고 확장성이 중요하다면 토큰 기반 인증이 적합합니다. 토큰 기반 인증은 2) 클라이언트 사이드 렌더링에 적용하는 것이 좋지만, 보안에 꼭 주의하여야 합니다. 특히 토큰을 안전하게 전송하고 저장하기 위해 HTTPS를 사용하고, 토큰의 만료 기간을 적절히 설정하는 것이 중요합니다.
1) 서버 사이드 렌더링: 웹 페이지를 서버에서 렌더링한 후 클라이언트로 전달하는 방식.
페이지 요청 -> 서버에서 페이지 구성 -> HTML 생성 -> 이를 클라이언트에게 전송
장점:
- 검색 엔진 최적화 (SEO) : 서버에서 렌더링되는 HTML은 검색 엔진이 노출되기 쉽다
- 초기 로딩 속도가 빠르다
- 소셜 미디어에 공유될 때 미리보기가 적절하게 표시된다
단점:
- 페이지 이동마다 서버에 요청이 발생하므로 페이지 간 전환이 느릴 수 있다
- 많은 사용자가 동시에 요청을 보내면 서버 부하가 증가할 수 있다
2) 클라이언트 사이드 렌더링: 초기 HTML 및 페이지 구조는 서버에서 제공하지만, 실제 콘텐츠는 클라이언트에서 자바스크립트를 사용하여 동적으로 렌더링하는 방식. 즉, 브라우저에서 페이지를 생성하고 업데이트
장점:
- 페이지 간 이동이 빠르고 부드럽다
- 서버 부하가 감소한다
단점:
- 검색 엔진이 동적으로 생성된 콘텐츠를 크롤링하는 데 어려움이 있어 SEO에 영향을 줄 수 있다
- 페이지를 처음 로딩할 때 필요한 자원을 모두 받아오기까지 시간이 걸리므로 초기 로딩 속도가 느릴 수 있다
- 소셜 미리보기가 적절하게 표시되지 않을 수 있다
----------------------------------------------------------------------------------------------------------------------
5. 웹페이지 속도를 개선하기 위해 어떤 방법들을 고려해 볼 수 있을까요?
1번 답변) 우선적으로 이미지, 스크립트, 스타일시트 등의 리소스를 압축하고 최적화하여 파일 크기를 줄이는 것이 중요합니다. 개행 문자나 빈칸을 없애서 코드를 최대한 압축하는 방법도 있겠습니다. 렌더링을 최적화해야 한다면 3) 브라우저 캐싱을 활용하는 것도 방법이 되겠습니다.
3) 브라우저 캐싱 : 웹사이트를 방문할 때 브라우저에 의해 로컬에 일시적으로 콘텐츠를 저장하는 메커니즘. 유튜브 영상을 시청하고 다시 홈 화면으로 돌아갈 때, 이전 홈 화면과 같은 화면을 로딩할 수 있는데, 이는 이전 홈 화면의 리소스가 브라우저 캐시에 저장되어 로컬에서 로딩되었기 때문. 따라서 서버에서 다시 리소스를 받아오지 않아 사용자에게 더 빠른 응답을 제공할 수 있습니다. 특히 GET 요청이 들어왔을 때, 캐시에 저장되어 있는 리소스와 서버에 저장되어 있는 리소스가 일치하도록 주의를 기울여야 한다. 이를 위해 리소스가 변경될 때마다 해당 리소스의 버전을 갱신하거나, Cache-Control 헤더를 통해 명시적으로 캐시의 동작을 제어할 수 있다.
2번 답변(백엔드 개발자로서 할 수 있는 답변)) 서버에서의 응답 속도를 향상시키는 방법을 가장 먼저 고려해 보겠습니다. 먼저, 불필요한 JOIN 연산은 없는지, 인덱스를 적절하게 달았는지 확인하여 쿼리를 최적화하겠습니다. 레이지 로딩이 필요한 곳을 찾아 필요한 경우에만 데이터를 로딩하도록 쿼리를 개선하겠습니다. 자주 들어오는 쿼리 결과를 캐싱해 놓는 것도 방법이 되겠습니다. 이를 위해 4) 인메모리 데이터 베이스인 Redis나 Memcached를 사용할 수 있습니다.
4) 인메모리 데이터베이스는 데이터를 주 메모리(램)에 저장하여 빠른 응답 속도와 높은 처리 성능을 제공하는 데이터 베이스 시스텝이다. Redis는 문자열, 해시, 리스트, 셋 등 구조를 갖춘 데이터를 저장할 수 있으며, 영속성을 지원하여 디스크에 데이터를 저장할 수 있다. Memcached는 단순한 키-밸류 를 캐시하는 용도에 적합하다.
----------------------------------------------------------------------------------------------------------------------
6. www.google.com에 접속하면 일어나는 일에 대해 설명해 주세요.
사용자가 브라우저에 www.google.com을 입력하면, 브라우저는 DNS를 통해 해당 도메인의 IP 주소를 찾습니다. 찾아낸 IP 주소로 브라우저는 서버에 TCP 3-way handshake를 통한 연결을 시도합니다. 클라이언트가 서버에게 SYN 패킷을 보내고, 서버가 이를 받아들여 ACK와 SYN를 함께 보내면서 연결이 설정됩니다. 이후 클라이언트는 웹 서버로 HTTP 요청 메시지를 보내고, 웹 서버는 HTTP 응답 메시지를 보냅니다. 도착한 HTTP 응답 메시지는 웹페이지 데이터로 변환되어 브라우저에 의해 출력됩니다.