기술면접 준비(3) HTTP 웹 통신
Q. 웹서버(Web Server)
A. 웹서버는 하드웨어와 소프트웨어 관점에서 그 의미가 나뉜다. 소프트웨어로서의 의미는 웹 클라이언트(브라우저)로부터 HTTP 프로토콜을 통해 요청을 받아들이고 HTML과 같은 정적 웹페이지를 반환하는 것이다. 웹 서버가 동적 컨텐츠를 요청받으면 WAS에 요청을 보내고 그 응답값을 클라이언트에 반환한다.
하드웨어로서의 의미는 소프트웨어의 의미를 지니는 서버가 실행되고있는 컴퓨터를 의미한다.
Q. WAS(Web Application Server)
A. WAS란 웹서버와 웹 컨테이너가 합쳐진 형태로 웹 서버 단독으로는 수행할 수 없는 DB 조회나 다양한 로직 처리가 필요한 동적 컨텐츠를 제공한다. WAS는 웹서버의 기능을 구조적으로 분리하고자 고안되었다. 주로 데이터베이스 서버와 함께 수행되며 분산 트랜잭션, 보안, 메시징 등 분산 처리 환경에서 사용된다. 프로그램 실행 환경과 데이터베이스 접속, 여러 개의 트랜잭션 관리, 비즈니스 로직 수행 등을 담당한다.
Q. 웹서버와 WAS의 차이점
A. 웹서버는 클라이언트로부터 요청을 받아 정적 컨텐츠를 반환하고 동적 컨텐츠 요청의 경우 WAS에 전달, 응답을 다시 클라이언트로 전달하는 역할을 하며 WAS는 여기서 동적 컨텐츠를 담당한다. 주로 비즈니스 로직 수행과 데이터베이스 조회, 여러 트랜잭션을 관리한다.
Q. 웹 컨테이너란
A. 웹 컨테이너는 웹 서버의 컴포넌트 중 하나로 JSP와 서블릿을 실행시킨다. WAS는 이런 JSP나 서블릿을 구동할 수 있는 환경을 제공한다.
Q. 서블릿(Servlet)
A. 서블릿이란 웹 페이지를 동적으로 생성하거나 데이터 처리를 수행하기 위해 자바로 작성된 프로그램이다. 자바 코드 안에 HTML 코드가 삽입된 형태로 .java가 확장자이다. 클라이언트 요청을 처리하고 그 결과를 다시 클라이언트에 전송하는 서블릿 클래스의 구현 규칙을 지킨 자바 프로그램이다. 서블릿은 자바 언어를 웹 어플리케이션에 조금 더 개발하기 쉽게 하기 위해 만든 API들이며 이 규약에 맞는 라이브러리나 클래스들을 상속 및 구현하여 만든 클래스들을 의미한다.
Q. JSP(Java Server Pages)
A. JSP은 HTML 안에 자바 코드를 삽입하는 것이다. 서블릿 기반의 서버사이드 스크립트 기술로 서블릿을 작성하지 않고도 간편하게 웹 프로그래밍을 구현하게 만든 기술이 JSP이다.
* 스크립트 기술이란 ASP, PHP처럼 미리 약속된 규정에 따라 간단한 키워드를 조합하여 입력하면 실행 시점에 각각의 키워드에 매핑되어있는 어떤 코드로 변환 후 실행되는 형태이다.
Q. JSP와 서블릿의 차이점과 동작 방식
A. 서블릿은 자바 코드로 구현하며 수정 시 다시 컴파일하고 배포해야한다. 반면 JSP는 키워드가 태그화 되어있다.
초기 자바 개발은 서블릿을 통해 이뤄졌으나 JSP 기술 발표 후 JSP만을 이용한 개발이 이뤄지다(MVC1) 다시 서블릿과 JSP를 나눠 개발(MVC2)이 이뤄지고 있다. JSP는 서블릿으로 변환되어 실행된다.
즉 서블릿은 자바 코드 안에 HTML 코드가 있는 형태의 자바 파일(클래스)로 수정 후 다시 컴파일한 후 재배포해야 한다. 반면 JSP는 HTML 코드 안에 자바 코드가 포함된 것으로 JSP가 수정된 경우 재배포할 필요 없이 WAS가 처리한다.
Q. 웹서버와 WAS의 예
A. 웹 서버에는 아파치 NGINX(엔진엑스), IIS 등이 있으며 WAS에는 톰캣, JBoss, IBM 웹 스피어 등이 있다.
* 아파치와 아파치 톰캣, 톰캣
웹서버에는 아파치가 있고 WAS에는 톰캣이 있는데 2008년 릴리즈된 톰캣5.5부터 정적 컨텐츠를 처리하는 기능이 포함되어있다. 이 기능은 웹서버로 처리하는 것과 크게 기능 차이가 없으며 톰캣이 아파치의 기능을 수행하기 때문에 아파치 톰캣이라고도 부른다.
Q. 웹서버와 WAS를 구별하는 이유는 무엇이며 WAS만 있을 경우 발생하는 문제는 무엇인가요
A. WAS만 사용해서는 안된다.
즉, 자원 이용의 효율성과 장애 극복, 배포 및 유지보수의 편의성을 위해 WAS와 웹서버를 분리한다. WAS앞에 웹서버를 두고 WAS는 웹 서버에 플러그인 형태로 설정하면 더욱 효율적인 분산 처리가 가능하다.
Q. 동적 웹페이지와 정적 웹페이지 차이
A. 정적 웹페이지는 웹서버에 저장된 HTML을 클라이언트에게 전송하는 웹 페이지이다. 사용자는 고정된 웹 페이지를 보게 되며 모든 사용자는 같은 결과의 웹 페이지를 응답받는다. 지정된 정보만 보여주기 때문에 서비스가 한정적이며 수정, 추가 작업과 관리가 어렵다. 하지만 속도가 빠르고 비용이 적다.
동적 웹페이지의 경우 요청 처리를 한 후 제작되는 HTML 페이지로 사용자는 상황, 시간에 따라 다른 웹 페이지를 보게 된다. 같은 페이지라도 사용자마다 다른 웹 페이지를 보게 된다. 동적 페이지의 경우 속도가 상대적으로 느리고 추가 비용이 발생하지만 다양한 정보를 제공한다.
Q. 웹서버의 구동 방식
A.
Q. 로드밸런싱(Load Balancing)
A. 부하 분산 또는 로드 밸런싱이란 컴퓨터 네트워크 기술의 일정으로 둘 혹은 셋 이상의 중앙처리장치 또는 저장장치와 같은 컴퓨터 자원에게 작업을 나누는 것을 의미한다.
Q. 트래픽 분산처리가 필요한 경우와 그 방안 예시
A. 메시징 서비스나 많은 트래픽이 예상되는 서비스의 경우 과도한 트래픽이 몰릴 경우를 대비하여 분산처리 기능을 지니고 있어야한다.
그 방안으로는 로드 밸런싱, Stateless(무상태) 설계 등이 있고 데이터베이스 차원에서는 샤딩이나 인덱싱등이 있다.
Q. 쿠키(Cookie)와 세션(Session)의 차이점
A. 쿠키와 세션의 가장 큰 차이점은 저장 위치이다. 쿠키의 경우 서버의 자원을 이용하지 않고 브라우저에 저장되며 세션의 경우 서버에 저장된다. 쿠키가 속도면에서 우수하나 요청 과정에서 스니핑당할 우려가 있어 보안에 취약하지만 세션은 쿠키를 이용해 세션 아이디만 저장함으로 보안성이 높다.
그 다음 중요한 것은 라이프 사이클로 쿠키도 만료 기간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 정보가 유지될 수 있다. 만료 기간을 따로 지정하는 것도 가능하다. 반면 세션도 만료 기간을 정할 수 있지만 브라우저가 종료되면 만료 기간에 상관없이 삭제된다.
Q. Stateful(상태)와 Stateless(무상태)
A.
Q. 서버기반 인증 vs 토큰기반 인증
A. 서버기반인증은 세션과 쿠키 기반의 인증 방식이다.
서버 기반 인증 방식의 문제점은 사용자 증가 시 서버에 저장된 세션 증가로 서버 램에 과부화 문제가 발생한다(서버는 세션 자원을 이용하기 때문). 증가된 트래픽을 처리하기 위해서는 서버를 확장하고 세션을 분산시키는 시스템을 설계해야 한다. 또한 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어있어 여러 도메인에서 관리하는 것이 번거롭다(CORS).
이러한 서버 기반 인증 방식의 문제점 보완을 위해 사용되는 것이 토큰 기반 인증 방식이다. 최근 json 포맷을 이용하는 jwt(Json Web Token)를 주로 사용한다.
해당 방식의 장점으로는 Stateless 서버로의 확장에 매우 적합하며 쿠키 사용에 의한 취약점이 사라진다. 하지만 토큰 환경의 취약점도 주의해야 한다. 토큰에 선택적인 권한만 부여하여 발급이 가능하고 OAuth의 경우 소셜 계정을 이용하여 다른 웹서비스에서도 로그인이 가능하다. 어떤 도메인이나 디바이스에서도 토큰만 유효하다면 요청이 정상적으로 처리되어 CORS 문제를 해결한다.
Q. 동기와 비동기의 동작 방식
A. 동기 방식의 경우 서버에 요청을 보내면 응답이 반환되어야 이후 작업을 수행할 수 있다.
반면 비동기 방식의 경우 요청의 응답 여부와 상관 없이 다음 동작을 수행할 수 있다. 동기 방식은 더 간단하고 직관적일 수 있으나 응답이 오기까지 대기해야한다는 문제가 있다. 비동기 방식을 사용하면 응답을 기다리는 동안 다른 작업을 수행할 수 있다는 장점이 있다.
Q. AJAX(Asynchronous JavaScript and XML)
A. 비동기 자바스크립트와 XML로 서버와 통신하기 위해 XMLHttpRequest객체를 사용하는 것이다. Json, XML, HTML, 일반 텍스트 형식 등 다양한 포맷을 주고받을 수 있다.
페이지 새로고침 없이 서버에 요청이 가능하며 동적 웹 페이지를 구현하고 서버로부터 데이터를 받고 작업을 수행하는 비동기 방식으로 동작한다.
하지만 AJAX는 클라이언트가 서버에 데이터를 요청하는 클라이언트 풀링 방식으로 서버 푸시 방식의 실시간 서비스는 만들 수 없다. 또한 바이너리 데이터는 주고받을 수 없으며 AJAX 스크립트가 포함된 서버가 아닌 다른 서버로의 AJAX 요청은 보낼 수 없다.
* 클라이언트 풀링(Client Pooling) 방식이란 사용자가 직접 원하는 정보를 서버에게 요청하여 얻는 방식을 의미한다.
* 서버 푸시(Server Push) 방식은 사용자가 요청하지 않아도 서버가 알아서 자동으로 특정 정보를 제공하는 것을 의미한다.
Q. HTTP(HyperText Transfer Protocol) 프로토콜
A. 인터넷 상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜이다. 애플리케이션 레벨의 프로토콜로 TCP/IP 위에서 작동한다. HTTP는 HTML, 이미지, 동영상, 오디오, 텍스트 등 다양한 종류의 데이터를 전송할 수 있다.
Q. HTTP 동작 원리
A. HTTP는 서버/클라이언트 모델을 따른다. 클라이언트에서 요청을 보내면 서버에서 요청을 처리하여 다시 클라이언트로 응답을 보낸다. 클라이언트는 URI를 이용해 서버에 접속하고 데이터를 요청한다.
웹 서버의 표준 포트는 80번이다.
Q. HTTP와 HTTPS의 차이점
A. HTTP는 암호화되지 않은 평문 데이터를 전송하기 때문에 보안에 취약하다. 이러한 문제 해결을 위해 HTTPS가 등장하였다. HTTPS는 HTTP에 데이터 암호화가 포함된 프로토콜이다.
Q. HTTPS(HyperText Transfer Protocol Secure) 동작 방식
A. HTTPS는 HTTP에 보안 기능을 추가한 것이다.
Q. SSL(Secure Socket Layer, TLS Transport Layer Security)
A. 클라이언트와 서버 간 통신을 위해 공인된 제 3업체(CA)에서 보증하는 전자 문서(증명서)
통신 내용이 노출, 변경되는 것을 방지한다. 클라이언트에서 접속하려는 서버가 신뢰할 수 있는 서버인지 확인한다. SSL 통신에 사용할 공개키를 클라이언트에게 제공한다.
443 포트를 이용한다
* 대칭키와 비대칭키
Q. URL, URI, URN
A.
Q. RESTful API란
A. REST란 웹에 존재하는 모든 자원(문서, 이미지, 동영상 등)에 고유한 URI를 부여하여 활용하는 것으로 자원을 정의하고 자원에 대한 주소를 지정하는 방법론이다. HTTP 메서드(GET, POST, PUT, DELETE)를 통해 CRUD 연산을 수행한다.
자원(URI) / 행위(HTTP Method) / 표현 세 가지 구성요소로 나뉜다.
REST 규칙
REST API는 REST 특징을 기반으로 API를 제공하는 것으로 Restful API는 REST의 규칙을 잘 지켜 설계된 API이다.
Q. RESTful API 설계 주의사항
A.
Q. 대표적인 HTTP 응답 코드
A.
Q. HTTP 메서드
A.
* PUT / POST
POST는 클라이언트 요청 시 리소스의 위치를 지정하지 않아 여러번 수행되는 경우 매번 새로운 자원이 생성된다. 반면 PUT은 클라이언트가 명확하게 리소스의 위치를 지정하여 여러번 같은 요청이 수행되더라도 자원이 새로 생성되지 않는다.
Q. HTTP 버전별 차이
A.
Q. 웹 캐시(Web Cache)
A. 서버 지연을 줄이기 위해 자주 사용하는 자원(정적 자원, html, image, js, css 등의 정적 자원)을 임시 저장하기 위한 기술이다.
* 캐시(Cache) 이미 가져온 데이터나 계산된 결과값을 복사본으로 저장함으로써 처리 속도를 향상시킨다.
Q. 쿠키와 캐시
A. 캐시는 html, css, js와 같은 정적 요소를 저장하기 위한 임시 저장소이다. 캐시의 목적은 빠른 웹 페이지 렌더링이다. 사용자가 직접 수동으로 삭제해주어야 한다. 쿠키 또한 정보를 저장하기 위해 사용되나 기본적으로 서버에서 보낸 파일들을 저장해 사용자의 인증을 돕는다. 만료 기간을 설정할 수 있고 시간이 지나면 자동 삭제된다.
* 세션은 서버에 저장되며 보안성은 좋지만 속도가 느리다. 브라우저 종료 시 삭제된다.
Q. CSRF(Cross Site Request Forgery)
A. 사용자 의지와 무관하게 공격자의 의도대로 서버에 특정 요청을 하도록 한다.
예를 들어 한 사용자가 서비스를 사용중이다. 공격자는 이와 비슷한 도메인을 가진 가짜 사이트를 만들어 사용자가 접속하도록 유도한다. 동일한 화면의 가짜 사이트에 사용자는 정보를 입력하고 서버에 요청을 보낸다. 하지만 실제로 서버에 요청되는 내용은 사용자의 요청이 아닌 공격자가 심어둔 내용으로 이렇게 사용자 권한을 이용해 서버에 변조된 요청을 보내는 공격 방법이 CSRF이다.
CSRF 토큰은 서버에 들어온 요청이 실제 서버에서 허용한 요청인지 확인하기 위한 토큰이다.
서버에서 뷰 페이지를 발행할때 마다 랜덤으로 생성된 토큰을 같이 준 뒤 사용자 세션에 저장한다. 그리고 사용자가 서버에 요청을 보낼 때마다 숨겨진 토큰 값이 함께 서버로 전송되는데, 서버에서는 이 토큰값이 세션에 저장된 값과 일치하는지 확인하여 해당 요청의 위조 여부를 판단한다. 일치 여부를 확인한 토큰은 바로 폐기되고 새로운 뷰 페이지 발행시마다 새로 생성된다.
Q. XSS(Cross Site Scripting)
A. 웹 어플리케이션에서 일어나는 취약점으로 관리자가 아닌 권한이 없는 사용자가 웹 사이트에 스크립트를 삽입하는 공격 기법이다.
Q. 기타 웹 서버 보안 취약점
A. OWASP-10 중 상위 5가지
Q. 프록시 서버
A. 인터넷상에서 클라이언트를 대신하여 데이터를 가져오는 서버를 의미한다. 원래 클라이언트가 서버에 직접 접근하여 응답 내역을 가져와야하지만 프록시 서버가 대신 서버에 요청하고 클라이언트에 전달한다.
프록시 서버를 사용하는 이유와 장점
Q. CORS(Cross-Origin Resource Sharing, 교차 출처 리소스 공유)
A. 추가 HTTP 헤더를 사용하여 한 출처에서 실행중인 애플리케이션이 다른 출처의 자원에 접근할 수 있도록 권한을 부여하도록 브라우저에 알려주는 체제이다.
Q. SOP(Same-Origin Policy)
A. 같은 출처에서만 리소스를 공유할 수 있다는 규칙이다. 브라우저를 거치지 않고 서버 간 통신을 할 때는 이 정책이 적용되지 않는다.
* 동일 출처(same origin)이라는 의미는 스키마, 호스트, 포트가 모두 같을 때를 말한다.
Q. REST vs SOAP
A. 둘 다 온라인 데이터 전송 방식을 의미한다.
* API란 서버의 특정 부분에 접속해 데이터와 서비스를 이용할 수 있게 해주는 소프트웨어 도구이다.
[BACKEND] 백엔드 개발 기술면접 준비(6) 운영체제&네트워크 (0) | 2022.02.03 |
---|---|
[BACKEND] 백엔드 개발 기술면접 준비(5) 데이터베이스 (0) | 2022.02.01 |
[BACKEND] 백엔드 개발 기술면접 준비(4) 자료구조와 알고리즘 (0) | 2022.02.01 |
[BACKEND] 백엔드 개발 기술면접 준비(2) 스프링프레임워크(어노테이션 포함) (0) | 2022.02.01 |
[BACKEND] 백엔드 개발 기술면접 준비(1) 객체지향프로그래밍과 자바 (0) | 2022.02.01 |
댓글 영역