https://github.com/junh0328/prepare_frontend_interview
에서 문제를 가져왔습니다.
-
프로세스와 스레드 🔥
- 프로세스가 뭔가요? (메모리, 프로그램, cpu, 자원공유)
- 우리가 어떤 프로그램을 실행하게 되면 메모리에 해당 프로그램이 올라간다. 이 프로그램을 실행하고 있는 주체를 ‘프로세스’라고 부른다.
- 프로세스는 CPU가 관리한다.
- 프로세스 간에는 메모리 등의 자원을 공유할 수 없다. (프로세스는 서로 간의 자원에 접근 할 수 없다)
- 스레드가 뭔가요? (프로세스를 구성하는 더 작은 실행 단위)
- 프로세스가 할당 받은 자원을 사용하는 실행 흐름의 단위
- 프로세스를 구성하는 더 작은 실행 단위!
- 작업을 처리하는 일손 같은 개념
- 프로세스와 스레드는 어떤 차이가 있나요? (자원 공유)
- 스레드는 프로세스를 구성하는 더 작은 실행 단위
- 프로세스는 다른 프로세스와 자원 공유 안함
- 스레드는 같은 부모 프로세스의 스레드와 공유할 수 있다.
-
싱글 스레드와 멀티 스레드 🔥
- 싱글 스레드
- 작업을 처리하는 스레드가 하나뿐이기 때문에 한번에 하나씩 요청을 처리함
- 싱글 스레드 장점 (데드락 x)
- 멀티 스레드에서는 같은 프로세스 내에서 여러 스레드들이 자원 접근을 하기 때문에 데드락 상태가 발생하기 때문에, 자원 접근에 대한 동기화를 뮤텍스 같은 걸로 신경써야 하는데, 싱글 스레드에서는 이를 신경쓰지 않아도 된다.
- 싱글 스레드 단점( 병목현상 )
- 한번에 하나의 작업만 처리할 수 있기 때문에, 처리할 작업이 많다면 다음 작업이 밀리는 병목현상 발생
- 멀티 스레드 장점 (병렬 처리, 작업 속도 향상)
- 작업을 처리하는 일손이 여러개이기 때문에 병렬적으로 작업을 수행할 수도 있고, 작업 속도도 빠르다.
- 멀티 스레드 단점 (데드락)
- 여러 쓰레드가 하나의 자원을 공유하다보니 데드락 같은 문제가 발생할 수 있다. 고로 동기화 처리가 필요함
+) pcb = 프로세스 컨트롤 블럭. 커널단에서 프로세스를 관리할 때 정보가 필요한데, 그 정보를 담고 있는 구조?
pcb가
+) 컨텍스트 스위칭 = 프로세스가 많이 교체되면
하나는 브라우저로 영화를, 한개는 게임을 하고 있다.
동시에 실행하도록 하고 싶어서 cpu에서 계산했다뺐다하면,,, → 병목 현상이 일어남.
-
HTTP 🔥
- HTTP란 뭔가요? (웹 통신, 요청/응답)
- 하이퍼텍스트 전송 프로토콜
- 네트워크 장치 간에 정보를 전송하도록 설계된 애플리케이션 전송 프로토콜
- 웹에서 통신할 때 사용하는 프로토콜.
- HTML 문서와 같은 리소스를 전송하기 위해서 사용
- 클라이언트와 서버 간의 요청/응답 프로토콜로 동작
- HTTP 프로토콜의 가장 큰 특징은 뭔가요? (무연결성, 무상태성)
- 무연결성: 클라이언트가 서버에 요청을 보내고, 서버가 응답을 한 후에 바로 종료
- 무상태성: 서버가 클라이언트의 상태 정보를 유지하지 않음
- URL은 뭔가요?
- HTTP/1.1 과 HTTP/2.0의 차이는 뭔가요?
- 1.1 (한번에 한번의 요청과 응답만, 무거운 헤더 구조)
- 클라이언트, 브라우저에서 리퀘스트가 하나 날아가면, 서버에서는 하나의 응답만 줬음.
- 즉, 10개의 데이터가 필요하다면 10개의 리퀘스트가 필요하다.
- 무거운 헤더 구조 → 헤더에 쿠키 등 많은 메타데이터가 들어가 있었는데, 압축되지 않아 무거웠음.
- 2.0 (한번에 여러 요청과 응답 동시에 처리 가능, 서버 푸시, 무거운 헤더 구조 개선)
- 한번에 여러 요청과 응답을 동시에 처리할 수 있다. → 효율적인 데이터 전송이 가능하다.
- 멀티 플렉싱 사용하기 때문에, 병렬적인 스트림을 통해 데이터를 서빙하기 때문에 효율적인 데이터 전송이 가능하다.
- 헤더 압축을 써서 무거운 헤더 구조 개선 (허프만 코딩 압축 알고리즘 사용하는 HPACK 압축 형식을 가진다)
- 서버 푸시 기능 → 클라이언트가 요청하지 않는 리소스도 먼저 보낼 수 있다. (html 요청시 그 안에 있는 css, js를 미리 서버에서 푸시하여 클라이언트에게 전달할 수 있다)
- HTTPS는 HTTP랑 뭐가 다른가요? (SSL/TLS 암호화 프로토콜 적용 여부)
- HTTPS는 HTTP에서 SSL/TLS라는 보안 프로토콜을 사용해 데이터를 암호한다.
- EX) 로그인 중에 비밀번호를 리퀘스트에 담아 보냈는데, HTTPS 를 적용하지 않으면 문자열 그대로 노출됨. HTTPS 면 암호화된 상태이기 때문에 유의미한 비밀번호 탈취할 수 없다.
- 심화) 공개키 (비대칭키) 방식이 뭔가요?
- 암호화 기법 중 하나로, 하나의 공개키 다른 하나는 개인키를 사용합니다. (키를 두개 들고 있음)
- 공개키로 암호화된 데이터는 개인키로만 복호화할 수 있음.
- 고로 복호화가 가능한 개인키는 탈취되어선 안된다.
-
쿠키 세션 🔥
- 쿠키, 세션을 왜 쓰나요? 🔥🔥 (클라이언트가 서버에 누구인지 지속적으로 알기 위해)
- HTTP의 특징 상, 클라이언트에서 요청 후 서버에서 응답을 주면 통신이 끊기고, 연결이 끊기면 상태를 남기지 않기 때문에
- 유저가 로그인 관련 액션을 할 때 매번 로그인 인증을 해야함.
- 이를 해결하기 위해 쿠키와 세션을 사용한다. (클라이언트가 서버에 누구인지 지속적으로 알려주기 위해)
- 쿠키가 뭔가요? 🔥🔥 (브라우저의 메모리 혹은 파일로 저장되는 데이터)
- 브라우저에 속하는, 클라이언트 브라우저의 메모리 혹은 파일로 저장되는 데이터
- 유효기간이 있는 키-값의 쌍
- 브라우저에 노출되기 때문에 탈취 우려가 존재
- 세션이 뭔가요? 🔥🔥 (서버에 저장)
- 서버 자체에 저장되는 것
- 쿠키 보다는 상대적으로 보안에 우위
- 지속시간, 만료시간 데이터 등 저장 가능
- 보안을 위해서 http-only, same-site 옵션을 넣어줌
- 쿠키와 세션의 차이는 어떤 점이 있을까요? 🔥🔥 (저장 위치와 보안)
- 저장위치: 쿠키는 브라우저에 저장, 세션은 서버에 저장
- 보관 기간: 쿠키는 설정된 만료 날짜에 맞춰서, 세션은 클라이언트가 서버에 접속한 후 로그아웃하거나 세션이 만료될때까지 보관한다
- 보안: 브라우저에 저장되므로 보안에 취약, 조작 및 탈취 가능, 세션은 서버에 저장되므로 보안에 덜 취약 (보통 세션 쿠키로 세션 id 만 주고 받으니까)
-
CORS 🔥
- CORS가 뭔가요? (브라우저와 서버의 도메인이 일치하지 않는 경우)
- 브라우저와 서버의 도메인이 일치하지 않아서 요청이 차단되는 현상
- JS에서 fetch로 보내는 요청은 기본적으로 동일 출처 정책(same origin policy)을 따른다.
- 많은 경우 다른 서버에 있는 자원을 공유 받기 때문에, cors 에러가 발생함. 그렇기 때문에 허용을 해줘야 한다.
- 브라우저에서 요청을 보낼때 origin 헤더에 출처를 보냄 → 서버에서 access-control-allow-origin에 허용되는 출처를 담아서 보냄 → 브라우저에서 origin과 access-control-allow-origin을 비교하여 동일하지 않으면 cors에러 발생
- CORS를 겪고 직접 해결해 본 경험이 있으면 말해주세요
+) 백엔드에서 화이트리스트로…
+) preflight request → option메서드로 보냄. 이때 cors에 와일드카드를 넣으면 에러가 난다.