01. 운영체제
● 운영체제 (Operating System)
- 컴퓨터의 하드웨어를 제어하고 사용자가 컴퓨터를 사용할 수 있도록 중재하는 역할을 하는 프로그램
- ex. 윈도우, 맥 OS, 리눅스, 유닉스
- 사용자와 컴퓨터 하드웨어 사이에서 중간 다리 역할을 하며 우리가 컴퓨터를 사용하는 동안 계속 함께함
● 운영체제 역할
- 시스템 (하드웨어) 관리자
- 사용자와 컴퓨터 간의 커뮤니케이션 지원
- 응용프로그램 제어 (운영체제 = 커널 (Kernel) + 셀 (Shell))
-- 운영체제는 커널과 셀로 구성됨
-- 커널 : 실제로 CPU, 디스크 등을 관리하는 곳
-- 셀 : 사용자가 명령을 내리면 해석해서 그 결과를 보여주는 역할 ex. 윈도우 명령 프롬포트, 맥 터미널
02. 프로세스 / 스레드
● 프로세스 (Process)
- 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
- 실행 중에 있는 프로그램을 의미함
- 프로세스의 스케줄링
-- 둘 이상의 프로그램이 동시에 실행되게 하는 것은 하나의 CPU 가 여러 개의 프로세스를 번갈아 실행하기 때문
-- 여러 개의 프로세스가 CPU 할당 시간을 나눔
-- 동시에 여러 프로세스를 처리하는 형태를 멀티 프로세스라고 함
-- 프로세스의 CPU 할당 순서 및 방법을 결정짓는 것을 스케줄링이라 함
● 스레드 (Thread)
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 멀티 프로세스는 컨텍스트 스위칭 (context switching) 을 필요로 함
-- 컨텍스트 스위칭 : 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정
- 많은 수의 프로세스 생성은 빈번한 컨텍스트 스위칭으로 이어짐
-- 성능 저하의 원인이 됨
- 빈번하게 발생하는 컨텍스트 스위칭에 소요되는 시간을 줄여 성능을 향상시키기 위해 스레드가 탄생
- 프로세스는 완전히 독립된 두 개의 프로그램 실행을 위해 사용됨
- 스레드는 하나의 프로그램 내에서 둘 이상의 프로그램 흐름을 만들어 내기 위해 디자인됨
- 프로세스와 달리 스레드 간에는 공유하는 상태 정보들이 있음
-- 이것이 컨텍스트 스위칭을 빠르게 하는 요인이 됨
● 프로세스와 스레드의 메모리 구조
- 하나의 프로세스 내에서 두 개의 자식 프로세스를 생성했을 때의 메모리 구조
-- 자식 프로세스가 생성되고 나면 부모 프로세스와 독립적으로 움직임
-- 서로 메모리 구조에 아무런 관계 X
- 하나의 프로세스 내에서 두 개의 스레드를 생성했을 때의 메모리 구조
-- 프로세스가 스레드를 생성하면 해당 스레드만을 위한 스택을 생성할 뿐, 그 이외의 영역은 부모 프로세스의 영역을 공유
-- 따라서 컨텍스트 스위칭 비용을 줄일 수 있음
● 멀티 스레드 방식의 주의점
- 동시에 처리해야 할 일을 스레드로 구현하면 메모리 공간과 자원 소모를 줄일 수 있으나 주의할 점이 있음
- 멀티 프로세스 기반으로 프로그래밍할 때는 프로세스 간에 공유하는 자원이 없기 때문에 동일한 자원에 접근하는 일이 없음
- 멀티 스레딩 기반으로 프로그래밍할 때는 동일한 자원에 접근하는 일이 발생할 수 있음
-- 그 결과, 어떤 스레드가 다른 스레드에서 사용 중인 변수나 자료 구조에 접근하여 엉뚱한 값을 읽어 오거나 수정할 수 있음
-- 따라서 개발자들이 구현한 코드 중에는 공유되는 메모리 자원이 한 번에 한 스레드만 실행되도록 보호하는 장치가 필요함
-- 이를 동기화라고 함
03. CPU
● CPU (Central Processing Unit)
- 컴퓨터의 두뇌이자 컴퓨터 프로그램 실행에 핵심적인 역할을 하는 장치
● CPU 의 구성요소
- ALU (Arithmetic Logic Unit)
-- 실제 연산을 담당하는 장치
-- 두 가지 연산 : 덧셈 or 뺄셈 같은 산술연산 / AND or OR 같은 논리연산
- 컨트롤 유닛 (Control Unit)
-- 작성한 프로그램을 컴파일하면 실행 파일이 생성됨
-- 이 실행 파일에는 CPU 에게 일을 시키기 위한 명령어들이 저장되어 있음
-- 컴퓨터는 0 과 1 로 모든 것을 처리하므로, 명령어도 0 과 1 의 형태가 될 것임
-- ALU 는 산술 연산과 논리 연산만 가능하므로, 이런 명령이 ALU 에게 전송되기 전 명령을 해석할 장치가 필요함
-- 이때 도움을 주는 구성요소가 컨트롤 유닛
-- 컨트롤 유닛은 명령어를 해석하고 그 해석된 결과에 따라 ALU 에게 적절한 신호를 보내는 일을 함
- 레지스터 (Register Set)
-- CPU 에 명령이 들어갔을 때, ALU 는 앞서 들어온 연산을 처리 중이고, 컨트롤 유닛은 앞서 들어온 명령어를 해석하고 있는 상황이면 바로 처리가 어려움
-- 따라서 컨트롤 유닛이나 ALU 가 필요로 하는 명령어 및 데이터를 임시로 저장하는 메모리 공간이 필요한데, 이것을 레지스터라고 함
-- 레지스터는 CPU 내부에 존재하는 데이터 저장을 위한 장치
-- CPU 내부에 여러 개가 존재하며, CPU 가 연산을 하기 위해 반드시 필요
- 버스 인터페이스 (BUS Interface)
-- 컴퓨터 내부에는 CPU, 하드디스크, RAM, 사운드카드, 그래픽카드 등이 있음
-- 이 장치들은 서로 데이터를 주고 받으며 동작함
-- 이때 장치들이 서로 데이터를 주고 받기 위해 필요한 매개체가 I/O 버스
● 클럭과 코어
- 클럭 신호 (Clock Pulse)
-- CPU 를 구성하는 요소는 아님
-- CPU 구성요소에 타이밍을 제공하는 신호로서 매우 중요한 의미를 가짐
-- CPU 의 성능을 말할 때는 클럭 신호를 함께 표시함
-- CPU 클럭 속도가 1.6 Mhz 면 1 초당 1,600,000 번 클럭이 발생한다는 의미
-- CPU 는 클럭이 발생할 때마다 그 클럭에 맞춰서 연산을 함
-- 따라서 CPU 의 클럭 속도가 높을수록 초당 처리하는 명령어의 개수가 많아져 컴퓨터의 전체 성능이 좋아짐
- 코어 (Core)
-- CPU 에 내장된 처리회로의 핵심 부분
-- 예전에는 CPU 강 1 개의 코어 (단일 코어, Single Core) 만 가지고 있었음
-- 최근에는 8개의 코어를 갖춘 옥타 코어 (Octa Core) CPU 도 대중화됨
-- 다중 코어 CPU 는 내장된 코어 수와 같은 수의 단일 코어 CPU 를 설치한 것과 유사한 성능을 냄
04. 셀
● 셀 (Shell)
- 사용자와 커널 간의 소통을 원활하게 해 주는 소프트웨어
- 사용자가 터미널에서 작성한 명령어를 해석하여 커널에 직접 전달해서 컴퓨터를 빠르고 강력하게 제어 가능
● 터미널
- 컴퓨터가 실행한 결과를 그대로 출력해 주는 것
- ex. 맥의 터미널, 윈도우의 명령 프롬프트
● 파워셀 (PoserShell)
- 마이크로소프트사에서 만든 파워셀은 윈도우에서 실해오디는 셀로 기본 cmd (명령 프롬프트) 의 확장형
- 기존 cmd 와 다르게 크로스 플랫폼과 오픈 소스를 지향하기 시작하면서 리눅스, 맥 등 다양한 OS 에서 사용할 수 있음
● CLI (Command Line Interface)
- 사용자가 입력할 수 있는 인터페이스
- CLI 에서의 명령어의 입출력은 모두 문자열로만 이루어짐
- Git, node, vue 와 같은 서비스를 잘 활용하기 위해서는 CLI 지식이 필수적
● 셀을 접하는 곳
- 파일 탐색기 / Finder
- Git
- 비주얼 스튜디오 코드 (Visual Studio Code)
● 셀 종류
- 본 셀 (Bourne Shell)
- C 셀 (csh)
- 본 어게인 셀 (Bourne Again Shell (bash))
- Z 셀 (zsh)
● 셀을 알아야 하는 이유
- 작업 효율을 올려주기 때문에 리눅스, Git, npm 등 많은 곳에서 셀이 사용되고 있음
- 셀 스크립트 (Shell Script) 는 여러 셀 명령어와 스크립트 문법을 활용하면 강력한 프로그램을 만들 수 있으며, 다른 프로그래밍 언어보다 구조가 매우 단순해서 배우기 쉬움
- 셀 스크립트는 .sh 확장자로 만드는 경우가 많으며, 실행 파일이나 유틸리티 등을 서로 연결하여 원하는 프로그램을 쉽고 빠르게 만들 수 있음
- 스크립트를 작성하거나 기존 스크립트를 디버깅하는 것 또한 고급 언어에 비해 굉장히 수월함
● 셀 명령어 소개
- 체인지 디렉터리 (Change Directory) : cd <디렉터리명>
-- 작업중인 디렉터리를 바꾸는 명령어
- 리스트 세그먼트 (List Segments) : ls <옵션>
-- 현재 디렉터리에 존재하는 폴더 및 파일을 확인하는 명령어
- ConcATenate : cat <파일명>
-- 간단하게 파일 내용을 읽어 오고 두 파일의 내용을 잇는 명령어
- MANual : man <명령어, 항목>
-- 어떤 명령어의 사용법이나 용도를 알고 싶을 때 사용하는 명령어
- Print Working Directory : pwd
-- 현재 작업중인 폴더의 위치를 알고 싶을 때사용하는 명령어
- CLEAR : clear
-- 터미널을 깨끗하게 만드는 명령어
● 셀 스크립트
- 셀 명령어를 텍스트 파일 형식으로 저장한 후 한 줄씩 읽어 실행시키는 스크립트
05. 메모리
● 메모리 (Memory)
- 메모리는 RAM (Random Access Memory) 임
- 순서에 상관 없이 임의로 데이터들에 접근하는 장치를 의미
-- 컴퓨터가 작업을 처리할 때 CPU 는 계산을 담당하고 HDD 와 같은 보조기억장치는 정보를 담당함
-- 그런데 보조기억장치에서 바로 계산하기에는 CPU 에 비해 보조기억장치가 상대적으로 너무 느리기 때문에 빠른 RAM 을 활용하여 정보를 처리함
● 메모리 영역
- 일단 코드 혹은 프로그램이 실행되면 가장 먼저 작성한 코드는 컴퓨터가 이해할 수 있는 언어로 변환되어야 함
- 이 과정을 컴파일이라고 하며, 이 과정에서부터 네 가지 메모리 영역에 변수들이 종류별로 다르게 적재됨
● 코드 (Code) 영역
- 프로그램이 컴파일되면 모든 코드는 코드 영역으로 적재됨
- 그리고 코드 영역의 코드들을 CPU 가 하나씩 가져가서 처리함
- 코드 영역의 자원들은 프로그램이 모두 종료될 때 해제됨
● 데이터 (Data) 영역
- 전역 변수와 정적 (Static) 변수가 저장되는 공간
- 두 변수의 공통점은 프로그램이 끝나기 전까지 해제되지 않음
- 해제되지 않고 프로그램이 종료되기 전까지 남아 있어야 하는 변수는 데이터 영역에 할당됨
● 힙 (Heap) 영역
- 동적 할당 영역
- 프로그램이 실행되는 도중에 일시적으로 필요할 때 메모리를 할당하고 사용 후 반납하는 영역
- 힙 영역은 메모리의 주소값을 할당하며 이후 필요 없어지면 해제함
- 힙 영역을 해제할 때는 더 이상 메모리를 사용하지 않을 떄 해제해야 메모리를 효율적으로 사용할 수 있음
- 힙 영역은 스택에 실제 데이터가 저장되는 위치에 대한 주소값만을 저장한 후 필요할 때 주소값을 활용해 접근하여 사용함
- 사실 힙 영역은 스택에 비해 데이터 처리가 느림
- 그럼에도 힙 영역을 사용하는 이유
-- LIFE Cycle : 스택 메모리에서는 저장한 값이 스택과 함께 사라지므로, 프로그램이 실행되는 동안 값을 저장하기 부적합하기에 힙 영역이 사용됨
-- Large Size : 커다란 객체를 스택에 무작정 할당할 경우, 한정된 스택 메모리에 다른 값을 쌓는 게 어려울 수 있기 때문에, 스택에 주소만 주고 힙 메모리에 할당하여 메모리를 효율적으로 관리함
-- Dynamic Memory : 처음부터 객체의 개수를 정하지 않고 필요할 때마다 객체 생성을 결정할 수 있으므로 힙 메모리를 사용함
● 스택 (Stack) 영역
- 정적 할당 영역
- 지역변수와 매개변수가 저장되는 공간
- 메인 메소드를 포함한 모든 메소드가 적재되는 공간
- 메소드의 순서에 따라 할당되고 해제됨
- 스택 방식은 후위선출 (LIFO) 방식으로, 나중에 들어온 코드가 실행 후 먼저 해제되는 방식을 사용함
● 메모리를 알아야 하는 이유
- 메모리는 한정된 자원임
- 변수에 따라 다른 메모리 영역을 사용하는 이유도, 계속 사용할 변수와 잠깐 사용하고 해제할 변수를 메모리에 다르게 적재하여 원하는 시점에 변수를 할당 및 해제하기 위함
- 메모리를 알고 효율적으로 사용하는 것은 개발에 있어 매우 중요함
06. 가비지 컬렉션
● 가비지 컬렉션 (Garbage Collection)
- 동적으로 할당되어 있는 메모리 영역 중 사용하지 않는 메모리 영역을 해제해 주는 작업
- 특정 조건을 만족할 때 동작함
-- 이 조건은 언어마다 다르기 때문에 가비지 컬렉션이 동작하는 시점 또한 언어마다 다름
- 가비지 컬렉션 기능을 제공하는 언어는 자바, C#, 자바스크립트 등이 있음
- 가비지 컬렉션 기능이 있는 언어를 Managed Language 라고 함
● 장점
- 가비지 컬렉션을 사용하면 개발자가 일일이 메모리를 관리할 필요가 없기 때문에 개발자가 개발 자체에 더 집중할 수 있음
- 가비지 컬렉션은 프로그램의 안정성을 높여줌
-- 메모리 누수 현상을 어느 정도 예방 가능
-- 메모리 누수 : 프로그램이 사용하지 않는 메모리 공간을 점유하고 있어 메모리 공간이 낭비되는 현상
- 댕글링 포인터 (dangling pointer) 로 인해 발생하는 프로그램 오류를 막아줌
-- 특정 메모리가 해제되었을 때 포인터가 여전히 그 메모리를 가리키고 있다면, 프로그램에 예상치 못한 버그가 발생할 수 있음
- 메모리가 이중으로 해제되는 문제를 막을 수 있음
● 단점
- 가비지 컬렉션을 적용해도 메모리 누수를 완전히 잡아 내지는 못함
- 프로그램 내에서 가비지 컬렉션이 동작하는 시점과 동작에 소요되는 시간을 정확히 알 수 없기 때문에, 예상치 못한 시점에서 프로그램이 정지되는 문제가 생길 수 있음
- 특정 메모리가 해제되는 시점을 정확하게 알 수 없음
- 해제할 메모리를 결정하는 과정에서 이미 사용 여부를 알고 있는 메모리까지 전부 검사하기 때문에 비효율적
● 동작 방식
- 레퍼런스 카운팅 (Reference Counting) 방식
-- 메모리가 참조 (reference) 되는 횟수를 세어 참조 횟수가 0 번인 메모리는 사용되지 않는 메모리로 판단함
-- 즉, 메모리 영역이 몇 번 참조되었는지를 전부 세어 그 값을 저장하고, 참조 횟수가 0 번인 메모리 영역을 가비지 컬렉션 대상에 포함시킴
-- 모든 객체가 각각 참조된 횟수를 실시간으로 갱신해야 한다는 것과 순환 참조 문제가 발생할 수 있다는 단점
-- 대표적인 언어 : 파이썬, 펄
- 포인터 추적 방식
-- 대부분의 가비지 컬렉션의 방식
-- 포인터 추적 방식의 대표적인 알고리즘은 마크 앤 스윕 (Mark-and-Sweep) 알고리즘
-- 메모리상에 표시 (Mark) 하고 쓸어서 (Sweep) 버리는 과정을 통해 가비지를 처리함
-- 즉, 프로그램에서 사용되는 메모리는 마킹하고, 마킹되지 않은 메모리는 사용하지 않는 것으로 판단해 쓸어서 버림
-- 이때 메모리의 사용 여부 판단은 Root 변수를 기준으로 함
-- 최상위 Root set 변수에서 접근할 수 있는 개체들의 메모리를 전부 마킹하고, 또 그 객체에서 접근이 가능한 객체에 마킹하는 동작을 반복함
-- 이 표시 단계가 끝나면 쓸어서 버리는 과정을 진행함
-- 마킹되지 않은 객체를 전부 지우고 나면 객체의 마킹을 전부 초기화시킴
-- 메모리가 부분적으로 삭제되기 때문에 메모리의 파편화 (Fragmentation) 문제가 발생할 수 있음
07. XSS / CSRF
● XSS (Cross-Site Scripting)
- 사이트 간 스크립팅
- 웹 앱에서 자주 나타나는 취약점 중 하나
- 해커가 웹 페이지에 악성 스크립트를 삽입해 사용자의 로그인 정보 등을 탈취하는 공격 방식
● CSRF (Cross-Site Request Forgery)
- 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 해서 특정 웹 페이지를 보안에 취약하게 하거나 수정, 삭제 등의 작업을 하게 만드는 공격 방법
- XSS 는 공격 대상이 클라이언트 / CSRF 는 공격 대상이 서버
● XSS 공격 방식
- Stored XSS
-- 접속자가 많은 웹 사이트를 대상으로 XSS 취약점이 있는 웹 서버에 공격자가 악의적으로 스크립트를 입력해 놓고, 사용자가 해당 페이지를 읽는 순간 사용자의 브라우저를 공격하는 방식
-- ex. 게시판의 HTML 문서 안에 <script>alert(document.cookie);</script> 를 이용하여 악성 스크립트를 삽입하는 방식
-- 공격자는 XSS 공격 스크립트를 웹 사이트의 게시판 등에 삽입한 후 사용자가 그 게시물을 클릭할 때까지 기다림
-- 사용자가 공격자의 게시물을 열람하는 순간 스크립트 코드가 사용자에게 전달됨
-- 이때 웹 브라우저는 스크립트 코드를 실행하고 사용자의 세션 쿠키 정보가 공격자에게 전달됨
-- 이후 공격자는 세션 쿠키를 사용해 사용자의 권한으로 웹 사이트 접속이 가능해짐
-- 즉, 악의적인 스크립트 코드가 DB 에 저장되고, 사용자가 클릭할 때마다 구현된다는 특징
- Reflected XSS
-- 악성 스크립트가 포함된 URL 을 사용자가 클릭하도록 유도하여 클라이언트를 공격하는 방법
● CSRF 공격 방식
- 사용자의 의지와 무관하게 공격자가 의도한 행위를 특정 웹 사이트에 요청하게 하는 공격
- 즉, 조작된 요청 정보가 삽입된 게시물이나 이메일을 클릭하면 사용자의 권한으로 의도하지 않은 조작된 요청을 웹 서버에 전송하여 회원정보를 변경하거나 게시판 설정을 변경하는 등의 행위가 발생하는 공격 방법
● XSS 공격 대응 방안
- 주로 해커가 스크립트를 삽입하는 방식이기 때문에 기본적으로 스크립트 캐그를 사용함
- 따라서 <, > 등과 같은 문자를 필터링하는 방법으로 공격을 막을 수 있음
● CSRF 공격 대응 방안
- 리퍼럴 (Referrer) 검증
-- 백엔드 단에서 요청의 리퍼럴을 확인하여 도메인이 일치하는지 검증하는 방법
- CSRF 토큰 (Token)
-- CSRF 토큰은 임의의 난수를 생성하고 세션에 저장함
-- 그리고 사용자가 요청할 때마다 해당 난수 값을 포함하여 전송함
-- 이후 백엔드에서는 요청을 받을 때마다 세션에 저장된 토큰 값과 요청된 파라미터에 전달된 토큰의 일치 여부를 검사함
- 캡차 (Captcha)
-- 캡차는 게시물을 쓰는 사람이 로봇인지 검증하는 장치
-- 컴퓨터는 판단하기 어렵지만 사람은 식별할 수 있는 이미지로 글씨를 판단하게 하여 사람임을 증명하는 기법
-- CSRF 에 대응함
08. 악성코드
● 악성코드 (Malicious Code)
- 악성 프로그램
- 시스템, 서버, 네트워크 등에 영향을 미치는 소프트웨어로, 악의적인 목적으로 만들어진 모든 코드를 총칭
- 바이러스, 웜, 스파이웨어, 트로이목마, 애드워드 등 여러 악성코드가 존재
● 악성코드 종류
- 바이러스
-- 바이러스는 자기 자신을 복제하거나 다른 프로그램을 감염시키는 등 운영체제나 기타 응용 프로그램의 정상적인 실행을 방해하는 불법 프로그램
- 웜
-- 피해를 주는 시스템이라기보다, 시스템 안에서 무한 증식해 메모리나 CPU 등의 자원을 낭비하게 하는 수준의 악성코드
- 트로이 목마
-- 정상적인 프로그램으로 위장한 악성코드
-- 사용자의 시스템에 몰래 침투하여 감염시키는 방식
09. IDS / IPS / WAF
● IDS (Intrusion Detection System) / IPS (Intrusion Prevention System) / WAF (Web Application Firewall)
- 외부 침입을 탐지하고 방지하는 시스템
● 침입 탐지 시스템 (Intrusion Detection System, IDS)
- 방화벽이 탐지할 수 없는 악의적인 네트워크 트래픽을 탐지하는 시스템
● 침입 방지 시스템 (Intrusion Prevention System, IPS)
- 침입을 탐지하고 탐지에 대한 방지도 할 수 있는 시스템
● 웹 방화벽 (Web Application Firewall, WAF)
- 웹 앱 앞에서 네트워크 트래픽을 분석해 모니터링하고 제어하는 시스템
10. DDos
● DDoS (Distributed Denial of Service)
- 수십대의 PC (좀비 PC) 를 동시에 접속시켜 과부하를 일으켜 서버를 마비시키는 방법
- 이로 인해 과도한 트래픽이 발생하고 서버가 작동하지 않게 됨
● DDos 공격 유형
- 응용 프로그램 계층 공격
-- 가장 기본적인 DDoS 형태
-- 정상적인 서버를 모방해 봇넷, 다른 장치와 함께 웹 사이트에 접속함
-- 이후 DDoS 가 지속적으로 부하를 일으켜 서버 요청을 할 수 없는 상태로 만들고, 결국 네트워크 양이 폭발적으로 날어나 마비가 됨
- 프로토콜 공격
-- 통신을 악용해 서버, 방화벽 같은 인프라에서 컴퓨터 용량을 소비시키는 방법
- 볼륨 (증폭) 공격
-- 가장 잦은 빈도를 보이는 공격
-- 대용량 트래픽을 보내 다량의 패킷으로 서버를 사용하지 못하게 만드는 방법
-- 즉, 인터넷 대역폭을 급격하게 소모시켜 사용량을 100 % 로 만듦
-- 사용량이 100 % 가 되면 서버가 정상 서비스를 할 수 없게 되고, 결국 대역폭 증설, 회선 증설, 신규 서버로 대체 등을 해야 하는 무차별적인 방법
● DDoS 의 목적
- 공격 대상을 마비시키는 것
11. 프록시 서버
● 프록시 (Proxy) 서버
- Proxy : 대리인이라는 뜻
- 클라이언트가 자신을 거쳐 다른 네트워크에 접속할 수 있도록 중개해 주는 서버
- 우리가 자주 방문하는 인터넷 서비스들은 빠른 전송과 네트워크 비용 절감, 보안을 위해 프록시 서버를 사용하는 경우가 많음
● 포워드 프록시 (Forward Proxy)
- 일반적으로 프록시 서버라고 하면 포워드 프록시를 의미
- 클라이언트와 인터넷 사이에 프록시가 위치해서 클라이언트 대신 서버에 요청을 보내 주는 형태
- 이점
-- 로컬 네트워크와 인터넷 사이를 오가는 트래픽을 제어 가능
-- 대개 캐싱 기능이 있어, 어떤 콘텐츠가 빈번하게 사용된다면 월등한 성능 향상을 가져옴
-- 보안 강화
● 리버스 프록시 (Reverse Proxy)
- 서버와 인터넷 사이에 위치해서 서버의 응답을 대신 클라이언트에 전달해 주는 역할
- 이점
-- 로드 밸런싱이 가능
-- 보안상의 이유로 클라이언트가 직접 서버에 접근하는 것을 원하지 않는 경우, 리버스 프록시를 통해 클라이언트가 서버에 간접적으로 접근할 수 있게 함 (방화벽 역할)
12. OAuth 2.0
● OAuth 2.0 (Open Authorization 2.0, OAuth 2)
- 사용자 인증을 위한 개방형 표준 프로토콜
- 기존 : 아이디 / 비밀번호 형태로 인증 / 인가를 수행
- 여기서는 접근 권한을 인증받기 위한 토큰을 발급받아 인증 / 인가를 수행
- ex. 구글 로그인, 페이스북 로그인, 네이버 로그인, 카카오 로그인
- OAuth 2.0 은 IETF 글로벌 표준
- OAuth 2.0 인증 방식을 제공하는 업체로부터 API 를 제공받아 로그인 서비스를 개발하는 경우 간단하게 회원 가입 및 로그인 기능을 만들 수 있음
● OAuth 2.0 기본 용어
- 사용자 (Resource Owner)
-- 액세스 중인 리소스의 유저
- 클라이언트
-- 사용자를 대신하여 보호된 리소스에 액세스 하는 응용 프로그램
- 리소스 서버 (Resource Server)
-- 클라이언트의 요청을 수락하고 응답하는 서버
-- 사용자의 정보를 제공
- 인증 서버 (Authorization Server)
-- 로그인 서비스를 제공하며, 로그인을 통한 인증 후 권한을 부여하는 서버
-- 인증 서버는 리소스 서버와 동일할 수도, 다를 수도 있음
- 액세스 토큰 (Access Token)
-- 보호된 리소스에 액세스 하는 데 사용되는 비밀 키
● OAuth 2.0 동작 원리
- OAuth 를 사용하면 고객이 자신의 아이디와 비밀번호를 서비스에 알려주지 않아도 고객이 등록한 정보를 사용할 수 있음
- 이것이 가능한 것은 액세스 토큰 때문
-- 액세스 토큰은 임의의 문자열 값인데, 이 문자열의 정체는 이 토큰을 발급한 서비스만 알 수 있음
-- 이 액세스 토큰을 이용해 토큰 값과 관련된 고객 정보를 해당 서비스에 요청할 수 있음
-- 해당 서비스는 이 토큰을 검증하고, 발급된 것이 맞다면 해당 고객의 정보를 넘겨줌
-- 즉 액세스 토큰의 존재 자체가 고객이 정보를 넘겨주는 것에 동의하는 것을 의미
● OAuth 2.0 사용하는 이유
- 계정 통합
-- 이용하려는 서비스마다 일일이 회원가입할 필요 없이 기존에 사용하던 타사의 정보를 이용하여 로그인할 수 있음
-- 클릭만으로 사이트와 타사 계정을 연동할 수 있어 하나의 계정으로 여러 사이트를 이용할 수 있고, 기억해야 하는 계정 정보도 그만큼 줄어듦
- 보안 강화
-- 사용자가 클라이언트에게 아이디와 패스워드를 제공하는 대신, 인증 서버에 직접 인증하면 되기 때문에 안전하게 사용 가능
- 기타 API 접근 가능
-- OAuth 2.0 을 사용하면 SDK 를 통해 기타 API 정보에도 접근 가능
13. 암호화 / 복호화
● 암호화 / 복호화
- 암호화 : 의미가 있는 정보를 의미를 알 수 없는 형태의 정보로 변환하는 것
- 복호화 : 의미를 알 수 없는 정보를 해석하여 의미를 알 수 있는 정보로 변환하는 과정
● 단방향 암호화
- 복호화를 염두하지 않음
- ex. 비밀번호를 저장할 때 대게 단방향 암호화를 이용하여 DB 에 저장함
-- 때문에 DB 관리자도 실제 사용자가 어떤 암호를 쓰는지 복호화하여 알 수 없음
- 대표적인 예 : 해싱
-- 입력한 평문을 해시 알고리즘을 통해 동일한 값에 대해서는 동일한 해시 값을 돌려줌
● 양방향 암호화
- 암호화와 복호화에 사용되는 키가 동일한 대칭형 암호화와 키가 다른 비대칭형 암호화로 나누어짐
14. 고가용성
● 고가용성 (High Availability, HA)
- 서버와 네트워크, 프로그램 등의 시스템을 지속적으로 운영할 수 있는 상태를 의미
● 가용성
- 시스템이 서비스를 정상적으로 제공할 수 있는 상태
- 다운되지 않고 정상적으로 유지된 시간
- 고가용성의 최대 목적인 99.9999999 % (nine nines)
● 고가용성
- 가용성이 높다는 뜻으로 절대 고장 나지 않는다는 뜻
- 서비스 품질을 위해 고가용성의 최대 목표인 99.9999999 % (nine nines) 가 나오도록 시스템을 설계함
15. 아두이노 / 라즈베리파이
● 아두이노 (Arduino)
- MCU (Micro Controller Unit) 을 해우는 데 어려움을 겪던 디자이너들을 위해 만든 교육용 MCU 보드
● 라즈베리파이 (Raspberry Pi)
- 개발도상국의 기술 증진을 위해 만든 교육용 소형 컴퓨터
● 아두이노 (Arduino) / 라즈베리파이 (Raspberry Pi) 사용 이유
- 회사에서 간단하게 제품의 프로토 타입을 만들 때나 무궁무진한 아이디어를 실행시키고자 하는 모든 사람들이 사용 가능
- 홈 IoT
참고문헌
● 개발자가 되기 위해 꼭 알아야 하는 IT 용어 : https://product.kyobobook.co.kr/detail/S000061352646