# 기술면접시 기초 기술 질문을 상상해보면서 생각날때마다 적어본다.
# google keep 노트 하나에 들어가는 사이즈 보다 커져서 블로그에 적게됐다.
# 기본 알고리즘 시간복잡도 참고 https://www.bigocheatsheet.com
- 좋아하는 프로그래밍 언어는 무엇이고, 좋아하는 이유는 뭔가요?
golang, c, python, c++ (좋아하는 순서대로)
golang : c/c++ 처럼 빠르고 class, header file 등이 없어 간결하고 좀 더 쉽게 프로그래밍 할 수 있어 좋다. 특히 go 루틴은 c++에서 골치아픈 멀티 쓰레딩 구성을 아주 쉽게 표현해 낸다. 그리고 기본적인 라이브러리 패키지등이 많이 제공되어 c++ 처럼 이것저것 찾아서 링크할 수고가 없어 좋다.
c : 프로그래밍이 뭔지를 알게 해준 언어로, 포인터로 메모리등의 하드웨어를 생각해주어 애착이 가며, 가끔 코딩하면 옛날로 돌아 간것 같은 기분을 느끼게 해준다.
python : 파이썬은 생각하는 그대로 마치 pseudo 코드 작성하는것 같이 쉽다. 어떤 로직을 테스트해볼때 가장 빨리 만들 수 있어 좋고, 특히 수학, 데이터 관련 로직을 아주 쉽게 풀어 낼 수 있는 장점이 있다. 갠적으로는 golang 프로그래밍 느낌과 비슷하다.
c++ : c와 같이 포인터의 효율성이 좋고 빠르고 오랫동안 사용해 익숙하다. 단 c++ template 및 통합되지 않고 있는 boost, 최신 c++ 버전등은 어렵게 느껴진다.
- 여러 프로젝트를 해봤는데, 어떤 것이 가장 기억에 남는지? 그 이유는?
ocr(광학문자인식), 대학원생으로서 나름 전문분야의 시작이었고, 첫 회사의 업무였다.
당시 문제를 해결하기 위해 논문을 찾아가며 팀원과 논의하는 과정에서 많이 힘들었지만 마치 미지의 세계를 찾는 듯한 희열이 있었다. 이런 저런 생각들을 프로그래밍하고 결과물이 조금씩 개선되는 모습을 보면 뿌듯했다. 결국 프로젝트가 중단되었지만 문제 해결을 위한 트레이닝은 많이 되었던것 같다.
- 프로그래밍 중 막히는 부분이 있을때 어떻게 해결 하나요?
1. 우선 방해받지 않는 상태에서 해당 문제에 집중해 본다.
2. 그 다음은 검색(구글)을 해본다. 외국의 유능한 프로그래밍 능력자들의 글을 찾아본다.
3. 이때도 안된다면 주위 프로그래머들에게 자문을 구한다.
개인적으로 1번째 스텝을 중요하게 보는데, 개인적인 문제 해결 능력, 즉 생각하기를 끊임없이 시도하는것이 나름대로의 뇌를 훈련시키는 것이라고 본다.
- 멱등성(idempotence)은 뭔가요?
여러번 연산을 수행하더라도 결과가 달라지지 않는 성질로, 함수형 프로그래밍이나 ansible 과 같은 배포 자동화툴에서 많이 사용한다.
- 클로저(closure) 는 무엇이고 어떤 경우에 사용하나요?
클로저는 (외부)함수가 (내부)함수를 리턴하는 형태로 외부함수가 종료(리턴)된후에도 내부함수에서 외부함수의 변수값을 유지할 수 있는것을 말하며 클래스가 없는 javascript/go 등의 언어에서 보호되는 일종의 private 변수를 만들때 사용한다.
- python 에서 decorator 는 뭔가요?
함수의 처리 전, 후에 공통적인 처리를 하고 싶은경우 decorator 사용한다. 먼저 A 라는decorator 함수 @A 를 만든다. A 함수는 closure 로 내부함수를 선언하고 내부함수에 decorator 로 넘어올 함수와 공통으로 처리될 작업을 명시하게 된다.
- critical section, mutex, semaphore 차이는 뭔가요?
critical section은 유저모드에서 빠르고(커널모드가 아니라서) 간단하게 사용할 수 있는 동기화 방법으로 1개의 키를 획득한 쓰레드 하나만 임계영역에 접근할 수 있다.
뮤텍스와 세마포어는 둘다 커널모드에서 동작하는 동기화 방식이다.
뮤텍스(상호배제) 는 하나의 프로세스에서 멀티 쓰레들간의 임계영역 소유권을 1개의 키로 제어하고 임계영역을 사용하는(소유한) 쓰레드만이 임계영역 사용을 해제(키반납)할 수 있다.
세마포어는 프로세스들간의 임계영역 접근을 제어어하는 수단으로 n 개의 키로 임계영역의 접근에 n 개의 프로세스 접근할 수 있도록 한다. 뮤텍스는 키가 1개짜리 세마포어라고 볼 수 있다.
- dns 에 a(record) 와 cname 의 차이
a 는 ip 를 카르키는데만 사용하고 cname(canonical name) 은 a 또는 다른 cname 을 가르키는데 사용된다.
aaa.ysoftman.com (cname) -> bbb.ysoftman.com
ccc.ysoftman.com (cname) -> ddd.ysoftman.com
ddd.ysoftman.com (a) -> 123.123.123.123
예) dig mail.google.com
mail.google.com. 328255 IN CNAME googlemail.l.google.com.
googlemail.l.google.com. 254 IN A 172.217.24.197
- ip 에서 loopback 이란
어떤한 가공도 없이 전송한 서버로 되돌아 가는것(서버가 자기 자신으로 돌아(요청)가는것)으로 127.0.0.1 주소를 사용한다.
- tcp 에서 linger 옵션은 뭔가요?
linger 는 tcp 소켓이 close 될때 소켓버퍼에 남아 있는 데이터를 어떻게 할지 정하는 옵션이다.
기본은 꺼져있는 상태로 소켓버퍼에 남아 있는 데이터를 보낸다.
linger 옵션을 켜면 설정한 linger 지연시간 만큼 블럭하고 소켓버퍼에 남아 있는 데이터를 보낼때까지 기다린다. linger 지연시간이 0 이면 소켓버퍼를 모두 버린다.
- tcp 에서 nodeplay 옵션은 뭔가요?
nodelay 옵션은 데이터를 작게 여러번 보내지 말고 한번에 많이 보내는 nagle 알고리즘을 적용유무를 결정한다.
nodelay = 0 nagle 알고리즘 사용(디폴트), 한번에 큰 데이터가 전송되어 네트워크 대역폭을 효율적으로 사용하지만 다음 데이터를 보내려면 ack 응답을 기다려야 함으로 느리다.
nodelay = 1 nagle 알고리즘 사용안함, 데이터를 쪼개서 여러번 보내게 되면 네트워크 대역폭 효율성이 떨어지지만 ack 응답을 기다리지 않고 다음 작은 데이터를 바로 보낼수 있어 빠르다.
- offloading 이란 뭔가요?
offloading 은 분리해서 읽어들인다는 의미로, 부하를 줄이거나 특정 서버나 데이터를 보호하기 위한 기법이다. db 에서는 쓰기(create,update,delete)쿼리에 master db를 사용하고 읽기(select)쿼리에는 여러개의 slave db를 사용해 부하를 분산한다. 참고로 데이터를 분산 저장하는 sharding(조각)방법도 있다. 웹서비스에서는 주로 사용자의 요청 에서 ssl handshake 와 암호화/복호화를 위한 서버를 따로 두어 웹서버를 보호하고 부하를 줄인다.
- L4(layer4, tcp)-load balancer 장비에서 DSR 은 뭔가요?
다음과 같이 요청시
client -> dns -> L4 -> server
SLB(inline 라고도 함) 은 server -> L4 -> client 로 응답
DSR(Direct Sever Return) 은 server -> client 로 응답, L4 를 경유하지 않는다. client 입장에서는 L4 에게 요청했기 때문에 L4 ip 주소가 담긴 패킷으로 응답을 받아야 한다. 따라서 server 에서 lo:0(loopback, 기본 lo 127.0.0.1 이외) 를 L4 주소로 추가 설정해 클라이언트에게 L4 ip 로 응답하도록 한다.
- GSLB 는 뭔가요?
DNS 와 LB 기능을 혼합한 형태로, DNS 는 단순 레코드에 등록된 다수의 ip 에 대해서 roundrobin 으로 알려주지만 GSLB 는 각 서버ip 에 대해 healthcheck 를 수행해 정상적인 서버ip 만 리턴하고 위치적으로 사용자와 가까운 서버ip 를 알려준다.
- nat 는 뭐고 왜 사용할까요?
network address translation 으로 ip 패킷내의 소스와 목적지 ip port 를 변경해서 사설망와 외부망사이에 통신을 할수 있게 한다. 외부망인 공인ip 하나에 여러개의 사설ip를 연결할수 있어, 부족한 공인ip를 아낄수 있다.
- consistent hashing(일관된 해싱)이란 뭔가요?
nosql db 에서 shard로 분산된 환경에서 키들을 n개의 서버로 분산하고 노드 추가 삭제(fail) 에도 해당 노드만 재분하는 알고리즘이다.(memcached가 대표적, redis 는 hashing slot 방법을 사용함) sharding 된 노드(N개)을 링 구조위에 있다고 생각하고 해싱된(CRC(cyclic redundancy check)순환 중복값 방식을 사용) 키로 링위에 위치 시켰을때 그 키는 시계방향으로 처음 만나는 shard(노드)에서 읽고 쓰고 한다. 노드 장애로 노드가 빠지면 그 노드에서 관리되는 키들은 빠진 노드의 시계방향으로 다음 노드가 담당한다. 이 경우 한쪽 노드에 많은 키가 몰리는 것을 방지하기 위해 n개의 노드만큼 가상의 노드들을 무작위로 링위에 배치하고 키들을 가상의 노드를 시계방향으로 처음 만나는 가상의 노드를 사용하며 가상노드들을 각자 실제 노드로 매핑한다.(링 그림을 그려서 설명하면 좋을듯)
- local port range 를 설정하는 이유는 뭔가요?
로컬 포트는 간단히 말해 클라이언트 포트이다.
src(ip:port) -> dest(ip:port) 구조에서 apache, nginx 와 같은 웹서버에서는 80, 8080 등을 src 포트로 명시해 사용한다. 반면 클라이언트로써 dest(서버)연결이 필요할때 src(로컬)에서 사용할 포트는 커널이 로컬 포트 범위내에서 선택한다.
sysctl net.ipv4.ip_local_port_range 로 보면 로컬 포트 범위를 알 수 있다.
- on the fly 는 어떤 의미인가요?
그때그때 처리하는 것으로 웹요청을 예로 들자면 요청에 대한 응답을 결과를 미리처리(캐싱,백업등)하여 사용하지 않고 요청에 오면 그때서야 처리 작업을 수행한다는 의미
- SSL/TLS 용어는 다른가요?
TLS(Transport Layer Security) 전송계층에서 사용되는 표준 암호화 프로토콜로 http, ftp 등에 사용할 수 있다. TLS 는 표준이 없던 예전 네스케이프에서 개발한 SSL(Secure Socket Layer)이 발전된 형태로 SSL 과 TLS 혼용해서 말하다. 오픈 소스 OpenSSL 도 아직 SSL 용어를 쓰고 있다.
- forward/reverse proxy 를 설명해주세요.
forward proxy 는 데이터 흐름이 서버->클라 방향(forward)으로 클라 요청에 대한 응답을 처리한다. clientside proxy 라고도 한다.
reverse proxy 는 데이터 흐름이 서버->백엔드 서버 방향(reverse)으로 프록시는 클라 요청에 따라 실제 백엔드 서버로 요청한다. serverside proxy 라고도 한다. HAProxy, NginX, Apache 등이 reverse proxy 기능을 지원한다.
- 일급객체(일급시민)(first class / citizens) 는 무엇인가요?
다른 객체들에게도 적용 가능한 연산을 모두 지원하는 객체를 말한다. 예를 들어 변수에 담을 수 있고, 파라미터로 전달이 가능하고, 리턴값으로 사용할 수 있다. 대부분의 프로그래밍 언어에서 정수(int), 실수(float)는 일급 객체이다.
- copy on write(COW) 를 설명해주세요.
말 그대로 쓸려고 할때 복사를 수행한다는 의미로, 리소스(메모리)를 공유하고 있는 두 프로세스가 있다고 했을때 한쪽에서 메모리의 내용을 수정(write)하면 다른 프로세스에 영향을 주니 수정할 메모리 내용을 새로운 메모리에 복사하고 그 복사본에 쓰기 작업을 수행한다. os fork() 에서 자식 프로세스를 생성시 cow 가 사용된다. 프로그래밍으로 예를 들자면
string str = "hello"
string str2 = str1 // str1 과 str2 같은 메모리 공유
str2 += ", world" // str2 을 수정하려고 할때 str1 내용 복사가 발생하고, 복사본에 수정작업을 수행한다. str1 과 다른 메모리를 사용한다. str1 은 여전히 "hello"
- const 와 literal 의 차이는 뭔가요?
const(c, c++) 또는 final(java) 는 상수변수로 변수가 담고 있는 값이 변하지 않는다는 의미이고, literal(사전적의미로 '글자그대로의') 은 int a = 1 에서의 1 은 정수형 리터럴이고, string b = "str" 에서의 "str" 은 스트링 리터럴로 데이터 값 자체를 말한다. 참고로 f := func() 처럼 함수 리터럴도 있다.
- c/c++ 에서 참조변수와 포인터변수의 차이
int a=10
int &r=a reference variable r
int *p=&a pointer variable p
참조(reference) 변수는 참조하는 변수의 alias로 참조하고 있는 변수의 메모리공간을 공유하기 때문에 참조변수자체의 메모리 공간(할당)은 없지만 포인터(pointer) 변수는 일반 변수처럼 포인터 변수 자체의 메모리공간(할당)이 있고 참조하는 변수의 주소값을 저장한다.
참조변수는 null 설정이 허용안되지만 포인터변수는 null 설정 가능하다.
참조변수는 한번 참조한 변수를 설정하면 변경할 수 없지만 포인터변수는 변경 할 수 있다. 참고로 golang에서는 참조변수가 없다. &연산자로 주소값을 가지는 변수가 있지만 그 변수 자체가 별도의 주소를 가지고 있기 때문에 참조변수는 아니다. https://dave.cheney.net/2017/04/29/there-is-no-pass-by-reference-in-go
- dereference (역참조) 는 뭔가요?
역(거스를 역, 逆)참조
선언말고 *p 로 사용하면 포인터 변수 p 가 참조하는 변수의 주소값이 아닌 실제 값을 나타내는 것이다.
- dangling pointer (허상 포인터) 는 어떤건가요?
참조하고 있던 메모리가 삭제(free)되어 유효하지 않는 포인터로, 이 포인터를 참조(read/write)하게 되면 예상하지 못한 문제가 발생할 수 있다.
- generic programming 이란 뭘까요?
정해진 타입이 없이 여러 타입의 데이터를 받아 처리할 수 있는 재사용성을 높이는 프로그래밍 기법이다. c++ 에서는 template 을 기반으로한 algorithm 등의 라이브러는 외부에서 정의된 다양한 데이터 형식을 받아 동일한 로직을 수행할 수 있다.
- clang 과 gcc(g++) 의 큰차이는 뭘까요?
둘다 c(c++) 컴파일러 툴체인이지만 clang 은 백엔드로 llvm(low level virtual machine)을 사용한다.
컴퍼일러는 c++ fortran등 각 언어를 구문분석하고 중간 코드로 처리하는 프론트엔드외 중간코드(IR,intermediate representation)를 최적화하는 옵티마이저와 실제 x86 arm 등의 머신에 맞게 머신코드를 발생하는 3부분으로 구분할수 있는데 새로운 프론트엔드를 llvm 에 코드를 산출하는 것으로 만든다면 뒤에 코드최적화와 머신코드생성부분은 재사용할수 있는 장점이 있다. 그리고 llvm 기반 프로톤엔트 언어를 사용했다면, java 의 jvm 처럼 llvm 을 사용하는 어떤 플랫폼에서도 동작하게 된다.
참고로 linux 디폴트 c++ 툴체인은 gcc(g++)이고 mac 은 clang을 사용한다.
mac 의 gcc, g++ 등도 내부적으로 clang 을 사용한다.
- golang 동시성(concurrency) 병렬성(parallelism) 차이는 뭔가요?
동시성은 다수의 작업을 동시에 효율적으로 처리하기 위한 방법으로 여러개의 작업을 한개의 프로세스로 수행할때 작업들을 효율적으로 스케줄링하여 처리하는 논리적인 구조를 일컫는 용어다.
병렬성은 물리적으로 다수의 작업을 동시에 다수의 프로스세스(쓰레드,코어)에게 할당하여 수행하는 실행하는 방식을 말한다.
동시성은 여러개의 프로세스(코어)를 사용할 수 있어 병렬성을 내포 하고 있다.
golang 은 m(machine/core), p(process), g(goroutine) 의 3가지 struct 를 기반으로 최적화된 스케쥴링으로 최대한 활용하는 동시성을 지원한다.
- golang 에서 array 와 slice 차이는 뭔가요?
array, slice 모두 연속된 데이터를 저장하며 인덱스를 통해 해당 데이터 접근(read/write)할 수 있다. array 는 길이가 고정적인 형태이다. slice 는 array 의 한 형태로 길이가 고정적이지 않고, append, copy 등의 슬라이스를 함수를 하용하여 길이를 변경할 수 있다.
- golang 에서 panic, recover 함수는 뭔가요?
내장함수로 defer 함수들을 모두 처리하고 리턴한다. 리턴 된 caller 함수에서도 똑같이 액션이 반복되면 결국 프로그램은 에러를 출력하고 종료하게 된다.
recover 는 defer 에서 명시하며 panic 이 defer 함수를 실행시킬때 리턴되지 않도록하여 패닉 메시지만 출력하고 프로그램 종료를 막는다.
- golang 에서 채널에 대해서 설명해주세요.
채널(chan)은 고루틴들 간의 동기화를 목적으로 고루틴 간 데이터를 주고 받을 수 있는 연결통로이다. 채널에 보내거나, 채널로 부터 받거나, 혹은 둘다 되는 양방향 채널이 있고, 기본적으로 채널의 값이 꺼내기 전까지 블록되는 동기방식이다. 하지만 채널 생성시 n 크기의 버퍼를 설정하면 버퍼 크기만큼 비동기로 채널을 사용할 수 있다.
- golang 에서 duck typing interface 를 설명해주세요.
우선 duck typing 은 '오리가 꽥하고 걷는다면, 닭이 꽥하고 걸어도 오리로 취급한다'는 의미로 명시적으로 interface 를 구현하지 않아도 똑같은 이름과 기능을 가진다면 그 인터페이스를 구현한것으로 본다. interface 를 구현할때 c++, java 등과 같이 인터페이스를 상속, implement 키워드등 사용 하지 않고, interface 의 명시된 함수의 시그니처(함수 이름, 인자, 리턴타입)만 똑같은 함수를 만든다면 해당 인터페이스를 사용할 수 있게 된다.
- golang 에서 func aaa(...interface{}) 는 뭔가요?
interface 는 구현해야하는 메소드들의 집합이라고 볼 수 있는데, interface{} 는 빈인터페이스로 구현해야할 메소드가 0개로 볼 수있다. 따라서 빈인터페이스 파라미터는 모든 타입의 값을 받을 수 있고(c/c++ 의 void* 와 같다) ... 는 variadic 으로 n 개의 다이나믹한 파라미터개수를 받을 수 있다.
- golang 에서 hijack 은 뭔가요?
hijack(납치하다. 빼앗다)는 네트워크상의 패킷을 가로채는 공격방법으로, golang에서는 http.responsewriter 를 hijack 하면 현재 커넥션과 응답버퍼를 가로 채서 http내용(헤더,바디)을 원하는 데이터로 read/write 할 수 있게 한다.
- reflection 이란?
런타임시 컴파일된 코드를 분석하여 역으로 클래스 또는 변수의 이름, 타입, 값등을 알아내는것
- 웹 서비스를 만들때 어떤것들을 어떻게 구성해보고 싶나요? 그리고 이유는 뭔가요?
우선 순간 트래픽이 어떻게 될것인이 대략 산정(예측)하여 서버대수를 파악해본다.
웹서버는 빠른 응답을 위해 http2 적용을 하고 nginx 기반으로 기타 필요한 요소를 plugin 한다.
중복되는 질의에 대한 부하를 줄이기 위해 데이터를 redis나 memcached 로 캐시한다. 데이터의 형식이 일관적이라면 비교적 심플한 memcached 를 사용하고 다양하고 fault tolerance 를 생각한다면 redis 클러스터링을 구성하는거시 좋을것 같습니다.
로그는 ELK 환경으로 하고 수집되는 로그가 많을것으로 예상되어 로깅 큐로써 kafka 를 이용할 수 있을것 같다.
장애상황감지를 위한 L4(transport layer) 또는 L7(application layer 에서 헬스체크 파일)헬스체크를 기능과 장애발생을 위한 알람 시스템(사내)를 구성해야 한다.
많이 사용되는 jenkins 으로 빌드시스템을 구성하고 서비스 배포는 간단하고 많은 기능이 지원되는 ansible 을 사용한다.
- http 대표적인 메소드 4가지 뭔가요?
get, post, put, delete
외에도 특정 리소를 명세하기 위한 options 도 있다.
- http post, get 차이는 뭘까요?
CRUD 로 봤을때 post = Create, get = Read 기능을 위한 메소드이다.
post 는 html submit 과 같이 서버에 리소스를 생성(Create/insert), http body 에 생성할 데이터 명시
get 은 서버에 리소스를 가져(Read/select)올때, ? 뒤에 구분자 & 로 여러 파라미터가 붙으며 길이 제한이 있어 데이터 입력으로는 적당하지 않다.
- http post, put 차이는 뭘까요?
CRUD 로 봤을때 post = Create, put = Update기능을 위한 메소드다.
둘다 리소스를 write 하는 메소드이지만,
post 는 리소스를 생성(Create/insert) 할때 uri(/book) 명시하며 서버에서 대상 리소스를 판단하고 /book/1 or /book/2 ... 등으로 추가. 멱등성이 보장되지 않는다.
put 은 uri(/book/1) 와 같이 변경할 리소스를 클라이언트가 명확하게 알 수 있어 해당 리소스만 변경(Update)한다. 멱등성(get, put, delete)이 보장된다.
- http 대략적인 응답코드와 기능
200 : ok
302 : redirect
4xx : 클라이언트의 잘못된 요청, 404 not found ...
5xx : 서버오류 500 internal server error ...
- http 에서 keepalive (ka) 옵션은 뭔가요?
http1.1 부터 지원하는 옵션이다. 일반적으로 http는 하나의 트랜잭션이 끝나면 커넥션을 종료(닫기)하는데, keepalive 옵션을 켜면 지정한 타임아웃 까지는 트랜잭션이 없어도 연결(소켓을 열어둔 상태)을 유지하게 된다. 클라이언트 요청에 http1.1 과 keepalive 를 명시하고 서버도 keepalive 를 제공해야 사용할 수 있다. 매 트랜젹션에 연결을 맺어야 하는데 드는 비용을 줄일 수 있지만 keepalive 로 리소스를 특정 커넥션들이 계속 점유하고 있으면 그만큼 다른 연결들 할 수 없어 적절하게 사용해야 한다. 참고로 tcp 레벨에서 소켓에 keepalive 옵션도 있다.
- http2 는 뭔가요?
속도, 지연, 리소스관리등의 성능향상을 위해 google spdy 프로토콜에 기반한 http 버전2 이다. http1.x 와 같은 명세를 사용한다. 리소스들을 동시에 여러게 내려받을 수 있다.
http1.x 의 여러 요청을 위해 여러 tcp 커넥션을 열어야 하지만 http2는 하나의 tcp 커넥션에 여러 데이터조각을 스트림형식으로 보내 단순하고 커넥션을 효율적으로 사용해 빠르다. (1번 요청이 있기전까진 커넥션은 놀고 있는게 아니라 2,3번 요청의 응답데이터가 스트림으로 처리중이다. 완벽한 응답 데이터가 아닌 작은 데이터 조각을 스트림으로 클라는 빨리 받을 수 있다. 스트림에서 우선 순위도 적용할 수 있다.)
서버는 클라 요청없이도 필요한 리소스를 알고 푸시할 수 있다.
리소스전송시 압축률이 좋은 br(brotli) 을 사용할 수 있다.
참고로
https(ssl/tls) 사용은 옵션널로 꼭 사용하지 않아도 된다.
http1.2 로 버저닝 하지 않는 이유는 http2 는 바이너리 프레이밍(http 헤더와 바디를 각각 바이너리 프레임으로 나눠서 tcp 소켓에 사용)방식을 http1.x 과 다르기때문이다. 바이너리 프레이밍으로 서버푸시등이 가능한것이다.
- http vary 헤더는 뭔가요?
응답에 vary 헤더가 있으면 같은 요청을 시도할때 vary 에 설정된 헤더명의 값들로 캐싱(브라우저캐싱 또는 프록시 캐싱등)을 사용할지 새로 웹서버에 요청할지 결정한다. 예를 들어 웹서버의 응답에 vary: Accept-Encoding 과 있다면, 같은 요청을 웹서버에 요청시 캐싱에 gzip, br 등으로 압축된 데이터가 있는지 확인하고 있으면 이를 사용한다.
참고
https://developer.mozilla.org/ko/docs/Web/HTTP/Caching#%EC%83%81%ED%99%A9%EC%97%90_%EB%94%B0%EB%A5%B8_%EC%9D%91%EB%8B%B5
- HSTS(http strict transport security) 는 뭔가요?
http 요청을 https 으로 강제하는 방법으로 보통 302 redirect 로 https 주소를 주는데 redirect 과정이 취약점으로 작용할 수 있다. 웹서버가 hsts 여부를 Strict-Transport-Security 헤더(https 응답 헤더로 설정해야 한다.)로 max-age=초값으로 응답을 주면 max-age 동안 브라우저가 해당 웹을 https 로만 요청하게 된다. https://www.chromium.org/hsts 에 헤더응답없이 크롬이 hsts 를 강제하는 google, paypal, twitter 등이 있다. 실제 크롬 디버깅으로 http://www.google.com 요청하면 307 Internal Redirect 로 브라우저 자체적으로 응답헤더를 Location: https://www.google.com/ Non-Authoritative-Reason: HSTS 주게 된다.
- base64 url safe encoding 에 대해서 설명해주세요.
base64 는 알파벳(52개),숫자(10개),+,/ 의 문자로 인코딩하는 것이고, url safe 는 정확하게 url and filename safe 로 URL과 file name 에서 문제가 되는 + 는 - 로 / 는 _ 로 대신한것이다.
https://tools.ietf.org/html/rfc4648#section-4 (base64)
https://tools.ietf.org/html/rfc4648#section-5 (url and filename safe base64)
- nginx 내부 redirect는 뭔가요?
일반적으로 리다이렉트는 서버가 클라이언트(브라우저)에서 이동할 주소를 응답(302) 주면 클라이언트가 이동할 주소로 요청한다. 즉 요청의 주체가 클라이언트인 반면에, 내부 리다이렉션은 클라에게 알라지 않고 nginx 내부에서 이동할 페이지,리소스로 요청을 하게 된다. 클라이언트에게 리다이렉션을 숨길수도 있고, 일반적인 리다이렉션보다 빠르다. try_files 지시자를 사용한다.
- WPO(web performace optimization) 는 뭔가요?
말 그대로 웹 성능 최적화로 웹사이트의 속도, 렌더링등의 성능을 최대로 끌어 올리는 기술로 http요청 컨넥션 줄이기, 파일 압축, 이미지 최적화, 웹 캐싱등의 여러 요소들이 있다. 구글의 pagespeed insight 에서 웹사이트 주소를 넣고 분석버튼을 누르면 해당 웹사이트가 데스크탑과 모바일에서 얼마 성능 최적화가 되어 있고 어떤점을 개선해야 하는지 알려준다.
- CORS(cross origin resource sharing) 는 뭔가요?
same origin(동일 출처) 원칙에 따르면 현재 웹페이지의 리소스(스크립트, 이미지, 동영상등)의 출처가 현재 도메인과 다르면 안되지만 이를 가능하게 하는 메카니즘이다. 기본적으로 서버의 응답헤더에 Access-Control-Allow-Origin", "*" 를 명시하면 도메인이 다른 요청도 허용할 수 있다. 그런데 리소스의 요청이 get, post, head, content-type : plain/text 와 같은 simple 요청이 아니면 mothod=options 로 preflight(사전전달)을 먼저 수행하게 된다. options 대한 서버응답으로 서버에서 지원하는 method 와 헤더 리소스위치등을 받으면 클라는 서버가 수용할수 있는 리소스에 대해서 요청을 보내게 된다.
- jsonp 란?
json with padding 의 약자로 Ajax (xmlhttpreuest and onreadystatechange callback)은 동일출처원칙(same origin policy)으로 현재 속한 도메인 서버에한해서만 요청이 가능하고 다른 도메인의 웹서버로는 요청을 할 수 없다. jsonp 는 A도메인 웹서버의 javascript 가 B도메인 웹서버에 요청을 하고 응답을 받을 수 있게 해준다.
1. 요청버튼을 누르면 A서버에게 요청하지 않고 script 를 임베드 하는 로직을 만든다.
2. 임베드는 <script scr=B 도메인 주소/callback=showdata> 로 명시하여 B서버에 스크립트코드를 요청하고 showdata 가 콜백되도록 한다. showdata() 함수도 별도로 구현해준다.
3. B서버는 데이터를 json 으로 만들고 "show(jsondata)" 로 json 값이 인자로 들어간 함수를 호출하는 포맷으로 응답을 준다.
4. 결국 javascript 는 B서버로 받은 응답이 임베드되어 show(jsondata) 로 호출하게 된다.
이와 같은 흐름으로 도메인이 다른 서버에 요청할 수 있지만 GET 방식만 가능하다.
- jwt(json web token) 는 뭔가요?
json 내용을 가진 인증 토큰으로 "헤더.payload(claim-필드,조각).서명"
(헤더는 암호화방식등을 명시,페이로드는 사용자가 전달할 내용, 서명에는 한사용자에게만 유효할수 있도록 보장) 포맷으로 암호화 되어 있고 암호를 jwt 라이브러리르 이용해서 풀면 self-contained 형태로 토큰내에 필요한 정보가 모두 명시되어 있다. http 헤더나 파라메터에 공백을 사용할 수 없는 환경에서 쉽게 사용할 수 있다. 보안측면에선 헤더와 페이로드는 누구나 복호화해 알수 있어 해커가 jwt 를 가로채서 내용을 변경해 서버에 보낼수 있지만 서명은 최초 발급사용자가 아니면 jwt 가 유효하지 않은것으로 판단해서 방어할수 있다.
- SPA 가 무엇이며 어떤 장단점이 있을까요?
single page application 으로 말 그대로 웹페이지 하나로 동작되는것으로 페이지 전체가 리프레시되거나 이동하지 않고 현재 페이지의 내용만 변경되는 것을 말한다. 최초 요청은 필요한 html 과 ajax 등의 환경을 갖추는데 시간이 좀 걸리지만 그 이후로는 상황에 따라 json, xml 등의 데이터만 전달받아 네티워크 대역폭을 적게 사용하는 장점이 있다. 현재는 SEO(search engin optimization, 검색최적화)측면에서는 html 내용이 빠져 검색이 잘 안될 수 있는 문제가 있다. 하지만 이부분도 점차 개선될것으로 보인다.
- CSP(Content Security Policy)는 뭔가요?
csp(컨텐츠 보안 정책)는 웹으로 서비스되는 도메인의 컨텐츠들은 같은 도메인을 명시하고 있어야(same origin 동일 출처의 원칙) 하는데 그렇지 않은 경우 Cross Site Scripting(XSS, 교사 사이트 스크립트) 공격에 취약할 수 있어 이를 방지하고자 적용되는 보안정책이다. 웹서버는 응답헤더에 'Content-Security-Policy' 를 설정하고 script-src, base-uri, img-src, midea-src, font-src 등의 리소스 지시자로 허용되는 출처를 명시하면 클라이언트(브라우저)는 csp 헤더에 명시된 출처들에 대해서만 스크립트, 이미지로딩등의 액션을 수행하도록 하는 방식이다.
- 웹서비스에서 mixed content(혼합된 컨텐츠)란 뭔가요?
https 로 서비스되는 웹사이트에서 스크립트,이미지,동영상등의 리소스가 http 로 로딩되는 경우를 말한다. 최초 연결은 https 로 보안이 보장되지만 후에 페이지가 리소스를 로딩할때 안전하지 않는 http 를 사용하게 되어 위험할 수 있음을 알려준다.(크롬브라우저등의 개발자도구 콘솔창에 mixed contents 경고 문구가 출력된다.) http 로 로딩되는 리소스들을 https 로 로딩될 수 있도록 권고하고 있다.
- html iframe, obejct, embed 차이는 뭘까요?
iframe 은 html 안에 또다른 html문서를 보여준다.
obejct 는 멀티미디어성 페이지(flash, audio, video, javascript, pdf 등) 을 삽입하기 위한 태그로 몇몇 속성은 html5 에서 지원되지 않는다.
embed 는 외부 프로그램이나 플러그인 html내에 삽입하기 위한 태그로 html4 에선 빠졌고 html5 다시 새롭게 추가되었다.
iframe 은 html 안에 html 중첩(nested)되는 것
embed, object 는 통합(integrate)되는것
- javascript 에서의 hoisting(호이스팅)은 뭔가요?
javascript 는 실행시 변수나 함수 선언부분을 맨위로 hoisting(끌어 올린다)한다. 이렇게 해서 함수 선언전에 해당 함수를 호출하는 순서라도 동작이 된다. hoisting을 방지하려면
var myfunc = function() {} 와 같이 함수 표현식을 사용하면 선언부분은 var myfunc 만 hositing 되고 function() 부분은 그자리에 그대로 있게 된다.
- javascript 에서 promise 는 뭔가요?
연속되는 비동기 호출로 인해 비동기 호출안에 비동기 호출이 계속 될 경우 계속 함수안에 함수가 중첩되는 콜백지옥이 발생하는데, promise 는 비동기 함수를 호출하는 함수 변수를 만들고 비동기가 완료되면 함수변수의 then() 등으로 비동기 호출 완료후 콜백을 처리를 할 수 있도록 하는 개발 패턴이다.
- CDN(Content Delivery Network)은 왜 사용할까요?
웹에 구성에 필요한 html, js, 이미지, 비디오 등을 리소스를 빠르게 전달하기 위해 사용한다. 그냥 nginx나 apache httpd 같은 웹서버가 제공을 할 수 있지만, CDN 은 분산된 네트워크 환경으로 가용성이 높다. 아마존, 마이크로소프트 등에서 제공하는 거대 분산 네트워크환경으로 클라인트는 지리적으로 가장 가까운 cdn 서버에서 리소스를 받을 수 있어 빠르다. 그리고 브라우저는 하나의 도메인당 연결 개수를 제한하는데 cdn 은 search1.daumcdn.net search2.daumcdn.net ... 등 여러 도메인으로 분산제공되어 한번에 많은 리소스를 요청해서 받을 수 있는 장점이 있다. 중소기업은 아마존, 마소등의 cdn 서비스를 사용하지만 네이버,다음, 구글등과 같은 큰 인터넷 기업들은 내부적으로 자체 cdn을 구축해 사용한다.
- CTR(Click Through Rate) 은 뭐가요?
노출대비 클릭한 비율로 광고나, 검색등의 서비스에서 노출되는 횟수에 대비해서 사람들이 얼마나 클릭 하냐를 나타내는 것으로 ctr 이 높을 수록 인기 있는, 유용한,등의 의미로 파악할 수 있다.
- 정보 검색에서 IRF(Implicit Relevance Feedback) 는 뭔가요?
우리말로 하자면 '암묵적 적합성(관련) 피드백'으로 검색된 결과가 쿼리와 얼마나 관련(relevance) 있는지를 사용자가 정보를 본 시간, 스크롤등의 액션으로 추론하는 방식이다. 반대되는 것으로 명시적 적합성 피드백(explicit relevance feedback) 으로 사용자가 직접 적합(0),부적합(X) 또는 점수등으로 명시적으로 평가하는 방식이다.
- 역색인은 뭔가요?
역색인(inverted index)은 검색을 위해 단어(키워드)와 해당 단어가 있는 페이지(문서)위치 저장해 놓은것을 말한다. 예시로 책의 뒤에 키워드-쪽수 정보를 보고 쉽게 찾을 수 있다. lucense과 lucense 을 기반으로 한 elasticsearch 등의 검색엔진에서 역색인을 사용한다.
Algorithm
# sorting 구현
https://github.com/ysoftman/test_code/blob/master/cpp/sort_test.cpp# GCD GCD(greatest common divisor) 최대 공약수 구하기
# fibonacci 수열구하기
# factorial
# binary search
# primer number 찾기
# prime number 찾기(Eratosthenes(에라토스테네스의 체) 방법으로 소수 구하기)
# 무한소수 체크
# Levenshtein-Distance 알고리즘 구현
실행결과화면 replace cost 를 1로 했을때
# K-Means Clustering
# Dijkstra (다익스트라) 알고리즘으로 최단경로 찾기
# precision/recall
# elo rating
# anagram
# largest possible combined number
https://github.com/ysoftman/test_code/blob/master/golang/largest_possible_combined_number/largest_possible_combined_number.go# codility_demo_find_equilibrium_index
https://github.com/ysoftman/codingtest/blob/master/codility/codility_demo_find_equilibrium_index.cpp
tags:
Algorithm
,
binarysearch
,
Dijkstra
,
ELO-rating
,
factorial
,
fibonacci
,
GCD
,
k-means
,
Levenshtein
,
precision
,
prime_number
,
recall
,
sort
comments: 0
11/26/2006