Link : 보이저엑스 채용 사이트
> : 내 답변
접은글 : 자료 정리
질문 리스트
Base64 인코딩이란?
Binary data를 64진법으로 이루어진 문자열(Text)로 인코딩하는 binary-to-text-encoding schemes의 한 종류로, ASCII 문자로만 이루어진 Text로 변환시키는 인코딩이다.
8-bit bytes의 연속인 binary data를 4개의 6-bit Base64 숫자로 나타낼 수 있는 24bits의 연속으로 변환한다.
이 방법을 사용하면 서버와의 연결을 열고 데이터에 대해 HTTP 요청을 할 필요가 없다는 장점이 있다. 하지만 Base64 문자열로 변환할 경우 37% 정도 크기가 더 커지는 단점이 있다.
Ref)
사용자 패스워드를 전송/보관하는 방법은?
유저의 패스워드를 받은 클라이언트는 평문으로 서버로 전송합니다. 평문을 받은 서버는 패스워드를 단방향 해시 함수로 암호화하여 보관합니다. 단방향 해시함수는 수학적 연산에 의해 원본 데이터를 완전히 다른 암호화된 데이터(다이제스트)로 변환하는 것을 말합니다. 원본 데이터로는 다이제스트를 구할 수 있지만 다이제스트로는 원본데이터를 구할 수 없어야 합니다. 이것을 단방향이라 합니다. 단방향 해시함수는 브루트포스 공격으로 쉽게 당할 수 있기 때문에 이를 보완하기 위해 입력된 다이제스트를 N번 반복해서 생성하는 것인 key stretching과 원문 패스워드에 임의의 문자열을 추가하여 해싱하는 것인 salting을 이용해 보안의 강도를 높힐 수 있습니다.
- 평문 : 암호 알고리즘의 입력 대상으로 예정이 된 암호화되지 않은 정보
- 다이제스트 : 해시에 의해 암호화된 데이터
- 키 스트레칭 (Key Stretching) : 해시 함수 여러 번 수행하기
- 솔트 (Salt) : 해시함수를 돌리기 전에 원문에 임의의 문자열을 덧붙이는 것. 단어 뜻 그대로 원문에 임의의 문자열을 붙인다는 의미의 소금친다(salting)
Ref)
system call이란?
프로세스는 프로세스의 생성이나 하드웨어의 조작 등 커널의 도움이 필요할 경우 시스템 콜을 통해 커널에 처리를 요청한다. 프로세스가 사용자 모드로 실행되다가 커널 영역에 접근이 필요할 때 사용하는 인터페이스이다.
- 프로세스 (process) : 실행중인 프로그램
- 스케줄링 대상이 되는 작업 (task)과 같은 의미
- 프로세스 내부에는 최소 하나의 스레드 (thread)를 가지고 있는데, 실제로는 스레드 단위로 스케줄링을 함
- 하드디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게 됨. 이 순간부터 프로세스라 불림.
- 유저 모드 : PC register가 사용자 프로그램이 올라가 있는 메모리 위치를 가리키고 있을 때 현재 사용자 프로그램을 수행중이라고 하며 CPU가 유저모드에서 수행중이라고 말한다.
- 커널 모드 : PC register가 운영체제가 존재하는 부분을 가리키고 있다면 현재 운영체제의 코드를 수행중이라고 하며 CPU가 커널모드에서 수행중이라고 말한다.
- Program Counter (PC) : 다음에 실행할 명령어의 메모리 주소를 저장하는 레지스터. 명령어가 실행될 때마다 자동으로 업데이트되며, 대게는 1씩 증가한다. PC는 CPU의 명령어 가져오기 및 실행 주기에서 핵심적인 역할을 한다.
Ref)
.so와 .a 파일의 차이는?
정적 라이브러리는 동적(공유)라이브러리에 비해 실행 속도가 빠르고 배포에 제약이 없다.
하지만 해당 라이브러리를 필요로 하는 모든 곳에 같은 정적 라이브러리가 링크되기 때문에 배포파일의 사이즈가 커지며 하드디스크 및 메모리의 공간도 더 많이 차지한다.
라이브러리 로직 변경 시, .so 파일은 파일 교체 후 컴파일 없이 재실행하고, .a 파일은 파일 교체 후 재컴파일 후 재실행한다.
.so .a .o .c 파일은 모두 C언어로 작성된 파일이다.
.so : Shared Object, 공유 라이브러리로, 여러 개의 오브젝트 파일을 하나로 묶은 동적 라이브러리이다. 이 라이브러리는 프로그램과 별도로 존재하며, 실행 시에 메모리에 로드되어 공유된다.
.a : Archive Library (= Static Library), 아카이브 라이브러리로, 여러 개의 오브젝트 파일을 하나로 묶은 정적 라이브러리이다. 이 라이브러리는 프로그램과 함께 컴파일되어 실행 파일에 포함된다.
.o : 오브젝트 파일로, 컴파일러가 생성한 기계어 코드를 담고 있는 바이너리 파일이다. 이 파일은 링커가 다른 오브젝트 파일이나 라이브러리와 결합하면 실행 가능한 프로그램이 만들어진다.
.c : C 소스 코드 파일로, C언어로 작성된 텍스트 파일이다. 이 파일을 컴파일하면 .o파일이 생성된다.
실행 파일이 만들어 지기까지의 과정
.c -> 전처리기 -> .i (문법 사항이 적절히 전처리된 c언어 소스 파일) -> 컴파일러 -> .s (어셈블리 소스 파일) ->.o (목적코드) or .a (라이브러리 파일) -> 링커 -> .exe (실행파일)
- 링커 (Linker) : 오브젝트 파일들과 라이브러리를 하나의 이진 실행 파일(.exe)로 결합
Ref)
MySQL과 MongoDB의 차이점은?
- MySQL : SQL (관계형 DB)
- 관계형 데이터베이스 관리 시스템(RDBMS)이다.
- 데이터는 테이블 형식으로 저장된다.
- 테이블은 행과 열로 구성되어 있으며, 행은 레코드, 열은 필드를 나타낸다.
- SQL(Structured Query Language)을 사용하여 데이터를 쿼리한다.
- 관계형 데이터베이스의 두 가지 특징
- 데이터는 정해진 데이터 스키마에 따라 테이블에 저장된다.
- 데이터는 관계를 통해 여러 테이블에 분산된다.
- SQL 장점
- 명확하게 정의된 스키마, 데이터 무결성 보장
- 관계는 각 데이터를 중복없이 한번만 저장
- SQL 단점
- 덜 유연함. 데이터 스키마를 사전에 계획하고 알려야 함. (나중에 수정하기 힘듬)
- 관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있음
- 대체로 수직적 확장만 가능함
- MongoDB : NoSQL (비관계형 DB)
- 비관계형(NoSQL) 데이터베이스입니다. 스키마도 없고, 관계도 없다
- 데이터는 문서 형식으로 저장된다.
- 문서는 JSON 형식과 유사한 BSON(Binary JSON)으로 저장되며, 컬렉션에 그룹화된다.
- 쿼리는 JSON 스타일의 쿼리 언어를 사용한다.
- NoSQL 장점
- 스키마가 없어서 유연함. 언제든지 저장된 데이터를 조정하고 새로운 필드 추가 가능
- 데이터는 애플리케이션이 필요로 하는 형식으로 저장됨. 데이터 읽어오는 속도 빨라짐
- 수직 및 수평 확장이 가능해서 애플리케이션이 발생시키는 모든 읽기/쓰기 요청 처리 가능
- NoSQL 단점
- 유연성으로 인해 데이터 구조 결정을 미루게 될 수 있음
- 데이터 중복을 계속 업데이트 해야 함
- 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 함 (SQL에서는 중복 데이터가 없으므로 한번만 수행이 가능)
Ref)
HTTP/2의 특징은?
HTTP/2는 SPDY 프로토콜에서 파생된 HTTP/1.x보다 지연 시간을 줄이고 응답 시간을 더 빠르게 할 수 있으며 멀티플렉싱, 헤더 압축, 서버 푸시, 요청의 우선순위 처리를 지원하는 프로토콜이다.
멀티플렉싱
여러개의 스트림을 사용하여 송수신하는 것이다. 이를 통해 특정 스트림의 패킷이 손실되었다고 하더라도 해당 스트림에만 영향을 미치고 나머지 스트림은 멀쩡하게 동작할 수 있다. HTTP/1.x에서 발생하는 문제인 HOL Blocking을 해결할 수 있다.
- 스트림 (Stream) : 시간이 지남에 따라 사용할 수 있게 되는 일련의 데이터 요소를 가리키는 데이터 흐름
- HOL Blocking (Head Of Line Blocking): 네트워크에서 같은 큐에 있는 패킷이 그 첫 번째 패킷에 의해 지연될 때 발생하는 성능 저하 현상
헤더 압축
HTTP/1.x에서 발생하는 문제인 헤더 크기가 크다는 점을 HTTP/2에서는 헤더 압축을 써서 해결한다. 허프만 코딩 압축 알고리즘을 사용하는 HPACK 압축 형식을 가진다.
- 허프만 코딩 (huffman coding) : 문자열을 문자 단위로 쪼개 빈도수를 세어 빈도가 높은 정보는 적은 비트 수를 사용하여 표현하고, 빈도가 낮은 정보는 비트 수를 많이 사용하여 표현해서 전체 데이터의 표현에 필요한 비트양을 줄이는 원리이다.
서버 푸시
HTTP/1.1에서는 클라이언트가 서버에 요청을 해야 파일을 다운로드 받을 수 있었다면, HTTP/2는 클라이언트 요청 없이 서버가 바로 리소스를 푸시하는 것을 말한다.html에는 css나 js파일이 포함되기 마련인데 html을 읽으면서 그 안에 들어 있던 css 파일을 서버에서 푸시하여 클라이언트에 먼저 줄 수 있다.
Ref) 면접을 위한 CS 전공지식 노트 - HTTP/2
Firewall의 동작 원리는?
Docker와 Virtual Machine의 차이점은?
> 도커는 컨테이너라는 환경을 만들고, VM은 OS위에 가상의 운영체제를 하나 더 만드는 개념이므로 도커에 비해 VM이 무겁다.
AMD와 Intel CPU의 차이점은?
CRDT란?
CORS란?
Cross-Origin Resource Sharing은 서버가 웹 브라우저에서 리소스를 로드할 때 다른 오리진을 통해 로드하지 못하게 하는 HTTP 헤더 기반 매커니즘이다. 프론트엔드 개발 시 프론트엔드 서버를 만들어서 백엔드 서버와 통신할 때 주로 CORS 에러를 마주치는데, 이를 해결하기 위해 프론트엔드에서 프록시 서버를 만들기도 한다.
- 오리진 (origin) : 프로토콜과 호스트 이름, 포트의 조합을 말한다. 예를 들어 https://kundol.com:12010/test라는 주소에서 오리진은 https://kundol.com:12010을 뜻한다.
- Sop (same origin policy) : 똑같은 origin끼리만 데이터를 송수신 할 수 있다.
- 프록시 서버 (proxy server) : 서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램
Ref)
CI/CD란?
> 개발 및 배포 프로세스를 자동화 하는 것을 말한다. GitHub action 등을 사용하여 구축할 수 있다.
동시 사용자 1만명을 지원하는 채팅 서버를 어떻게 만들겠는가?
GPT4o> 높은 부하를 처리할 수 있는 효율적인 시스템을 구축하기 위해, WebSocket을 사용하여 실시간 양방향 통신을 구현하고, 로드 밸런서를 통해 트래픽을 여러 애플리케이션 서버로 분산시킵니다. Node.js를 애플리케이션 서버로 사용하여 비동기 I/O 처리로 높은 동시성을 지원하며, Redis나 RabbitMQ와 같은 메시지 브로커를 사용하여 메시지 전달을 효율적으로 처리합니다. 데이터는 Redis와 같은 인메모리 데이터베이스를 통해 실시간으로 저장하고, MySQL과 같은 관계형 데이터베이스를 통해 영구 저장합니다. 시스템의 확장성과 고가용성을 위해 Kubernetes를 사용하여 서버를 컨테이너화하고 오케스트레이션하며, Prometheus와 Grafana를 통해 모니터링하고 ELK 스택을 통해 로깅을 관리합니다. 보안을 위해 JWT를 사용한 인증과 SSL/TLS를 통한 데이터 암호화로 안전한 통신을 보장합니다.
- WebSocket
- 웹 브라우저와 서버 간의 양방향 통신을 가능하게 하는 프로토콜
- 일반적인 HTTP는 요청과 응답의 형태로 통신하지만, WebSocket은 한 번 연결이 성립되면 클라이언트와 서버가 자유롭게 데이터를 주고받을 수 있음
- 연결을 유지하면서 데이터를 주고받아 네트워크 트래픽을 줄이고 응답 시간을 단축시킴
- 채팅 애플리케이션 같은 실시간 애플리케이션에 적합
- 로드 밸런서
- 들어오는 네트워크 트래픽을 여러 서버에 분산시켜서 서버 과부하를 방지하는 장치나 소프트웨어
- 서버가 동시에 많은 요청을 처리할 수 있게 하며, 하나의 서버가 고장나더라도 다른 서버가 이를 대신 처리할 수 있어 고가용성을 보장
- 시스템의 성능과 가용성을 높일 수 있음
- Nginx, HAProxy 등
- 애플리케이션 서버
- 클라이언트 요청을 처리하고 비즈니스 로직을 실행하는 서버
- 사용자가 메시지를 보내면 이 메시지를 받아서 데이터베이스에 저장하고 다른 사용자에게 전달하는 작업을 수행함
- 비동기 I/O 처리
- 입출력 작업을 비동기적으로 수행하여 하나의 작업이 완료될 때까지 기다리지 않고 다른 작업을 동시에 수행할 수 있게 하는 방식
- CPU 자원을 효율적으로 사용하여 높은 동시성을 지원
- 높은 동시성
- 시스템이 동시에 많은 사용자나 요청을 처리할 수 있는 능력
- 메시지 브로커
- 메시지를 발신자에서 수신자로 중계하는 시스템
- 메시지를 전달할 때 발신자와 수신자가 직접 연결되지 않고, 브로커(중간 매개체)에 의해 중계됨
- 메세지를 비동기적으로 전달하여 시스템의 구성 요소 간에 효율적인 통신을 가능하게 함
- 높은 처리량과 낮은 지연 시간을 제공하여 실시간 데이터 전송을 지원
- 분산 시스템에서 중요
- RabbitMQ, Redis, Kafka 등
- 인메모리 데이터베이스
- 데이터를 디스크가 아닌 메모리에 저장하여 매우 빠른 속도로 데이터에 접근할 수 있게 하는 데이터베이스
- 자주 접근하는 데이터를 캐싱하여 응답 시간을 줄이고, 데이터베이스 부하를 줄이는 데 효과적
- Redis, Merncached 등
- 관계형 데이터베이스
- 데이터를 구조화하여 (테이블 구조로) 저장하고 SQL 언어를 통해 데이터를 관리하는 데이터베이스
- 데이터 무결성과 일관성을 유지하는 데 도움됨
- 복잡한 쿼리와 트랜잭션을 처리하는 데 강력한 기능 제공
- MySQL, PostgreSQL 등
- 고가용성
- 시스템이 지속적으로 운영될 수 있는 능력
- 서버의 이중화, 데이터 백업, 장애 조치(Failover) 등을 통해 구현됨
- 고가용성 시스템은 장애 발생 시에도 지속적으로 서비스가 운영될 수 있도록 보장함
- 오케스트레이션
- 여러 컨테이너화된 애플리케이션을 자동으로 배포, 관리, 확장, 네트워킹하는 것
- Kubernetes는 이러한 작업을 자동화하여 대규모 시스템의 운영을 단순화하고, 애플리케이션의 확장성과 복구 능력을 높임
- ELK 스택
- Elasticsearch, Logstash, Kibana의 약자로, 로그 데이터의 수집, 분석, 시각화를 위한 플랫폼
- 시스템의 성능 모니터링과 문제 해결을 효율적으로 수행할 수 있게 하여 시스템 운영의 안정성을 높임
- Logstash : 로그 데이터 수집 / Elasticsearch : 저장하고 검색 / Kibana : 시각화
- JWT (JSON Web Token)
- JSON 포맷을 사용하여 두 개체 간에 정보를 안전하게 전송하기 위한 웹 토큰
- 주로 사용자 인증과 권한 부여에 사용됨
- SSL/TLS
- 데이터 전송을 암호화하여 보안을 강화하는 프로토콜
- SSL은 이전 버전이고, TLS가 현재 널리 사용되는 표준
- 이를 통해 클라이언트와 서버 간의 통신을 안전하게 보호함
최근 사회적 이슈가 된 보안 관련 사고 몇가지의 원인과 대책은?
대용량 로그 시스템을 구축한다면 어떻게 하겠는가?
[유사 컨텐츠 사이트]
'Backend' 카테고리의 다른 글
카카오 로그인 과정, OAuth 동작 방식 (0) | 2024.06.17 |
---|---|
FastAPI 동작 구조, 비동기 매커니즘 (1) | 2024.06.15 |