✅ 쿠키에 대해 설명해주세요. (쿠키를 통해 HTTP 상태유지를 어떻게 하는지 클라이언트-서버 관점에서 설명. 장단점 설명)
HTTP 는 비연결성, 비상태성이라는 특징을 지니고 있어 요청 간 의존관계가 없습니다. 상태와 연결을 유지하지 않는 http 에서 상태를 유지하기 위한 방법 중 하나로 쿠키가 있습니다.
먼저, 쿠키란 클라이언트의 로컬에 저장되는 키와 값이 들어있는 파일로, 쿠키이름, 쿠키 값, 유효시간, 경로 등을 포함하고 있습니다.
쿠키는 클라이언트의 상태 정보를 브라우저에 저장하여 참조합니다.
- 동작방식
a. 웹 브라우저가 서버에 요청
b. 상태를 유지하고 싶은 값을 쿠키로 생성
c. 서버가 응답할 때 HTTP 헤더(Set-Cookie)에 쿠키를 포함해서 전송
d. 전달 받은 쿠키는 웹 브라우저에서 관리하고 있다가 다음 요청 때 쿠키를 HTTP 헤더에 넣어서 전송
e. 서버에서는 쿠키 정보를 읽어 이전 상태 정보를 확인한 후 응답
- 장단점
쿠키는 클라이언트에 정보가 저장되므로 보안에 취약하지만 서버에 요청 시 속도가 빠르다는 장점이 있습니다.
✅ 세션에 대해 설명해주세요. (세션을 통해 HTTP 상태유지를 어떻게 하는지 클라이언트-서버 관점에서 설명. 장단점 설명)
세션은 쿠키와 마찬가지로 http 상태유지를 위해 사용자가 어떤 웹사이트를 방문할 경우, 사용자와 서버 사이의 연결을 확인하기 위한 정보입니다.
즉, 세션은 웹브라우저를 통해 서버에 접속한 이후부터 브라우저를 종료할 때 까지 요청상태를 유지합니다. (만료시간을 정할 수는 있지만 만료시간에 상관없이 브라우저를 종료하면 상태 유지를 종료합니다.)
- 동작방식
a. 웹 브라우저가 서버에 요청
b. 서버가 해당 웹 브라우저(클라이언트)에 유일한 ID(Session ID)를 부여함
c. 서버가 응답할 때 HTTP 헤더(Set-Cookie)에 Session ID를 포함해서 전송. 쿠키에 Session ID를 JSESSIONID라는 이름으로 저장
d. 웹 브라우저는 이후 웹 브라우저를 닫기까지 다음 요청 때 부여된 Session ID가 담겨있는 쿠키를 HTTP 헤더에 넣어서 전송
e. 서버는 세션 ID를 확인하고, 해당 세션에 관련된 정보를 확인한 후 응답
- 장단점
실제 저장된 정보가 서버에 있으므로 서버의 처리가 필요해 속도가 느리며 서버 부하가 일어날 수 있다는 단점이 있지만
쿠키에 비해 비교적 보안성이 좋다는 장점이 있습니다.
✅ CORS가 뭘까요? (Same Origin Policy와 함께 설명, 프론트, 백엔드 관점에서 설명)
CORS 란 Cross-Origin Resource Sharing의 줄임말로, 쉽게 말해 다른 출처 간 리소스 공유를 의미합니다. 여기서 말하는 출처(origin)란 프로토콜, host, 포트 번호를 의미하며 프로토콜, host, 포트 번호 중 하나라도 다르면 출처가 다르다고 말합니다. 반대로 sop(same origin policy)는 같은 출처에서만 리소스를 공유할 수 있다는 브라우저 정책입니다. 웹이라는 환경에서는 다른 출처에 있는 리소스를 가져와서 사용하는 일이 매우 흔하기 때문에 sop에 대한 예외 조항을 두고 이 예외에 해당하는 요청은 다른 출처 간 리소스 공유를 허용하는데 이를 cors정책을 지킨 리소스 요청이라고 할 수 있습니다.
-동작방식
웹 클라이언트 어플리케이션이 다른 출처의 리소스를 요청할 때는 HTTP 프로토콜을 사용하여 요청을 보내게 되는데, 이때 브라우저는 요청 헤더에 Origin이라는 필드에 요청을 보내는 출처를 함께 담아보냅니다. 이후 서버가 이 요청에 대한 응답을 할 때 응답 헤더의 Access-Control-Allow-Origin이라는 값에 “이 리소스를 접근하는 것이 허용된 출처”를 내려주고, 이후 응답을 받은 브라우저는 자신이 보냈던 요청의 Origin과 서버가 보내준 응답의 Access-Control-Allow-Origin을 비교해본 후 이 응답이 유효한 응답인지 아닌지를 결정합니다.
✅ REST 에 대해 설명해주세요. (RESTful, REST API에 대해서도 설명)
REST(Representational State Transfer)의 약자로 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미합니다.
즉 REST란
1) HTTP URI를 통해 자원을 명시하고, 2) HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해 3) 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미합니다.
REST API란 REST의 원리를 따르는 API를 의미합니다. 하지만 REST API를 올바르게 설계하기 위해서는 지켜야 하는 몇가지 규칙이 있습니다.
- REST API 설계 예시
1. URI는 동사보다는 명사를, 대문자보다는 소문자를 사용하여야 한다.
2. 마지막에 슬래시 (/)를 포함하지 않는다.
3. 언더바 대신 하이폰을 사용한다.
4. 파일확장자는 URI에 포함하지 않는다.
5. 행위를 포함하지 않는다.
-RESTFUL
RESTFUL이란 REST의 원리를 따르는 시스템을 의미합니다. 하지만 REST를 사용했다 하여 모두가 RESTful 한 것은 아닙니다. REST API의 설계 규칙을 올바르게 지킨 시스템을 RESTful하다 말할 수 있으며
모든 CRUD 기능을 POST로 처리 하는 API 혹은 URI 규칙을 올바르게 지키지 않은 API는 REST API의 설계 규칙을 올바르게 지키지 못한 시스템은 REST API를 사용하였지만 RESTful 하지 못한 시스템이라고 할 수 있습니다.
✅ XXS가 뭘까요? (공격 방식과 대응 방식에 대해 설명)
관리자(admin)가 아닌 사용자가 웹 사이트에 스크립트를 삽입하는 공격 기법입니다.
해커가 게시물 같은 곳에 악의적인 스크립트를 삽입하고, 이를 열람한 로그인된 사용자의 쿠키를 탈취합니다. 해커는 이 탈취한 쿠키에 담긴 세션 ID로 사용자의 계정에 로그인할 수 있게 됩니다.
-공격 방식
공격 방법에 따라 Stored XSS와 Reflected XSS로 나뉩니다. Stored XSS는 사이트 게시판이나 댓글, 닉네임 등 스크립트가 서버에 저장되어 실행되는 방식이고, Reflected XSS는 보통 URL 파라미터(특히 GET 방식)에 스크립트를 넣어 서버에 저장하지 않고 그 즉시 스크립트를 만드는 방식입니다. Reflected XSS의 경우 브라우저 자체에서 차단하는 경우가 많아 상대적으로 공격을 성공시키기 어려워 대부분은 Stored XSS 입니다.
-공격 대응
1. 허용된 위치가 아닌 곳에 신뢰할 수 없는 데이터가 들어가는 것을 허용하지 않는다.
2. 신뢰할 수 없는 데이터는 검증을 해야 한다.
3. HTML 속성에 신뢰할 수 없는 데이터가 들어갈 수 없도록 해야 한다.
4. 자바스크립트에 신뢰할 수 없는 값이 들어갈 수 없도록 해야 한다.
5. CSS의 모든 신뢰할 수 없는 값에 대해 검증해야 한다.
6. URL 파라미터에 신뢰할 수 없는 값이 있는지 검증해야 한다.
7. HTML 코드를 전체적으로 한 번 더 검증해야 한다.
✅ SQL Injection 공격이 뭘까요? 어떻게 대비할 수 있을까요? (공격 방식과 대응 방식에 대해 설명)
SQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위 입니다. SQL Injection공격은 공격이 비교적 쉬운 편이고 공격에 성공할 경우 큰 피해를 입힐 수 있는 공격입니다.
-공격 방식
1) 인증 우회
SQL 인젝션 공격의 대표적인 경우로, 로그인 폼(Form)을 대상으로 공격을 수행한다. 정상적인 계정 정보 없이도 로그인을 우회하여 인증을 획득할 수 있다.
ex 1.
로그인 시, 아이디와 비밀번호를 input 창에 입력하게 된다. 아이디가 abc, 비밀번호가 만약 1234일 때 쿼리는 아래와 같은 방식으로 전송될 것이다.
SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234";
input 창에 비밀번호를 입력함과 동시에 다른 쿼리문을 함께 입력한다면?
"1234"; DELETE * USER FROM ID = "1";
보안이 완벽하지 않은 경우, 이처럼 비밀번호가 아이디와 일치해서 True가 되어 뒤에 작성한 DELETE 문이 데이터베이스에 영향을 줄 수도 있다.
ex 2.
기본 쿼리문의 WHERE 절에 OR문을 추가하여 '1' = '1'과 같은 true문을 작성하여 무조건 적용되도록 수정한 뒤 DB를 마음대로 조작할 수도 있다.
select * from client where name='anjinma' and password=' or '1'='1
2) 데이터 노출
시스템에서 발생하는 에러 메시지를 이용해 공격하는 방법이다. 보통 에러는 개발자가 버그를 수정하는 면에서 도움을 받을 수 있지만, 해커들은 이를 역이용해 악의적인 구문을 삽입하여 에러를 유발시킨다.
ex) 해커는 GET 방식으로 동작하는 URL 쿼리 스트링을 추가하여 에러를 발생시킨다. 이에 해당하는 오류가 발생하면, 이를 통해 해당 웹앱의 데이터베이스 구조를 유추할 수 있고 해킹에 활용한다.
url을 통해 파라미터를 주고받는 GET 방식은 해커가 단순히 url을 통해 전달될 파라미터를 조작하기만 한다면 손쉽게 SQL injection 취약점을 적용할 수 있다.
-공격 대응
1) 입력 값에 대한 검증
검증 로직을 추가하여 미리 설정한 특수문자들이 들어왔을 때 요청을 막아냅니다.
2) Error Message 노출 금지
데이터베이스 에러 발생 시 따로 처리를 해주지 않았다면, 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환해 줍니다. 여기서 테이블명, 컬럼명, 쿼리문이 노출이 될 수 있기 때문에, 오류발생 시 사용자에게 보여줄 수 있는 페이지를 따로 제작하거나 메시지박스를 띄우도록 해야합니다.
3) Prepared Statement 구문사용
서버의 php파일에 sql 쿼리문이 아래와 같이 고정되어 있고 외부의 입력으로는 이 템플릿을 변경할 수 없다면, ?에 들어가는 데이터는 단순히 문자열로 취급하기 때문에 SQL 인젝션은 발생할 수 없습니다.
INSERT INTO MyGuests VALUES(?, ?, ?)
✅ 토큰에 대해 설명해주세요. (토큰을 통해 HTTP 상태유지를 어떻게 하는지 클라이언트-서버 관점에서 설명. 장단점 설명)
토큰은 사용자의 인증 정보를 암호화 한 것으로, 일종의 출입증 역할을 합니다. 사용자가 최초 로그인 시 토큰을 발급해주고 이후 사용자는 이 토큰을 가지고 웹사이트에 출입할 수 있게 됩니다.
-동작방식
1. 사용자가 로그인 시 서버는 토큰을 발급해줍니다.
2. 사용자는 발급된 토큰을 pc에 저장합니다. (로컬에)
3. 사용자는 이후 다른 요청을 보낼 때 헤더에 토큰을 같이 보냅니다.
4. 서버는 사용자의 토큰 정보를 검증한 뒤(복호화), 사용자의 권한을 확인하고 요청을 처리해줍니다.
-장단점
토큰은 세션과 달리 클라이언트에 저장되기 때문에 서버에 유저 정보를 저장할 필요가 없고 서버는 토큰 검증만 수행하면 되기 떄문에 서버에 부담이 적습니다.
✅ URL, URI, URN 차이가 뭘까요? (각각 자원을 식별하는 방식을 설명, 각각의 포함관계를 설명)
-URI
즉, URI는 인터넷의 자원을 식별할 수 있는 문자열을 의미하며 URI의 하위 개념으로 URL과 URN이 있습니다. URI 중 URL, URN이라는 하위 개념을 만들어서 특별히 어떤 표준을 지켜서 자원을 식별하는 것입니다.
-URL
URL은 어떻게 리소스를 얻을 것이고 어디에서 가져와야하는지 명시하는 URI이며 네트워크 상에서 리소스(웹 페이지, 이미지, 동영상 등의 파일) 위치한 정보를 나타냅니다.
-URN
URN은 경로와 리소스 자체를 특정하는 것을 목표로하는 URI이며 URI의 표준 포맷 중 하나로, 이름으로 리소스를 특정하는 URI입니다. URN에는 리소스 접근방법과, 웹 상의 위치가 표기되지 않고 실제 자원을 찾기 위해서는 URN을 URL로 변환하여 이용합니다.
✅ 웹 캐시에 대해 설명해주세요. (웹 캐시를 사용했을 때의 이점에 대해 설명)
캐시란 데이터에 빠르게 접근하기 위해 자주 사용되는 데이터나 값을 미리 복사해 놓는 임시 장소를 의미합니다.
프론트엔드에서는 서버에 요청을 보내고 응답을 받아 화면을 렌더링하는 경우가 많은데, 네트워크를 통해 서버에 데이터를 요청하게 되면, 해당 서버가 응답을 반환할 때까지 페이지가 로드되지 않습니다.
페이지 로딩에 필요한 리소스를 캐싱하여 사용하게 되면, 요청을 보내는 네트워크 요청 횟수를 줄일 수 있을 뿐만 아니라 서버 응답을 기다려야 할 필요도 없기 때문에 사용자에게 보다 빠르게 화면을 보여줄 수 있습니다.
이러한 개념을 웹 캐싱이라고 합니다.
웹 캐시는 프록시 서버를 통해 구현할 수 있는데, 이 프록시 서버는 클라이언트와 서버 사이에 위치합니다. 프록시 서버는 클라이언트가 서버에게 요청하는 것을 듣고
1) 만약 요청하는 컨텐츠가 자신(프록시 서버)에게 있을 경우, 바로 클라이언트에게 컨텐츠를 제공하고
2) 요청하는 컨텐츠가 자신에게 없을 경우 오리지널 서버에게 컨텐츠를 요청하고 이를 프록시 서버에 저장한 후 클라이언트에게 제공하는 형태로 동작합니다.
✅ 웹 프록시에 대해 설명해주세요. (프록시의 역할과 사용 예시 설명, 포워드 프록시, 리벅스 프록시에 대해 설명)
프록시 서버란 클라이언트가 자신을 거쳐 다른 네트워크에 접속할 수 있도록 중간에서 대리해주는 서버를 말합니다. 서버와 클라이언트 사이에서 대리로 통신을 수행해주는 것을 프록시라고 하고 그 기능을 하는 서버를 프록시 서버라 부릅니다.
- 프록시 서버의 역할
- pc와 외부 인터넷 사이의 징검다리 역할
- 중계를 해주기 때문에 외부 인터넷에서는 Client의 정보를 알 수 없다.
- 외부 인터넷의 내부 침입을 막는 방화벽과 관련이 있다.
- Proxy Server는 캐시 기능이 있다.
- IP를 바꾸기 위한 용도로 많이 사용되고 있다.
- A Client가 B Proxy에 접근하여 C인터넷(google.com)에 접속하는 방식
- A Client (Proxy Server 설치) 한 후 에 C라는 컴퓨터를 감시한다면, C 컴퓨터의 브라우저 설정을 C 컴퓨터 IP 주소로 하면 C 컴퓨터 그룹 A Client에 남길 수 있다.
📌 어려웠던 점
양이 방대해서 설명할때 주저리주저리 하기보다 어떻게 깔끔하게 정리해서 말해야할지 고민을 많이 했다.
실제 면접이라고 생각했을 때 네트워크의 특정 주제로만 혼자 몇분을 얘기하고 있을 수는 없으니 처음에는 깔끔하게 두 세 문장으로 정리해서 말하고 추가 질문에 대비할 수 있게 알고는 있는 정도로 준비해야겠다! 🙃🙃