20210706

Jin·2021년 7월 6일

Facts

HTTP 고속화에 관한 독서

책: Real world HTTP

TCP 연결을 재사용

HTTP 1.1 에서는 하나의 TCP 연결을 재사용할 수 있게 되었다. 종래에는 한쌍의 요청과 응답이 이루어지면 TCP 연결을 닫아주었다. 이 때문에 여러 요청과 응답이 이루어져야 하는 경우에는 핸드셰이크로 인한 네트워크 자원 소모가 속도를 저하시키는 요인이었다. 이 때문에, HTTP 1.1 에서는 메세지 헤더에 keep-alive 라는 필드를 주어서 연결이 지속되도록 했다.

요청간의 시간차를 줄이기

단일 커넥션에서는 기본적으로 하나의 요청에 따른 응답이 완료된 후에, 다음요청을 보내는 동기적 송수신이 이루어진다. 이 때문에, 요청과 요청간의 필연적인 대기시간이 발생하게 된다. 파이프라이닝은 요청간의 대기시간을 없애기 위해 요청에 대한 응답을 기다리지 않고 요청을 보내는 방식을 이용한다.

단, 파이프라이닝을 통해도 실질적인 통신속도 증가가 체감되지 않는다고 하는 사례가 많았다. 이유는 대기 시간을 줄인다고 해도, 근본적으로 하나의 라인을 통해 직렬로 통신이 이루어지고, 서버가 요청이 들어온 순서대로 응답을 하기 때문에, 결국 가장 오래걸리는 요청에 전체 속도가 지배되는 현상이 발생한다.

병렬화

HTTP 2.0 에서는 하나의 TCP 커넥션을 여러개의 가상 TCP 연결로 만든다. 이것을 스트림이라고 하며, 스트림을 통해 TCP 연결의 병렬화를 달성할 수 있게 된다. 기존에는 병렬적 연결이 되기 위해서는 다수의 TCP 연결을 실제로 맺는 수밖에 없었는데, 그것을 근본적으로 개선한 것이다.

코딩테스트 다시 풀기

문제1번: https://github.com/gringrape/daily_coding_dojo/blob/main/20210706/javascript/solution.test.js

프로그래머스 고양이 사진첩 과제 풀이

DOM 을 조작하는 코드에 대해서 많이 배울 수 있었다. DOM 에서 특정요소를 가져와서 해당 요소의 특정 속성을 변경해주는 경우는 있었는데, 요소를 추가하거나 삭제하는 연산은 많이 해본 적이 없었다.

예를 들어, 특정 요소의 하위 노드 중에서 마지막것을 삭제한다고 했을때, 다음과 같이 코드를 짜주었다.

const element = document.getElementById('target');
const { children } = element;
const lastChild = children[children.length - 1];

element.removeChild(lastChild);

이후에는 서버에서 가져온 데이터를 이용하여 화면에 표시하는 작업을 해야한다. 이를 위해서는 데이터의 각 부분을 DOM 요소로 변환하는 작업과 변환된 결과를 화면에 표시해 주기 위해서 DOM 을 업데이트 하는 두가지 작업을 수행해야 할 것 같다.

웹 공격 기술 독서

공격 대상에 따른 분류

공격대상이 클라이언트라면 능동적, 서버라면 수동적 공격이라고 한다. 클라이언트 공격에서는 공격 코드를 클라이언트의 작동에 포함시키는 등의 방법을 통해서 클라이언트의 민감정보를 외부로 송신하는 등의 공격을 가한다.

서버 공격에서는 역시 공격 코드를 삽입하는 방식을 이용해서 서버와 연결되어 있는 데이터 베이스상의 정보를 탈취하는 등의 공격을 취하한다.

이스케이프 처리 미비로 인한 공격들

1. XSS

클라이언트 문서에 정보를 보충하는 문자열 등에 (e.g. ${id}) 자바스크립트 공격 코드를 삽입하는 방법을 뜻한다. 이 방식을 통해서 쿠키에 접근하거나, 사용자가 입력한 정보가 공격사이트로 전송되거나 하는 방식으로 공격을 취하게 된다.

이는 보충 문자열등에 개행문자나 꺽쇄 기호에 대한 이스케이프 처리가 부족한 탓으로, 공격 코드가 동작하지 않기 위해서는, 이들 문자에 대한 처리를 해 줄 필요가 있다.

2. SQL injection

SQL injection 은 서버 측에 대한 공격이다. 클라이언트로 부터 조작된 공격코드가 서버까지 가서 데이터베이스에 대해 공격 SQL 을 실행하게 된다. 대표적으로, 테이블 조회시에 SQL 을 WHERE 조건절을 무력화시키는 문자열 삽입을 통해서, 테이블 전체의 정보를 탈취하는 등의 공격을 가한다.

3. HTTP Header injection

HTTP Header injection 은 HTTP 메세지의 헤더에 개행 문자를 삽입함으로써 공격을 취하는 방식으로 이루어진다. 개행문자를 이용해서 공격을 위한 헤더를 추가하거나, 메세지 바디를 조작할 수 있게 된다.

4. OS command injection

OS level 의 코드를 공격코드로 삽입하는 방식을 뜻한다. 예를들어, 파일 시스템 상의 특정 파일을 타겟으로 해서 해당 파일의 내용을 읽고 전송하는 OS 레레벨의 코드를 삽입하여 공격을 가할 수 있다.

리얼월드 HTTP 독서

공개키 방식과 공통키 방식

공통 키 방식과 공개 키 방식을 비교하면, 공개 키 방식이 복잡한 만큼 아무래도 안정성이 높을것입니다. 안전성이 높은 방식을 계속 사용하면 훨씬 안도감이 높아지겠지요. 하지만 TLS는 이 양쪽 방식을 조합했습니다. TLS에서는 통신마다 한 번만 사용되는 공통 키를 만들어내고, 공개 키 방식을 사용해 통신 상대에게 신중히 키를 전달한 이후는 공통 키로 고속으로 암호화 하는 2 단계 방식을 이용합니다. 공개 키 방식이 안정성이 높지만, 키를 가지고 있어도 암호화와 복호화에 필요한 계산량이 공통 키 방식보다 너무 많기 때문입니다.

공통키 알고리즘인 AES 와 공개키 알고리즘인 RSA 의 속도 비교.

암호화 방식모드시간(나노 초)
RSA암호화84338
RSA복호화2874037
AES암호화186
AES복호화186

Feelings

시간낭비를 줄이자. 잘하기 위해서 계획했던 일들이 매우 많다. 실천도 제대로 안하고 잘하길 바라는건 도둑놈 심보라고 본다.

달랩에 있는 시간이 조금 더 효율적이 되도록 단기 목표를 잘 세우자.

Affirmation

나는 마무리를 후회없이 하는 사람이다.

0개의 댓글