HTTP의 특징(Stateless, Connectionless)과 Cookie, Session의 개요
세션 기반 인증과 토큰 기반 인증, JSON Web-Token
웹이 동작하는 과정, 그 원리에 대해 간단히 알아보자.
예전에는 컴퓨터 간의 데이터 통신에 회선 교환(Circuit Switching)이라는 방식을 사용했다. 이는 통신하고자 하는 두 호스트가 데이터 전송 전에 미리 데이터가 이동할 경로를 하나 설정해 두는 것이다.
앞서 쿠키/세션 포스트에서 간단하게 HTTP에 대해서 설명했는데, 이번에는 조금 더 자세히 다루어 본다.
로드 밸런싱은 네트워크나 서버에 가해지는 부하(Load)를 분산해주는 기술로, CPU 혹은 Data storage와 같은 컴퓨터 자원에 작업을 나누는 것을 의미한다. 이를 통해 가용성과 응답시간 등을 최적화할 수 있다.
프록시 서버는 클라이언트와 웹 서버 사이에 위치한 중개 서버로, 클라이언트가 자신을 통해 다른 네트워크 서비스에 '간접적으로' 접속하도록 하는 응용 시스템 혹은 응용 프로그램이다.
보안의 3요소는 기밀성과 무결성, 가용성이 있다.
네트워크의 보안을 위협하는 공격 기법은 다양한 것들이 있다. 이번에는 SQL injection을 중심으로 가양한 공격 기법들을 확인해 보자.
HTTP는 클라이언트가 서버를 향해 요청을 보내고 서버는 클라이언트를 향해 응답하는 request - response 형태로서 단방향으로 이루어지는 프로토콜이다. 즉, '양방향' 통신이 불가능한 프로토콜이다.
CORS(Cross Origin Resource Sharing)란 브라우저의 보안과 관련하여 아주 중요한 역할을 하는 보안 정책이다. CORS를 이해하기 위해서는 그 바탕이 되는 SOP부터 이해하고 넘어가는 편이 좋다.
REST는 "REpresemtational State Transfer"의 약자로 자원을 이름으로 구분하여 해당 자원의 상태(정보)를 주고받는 것을 의미한다. 즉, 자원(resource)의 표현(representation)에 의한 상태 전달이라고 할 수 있다.
OAuth(Open Authorization)이란 인터넷 사용자들이 비밀번호를 제공하지 않고, 다른 웹사이트상의 자신들의 정보에 대해 웹사이트 혹은 애플리케이션 등의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준을 말한다.
CPU의 속도에 비해 메모리의 속도는 느리다. 그리고 두 장치의 속도 차로 인해 병목 현상이 발생하게 된다. 이를 방지하기 위해 사용하는 것이 바로 캐시 메모리이다.
사용자가 프로그램의 실행을 요청하면 운영체제(OS)는 보조기억장치(HDD, SDD 등)로부터 해당 프로그램의 정보를 읽어 주기억장치(메모리)에 로드한다. 그리고 CPU는 프로그램 코드로 메모리를 관리하고 메모리에 로드된 명령문을 실행한다.
컴퓨터 운영체제에 대한 내용을 학습하기 시작하면 가장 먼저 마주하는 개념이 바로 프로세스와 스레드이며, 또 그만큼 중요하게 여겨지는 개념이 바로 이들이다. 우선 이 둘이 어떻게 정의되는지를 확인하고 자세한 내용으로 넘어가 보자.
프로세스 동기화(Process synchronization)란 말 그대로 프로세스 사이의 동기화를 말한다. 현재는 대부분 스레드 기준으로 문맥 교환(Context switching)이 일어나므로 스레드 동기화라고도 한다.
CPU 스케줄링은 프로세스에 CPU의 자원을 할당하는 작업을 말하며, 이러한 작업을 수행하는 것이 CPU 스케줄러이다.
동기/비동기는 주로 어플리케이션에서 다루는 개념으로. 다음 작업이 요청되는 시간과 관련이 있는 개념이다. 각각 앞글자를 따서 동기는 sync, 비동기는 async로 지칭하는 경우가 많다.
대부분의 메모리는 다수의 프로세스를 구동시키는 멀티 프로그래밍 환경이 구축되어 있으며, 따라서 OS는 어떤 프로세스가 다른 프로세스 혹은 OS 자체에 부적절한 접근을 하지 못하도록 보호할 필요가 있다.
파일(File)은 논리적인 저장 단위로 관련된 정보 자료들의 집합에 이름을 붙인 것이다. 이는 레코드(record) 혹은 블록(block) 단위로 비휘발성 보조기억장치(예컨대 HDD나 SSD 등과 같은)에 저장된다.
프로그램이 실행을 위해 메모리에 적재되면(즉, 프로세스가 되면) 해당 프로세스를 위한 독자적인 주소 공간이 생성된다. 이를 논리적 주소 또는 가상 주소(Virtual address)라 하며, 각 프로세스마다 0번부터 주소가 시작된다.
주로 RAM 혹은 메모리로 불리는 Random Access Memory는 컴퓨터의 주기억장치로서 현대 컴퓨터에서 작업의 중심이 되는 부품 중 하나이다.
메인 메모리의 크기는 물리적으로 한정되어 있으며, 따라서 메인 메모리의 크기보다 크기가 큰 프로세스는 실행할 수가 없다. 이를 해결하기 위해 등장한 메모리 관리 기법이 바로 가상 메모리(Virtual memory)이다.
RDBMS와 NoSQL에 대해 알아보기 전에 몇 가지 기본적인 사항을 확인하고 가자.
검색 서비스는 사용자가 입력한 검색어에 대한 검색 결과를 제공하는 서비스로, 검색 엔진, 검색 시스템, 검색 서비스 등의 용어로 불린다. 일반적으로 혼용되는 경향이 있으나, 엄밀하게는 조금씩 차이가 있는 개념이므로 간단히 정리하고 넘어가자.
트랜잭션은 흔히 'DB의 상태를 변화시키는 논리적 기능을 수행하기 위한 작업의 단위'라고 정의된다.
Redis는 REmote DIctionary Server의 약어로, 이름에서 알 수 있듯 Key-Value 형태의 딕셔너리 구조로 데이터를 저장하고 관리하는 서버를 말한다.
Database(DB)에는 많은 데이터가 저장되어 있고, 그러한 데이터에 대해 동시에 접근하는 경우가 발생할 수밖에 없다. 그런데 그럴 경우 앞서 트랜잭션 포스트에서 살펴보았던 여러 가지 문제가 발생하면서 데이터의 일관성 및 무결성이 훼손될 수도 있다.
데이터베이스를 설계할 때 불필요한 중복 등으로 인하여 이상 현상(Anomaly)이 발생할 수 있다. 그리고 이 이상현상을 제거하기 위하여 데이터를 여러 릴레이션으로 분해하는 과정을 정규화(Normalization)라 한다.
물리 디스크에서 데이터에 접근하기 위해서는 디스크 헤드를 움직여 데이터가 저장된 트랙에 위치시고 실제 데이터가 저장된 섹터가 올 때까지 기다려야 한다.
동시성 제어(Concurrent control)란 여러 개의 트랜잭션이 작업을 성공적으로 마칠 수 있도록 트랜잭션의 실행 순서를 제어하는 기법을 말한다.
조인(JOIN)이란 RDBMS에서 하나의 데이터베이스 내 '여러 테이블의 레코드를 조합하여 하나의 열로 표현하는 기법'이다. 즉, 각기 다른 테이블을 한 번에 보여주고자 할 때 쓰는 쿼리라고 할 수 있다.
MySQL 서버는 사람의 두뇌 역할을 하는 MySQL Engine과 손발과 같은 역할을 하는 Storage engine으로 구분할 수 있다. 이때 스토리지 엔진의 경우 MySQL에서는 기본적으로 InnoDB 스토리지 엔진과 MyISAM 스토리지 엔진을 제공한다.
`스키마(Schema)`는 데이터베이스의 구조와 제약 조건에 관한 전반적인 명세를 정의한 `메타데이터(Metadata)`의 집합이다.
클러스터링(Clustering)이란 동일한 데이터베이스를 여러 대의 서버가 관리하도록 클러스터를 구축하는 것을 말한다. 즉, 여러 개의 DB를 '수평적인 구조'로 구축하는 방식이다.
트리거(Trigger)는 DBMS에서 특정 테이블에 DML문(INSERT, UPDATE, DELETE 등)이 수행되었을 때 '데이터베이스에서 자동으로 동작하도록 설정'된 프로그램이다.
WAS(Web Application Server)와 데이터베이스의 연결에는 많은 비용이 발생하는데, MySQL 8.0을 기준으로 했을 때 INSERT문 수행 시 필요한 비용의 비율은 다음과 같다.
RAID는 복수 배열 저가/독립 디스크(Redundant Array of Inexpensive/Independent Disk)의 약어로 저장장치 여러 개를 묶어 고용량, 고성능 저장장치 1개와 같은 효과를 얻기 위해 개발된 기법이다.
가상화(Virtualization)란, 가상화를 관리하는 소프트웨어(주로 하이퍼바이저)를 사용하여 하나의 물리적 머신에 가상 머신(Virtual Machine, VM)을 만드는 프로세스를 말한다.