# Table of Contents
# 보안, 정보보호
보안
, 정보보호
에 대해 정리한다.
# 보안 분야
보안은 크게 네 분야로 나뉜다.
- 시스템 보안
- 네트워크 보안
- 어플리케이션 보안
- 정보보안 기술
# 보안의 삼대 요소 (CIA)
기밀성(Confidentiality)
: 인증되고 접근 권한도 있는 사용자만이 자원에 접근할 수 있다.무결성(Integrity)
: 인증되지 않거나 접근 권한이 없는 사용자는 자원을 변경할 수 없다.가용성(Availability)
: 인증되고 접근 권한도 있는 사용자는 언제든지 자원을 사용할 수 있다.
# 인증
인증(Authentication)
은 아이디/패스워드 또는 토큰으로 사용자가 맞는지를 확인하는 것이다.
# 인가
인가(Authorization)
는 자원에 대한 접근 권한을 지정하는 것으로 접근 제어(Access Control)
라고도 한다. 인증된 사용자라도 특정 자원에 대한 권한이 없으면 접근할 수 없다. 스프링에서는 역할(Role)
또는 권한(Authority)
로 인가를 구현할 수 있다.
# 악성 프로그램
악성 코드
, 멀웨어(Malware)
라고도 하며, 악의적 목적으로 만든 모든 소프트웨어를 총칭한다. 악성 프로그램은 두 가지 기준으로 분류할 수 있다.
- 작동 방식에 따른 분류
- 특성에 따른 분류
# 작동 방식에 따른 분류
# 바이러스
- 다른 코드에 기생하여 실행되기 때문에 자가실행 능력은 없다.
- 자기복제능력이 있어 다른 코드를 감염시킬 수 있다.
- 파일을 손상시킨다.
# 웜
- 다른 코드에 기생하지 않고 독자적으로 실행된다.
- 네트워크 대역을 손상시킨다.
# 트로이 목마
- 정상 소프트웨어로 위장한 악성 프로그램
- 사용자 정보를 유출하거나 자료를 파괴한다.
# 특성에 따른 분류
# 스파이웨어
- 스파이 같은 행동을 하는 프로그램. 사용자의 동의없이 설치되어 중요한 정보를 유출한다.
# 애드웨어
- 광고를 보여주는 프로그램
# 백도어
- 뒷문이라는 뜻
- 정상적인 인증을 걸치지 않고 응용 프로그램 또는 시스템에 접근하여 컴퓨터 속의 정보를 빼내가거나 특정 작업을 하도록 제작된 프로그램
# 루트킷
- 관리자 레벨의 접근을 가능하도록 하는 프로그램
# 크립토마이너
- 사용자 몰래 설치되어 암호화폐를 채굴하는 프로그램.
- CPU 사용량을 높일 수 있다.
# 랜섬웨어
- 인질과 소프트웨어의 합성어
- 컴퓨터 자원에 암호화를 걸고, 금품을 요구하는 프로그램
# DoS
- Denial of Service
- 서버로 과다한 요청을 보내서 과부하시키는 것
# TCP SYN Flooding
- 클라이언트가 3-way handshaking 과정에서 SYN를 보내면 서버는 SYN/ACK를 보내고 클라이언트의 응답을 처리하기 위해 자원을 점유하며 기다리게 된다.
- 이때 클라이언트가 다시 ACK를 보내지 않아 서버가 자원을 점유한 상태로 계속 기다리게 하는 공격
- 해결방법은 클라이언트와 서버 사이에 게이트를 위치시키고, 일정 시간이 지나도 클라이언트로부터 ACK가 도착하지 않으면 서버로
RST(Reset)
패킷을 보내주도록 한다.
# UDP Flooding
- 클라이언트가 서버에 UDP 패킷을 계속 보내어 과부화시키는 것
- 해결방법은 방화벽을 통해 불필요한 서비스 요청을 차단한다.
# DDoS
- Distrubuted Denial of Service
- DoS는 하나의 호스트가 하나의 타겟을 공격한다면 DDos는 여러 호스트가 하나의 타겟을 분산 공격하는 것
# 해결방법
- 방화벽, 라우터, 리버스 프록시 서버 등을 배치하여 허용된 IP만 요청할 수 있도록 한다.
- AWS를 사용하는 경우 IAM, Kubernetes를 사용하는 경우 Ingress 기능을 사용할 수 있다.
# IP Spoofing
- TCP 3-way handshaing 과정에서 제 3자가 서버의
SYN/ACK
를 가로챈 후 클라이언트의 IP로 가짜 ACK를 보내서 세션을 연결하는 방법
# Sniffing
- 킁킁거리다.
- 네트워크 상에 지나다니느 패킷을 가로채서 내용을 확인하는 기술
- SSL, HTTPS, VPN 등의 기술을 사용하여 패킷을 암호화한다.
# SSL/TSL
- Socket Secure Layer/Transport Secure Layer
- 데이터 암호화 프로토콜
- 먼저 SSL Handshaking을 통해 클라이언트에 비밀키를 배송한다.
- 이후 비밀키로 데이터를 암호화하여 전송하면 데이터가 유출되어도 기밀성이 보장된다.
- HTTPS, VPN 등에 사용된다.
# HTTPS
- HTTP Secure
- HTTP 통신이 SSL 암호화 프로토콜을 적용
# VPN
- Virtual Private Network
- Public internet에 가상의 사설 네트워크를 구축하고 SSL를 통해 데이터를 암호화한다.
# SSO
- 통합 인증(Single Sign-On)
- 한 번의 인증 과정으로 관련된 여러 애플리케이션에 접근할 수 있는 인증 방식
# 해시함수
입 력 문 자 열 출 력 문 자 열 해 시 값 해 시 코 드 - 입력 문자열을 해시 함수에 넣으면 출력 문자열을 만들어주는 함수
일방향성
: 입력 문자열로 출력 문자열을 찾을 수 있으나, 출력 문자열로는 입력 문자열을 찾을 수 없다는 특성충돌 회피성
: 다른 입력 문자열에 대해 동일한 문자열이 나오지 않는 특성- 충돌을 회피하기 위해
Open Chaining
,Closed Chaining
기법을 사용한다. - Java의
HashMap
같은Key-Value
자료구조에 활용한다. - 위변조 방지를 통한 무결성 검증에 활용한다.
- 송신자는 데이터를 전송할 때 데이터에 대한 해시값을 뒤에 추가해서 전송한다.
- 수신자는 데이터로 해시값을 구한 후, 전송받은 해시값과 비교하여 데이터가 변하지 않았다는 것을 증명한다.
- 다음과 같은 해시함수가 있다.
- MD5
- SHA-1
# 대칭키 암호화 알고리즘
- 암호화와 복호화에 동일한
비밀키
를 사용한다. - 암호화 알고리즘이 간단하여 빠르지만
키 분배
의 문제가 있다. - 다음과 같은 대칭형 암호화 알고리즘이 있다.
DES
: Data Encryption StandardAES
: Advanced Encryption Standard
# 비대칭키 암호화 알고리즘
- 암호화와 복호화에 다른 키를 사용한다.
- 개인키로 암호화한 암호문을 공개키로 복호화할 수 있으며, 공개키로 암호화한 암호문을 개인키로 복호화할 수도 있다.
- 수신자가
개인키
,공개키
쌍을 생성한다. 개인키
는 수신자만 가지고 있으며, 수신자는공개키
를 여러 송신자에게 분배한다.- 송신자는 평문을 공개키로 암호화하여 전송하고, 수신자는 개인키로 암호문을 복호화하여 평문을 얻는다.
- 알고리즘이 복잡하기 때문에 복호화 속도가 느리다.
- 비대칭키 암호화 알고리즘 다음 분야에 활용된다.
- 키 분배
- 전자서명
- 다음과 같은 비대칭키 암호화 알고리즘이 있다.
Diffie-Hellman
: 이산대수 문제의 어러움RSA
: 소인수분해
# 전자서명
- 전자서명은
송신자 식별
,송신 부인 방지
,위변조 방지
에 사용된다. - 전자서명 절차는 다음과 같다.
- 송신자는 평문으로 해시값을 만든다.
- 송신자는 평문+해시값을 개인키로 암호화하여 암호문을 전송한다.
- 수신자는 암호문을 공개키로 복호화하여 평문+해시값을 얻는다.
- 수신자가 공개키로 복호화에 성공했다는 것은 올바른 송신자가 개인키로 암호화했다는 것을 뜻하기 때문에 송신자 인증과 송신 부인 방지에 성공한다.
- 평문과 해시값을 비교하여 위변조 여부를 확인한다.
# PKI와 공동인증서
- Public Key Infrastructure (공개키 기반구조)
- 공동인증서 발급과 인증을 위해 구축한 인프라
- 공동인증서 발급 절차
- 사용자는 신분증, 계좌번호 등으로 본인을 인증하고 은행, 증권사 같은 등록대행기관(RA)에 공동인증서 발급을 요청한다. 이때 사용자는 개인키를 암호화하는데 사용하는 비밀번호를 함께 제공한다.
- 등록대행기관은 인증서에게 공동인증서 발급을 요청한다.
- 등록대행기관은 금융결제원, 코스콤 같은 인증기관(CA)에 공동인증서 발급을 요청한다.
- 인증기관은 사용자의 개인키와 공개키를 생성한다.
- 인증기관은 사용자 정보, 만료기간 등의 정보 등을 사용자의 개인키로 암호화한다.
- 인증기관은 개인키로 암호화한 암호문과 사용자 공개키를 합친 후 전자서명을 해서 공동인증서를 만든다.
- 인증기관은 사용자가 제공한 비밀번호로 사용자의 개인키를 암호화한다.
- 인증기관은 공동인증서와 사용자 개인키를 암호화한 암호문를 사용자에게 발급한다.
- 공동인증서 인증 절차
- 사용자는 공동인증서, 사용자 개인키를 암호화한 암호문, 개인키 비밀번호를 제공한다.
- 인증기관은 본인이 서명한 공동인증서인지를 확인한다.
- 인증기관은 사용자의 공개키로 복호화하여 사용자 정보, 만료기간 등을 확인한다.
# 쿠키와 세션
- HTTP는
비연결성(Connectionless)
과무상태성(Stateless)
을 가진다. 쿠키(Cookie)
와세션(Session)
을 사용하면 HTTP에 연결성과 상태를 부여할 수 있다.- 쿠키와 세션은 다음과 같이 동작한다.
- 클라이언트가 첫 요청을 보내면 서버는 1:1로 대응되는 쿠키와 세션을 생성한다.
- 서버는 세션을 메모리나 온디스크 데이터베이스에서 저장하며, 쿠키를 클라이언트에 보낸다.
- 클라이언트는 쿠키를 브라우저에 저장한다.
- 클라이언트는 다음 요청부터 쿠키를 헤더에 함께 보낸다.
- 서버는 이 쿠키를 세션과 비교하여 일치하는지 확인한다.
- 세션을 인메모리 방식으로 관리하면 서버가 재시작될 때 사라지기 때문에
Redis
같은 데이터베이스에서 관리한다. - 세션을 유지하는 것은 서버에 부담을 줄 수 있기 때문에 요즘에는
토큰 기반 인증
도 많이 사용한다.
# JWT
- Json Web Token
- 검증이 가능하고 만료 기한이 있는 문자열
- 토큰 내에 사용자 정보 같은 특정 정보를 포함시킬 수 있다.
- 보통
토큰 인증방식
에서Access Token
과Refresh Token
을 생성하는데 사용한다. 쿠키 세션 인증방식
처럼 세션을 서버에 저장할 필요가 없기 때문에 서버의 부담이 줄어든다.
# OAuth 2.0
- 구글, 카카오 간편 로그인 같이 제 3자에게 인증을 위임하는 인증 방식
- 순서
- 어플리케이션을 구글, 카카오 같은 제 3자에게 등록하고
리다이렉션 URL
과API Key
를 발급받는다. - 개발자는 제 3자에게 발급받은
API Key
를 어플리케이션에 등록한다. - 사용자가 어플리케이션으로 로그인하면
리다이렉션 URL
로 이동하도록 구현한다. - 사용자가 제 3자의 로그인 페이지에서 인증에 성공하면 애플리케이션은 인증 여부와 사용자 정보를 받게 된다.
- 어플리케이션을 구글, 카카오 같은 제 3자에게 등록하고
# SQL Injection
- HTML 폼 같은 입력 위젯에
UPDATE
,DELETE
,DROP
같이 데이터베이스의 상태를 변화시키는 연산을 삽입하는 기술 - React, Vue와 같이 CSR을 사용하는 경우 라이브러리 자체에서 제공하는 SQL Injection 방지 기술을 적용한다.
- 서버에서는 1차적으로
Spring Validation
같은 검증 라이브러리로 입력 값을 검증한다. - 2차적으로 JDBC, SQL Mapper, JPA, JPQL 같이 문자열을 사용하는
Native SQL
대신Query DSL
같은 기술을 활용한다.
# XSS
- Cross-site Scripting
- 로그인 폼 같은 입력 위젯에 자바스크립트 코드를 넣어 실행시키는 것
- React, Vue 같은 클라이언트 사이드 렌더링에서도 자체적인 XXS 공격 방지 기술이 있다.
- JSP, mustache 같은 서버 사이드 렌더링에서는 XSS Filter 같은 자체적인 XXS 방지 기술을 사용한다.
# CSRF
- Cross Site Request Forgery
- 사이트 간 요청 위조 공격
- 클라이언트를 자신의 의지와는 무관하게 서버로 요청을 보내거나 위변조된 페이지로 리다이렉트 시키는 공격
- 예를 들면 새로운 게시글이나 이메일에 첨부된 링크를 누르면 서버로 원치 않는 요청을 보내거나, 위변조된 페이지로 이동시킨다.
- 해결방법은 두 가지가 있다.
- 서버에서 요청의
Referrer
헤더를 도메인과 일치하는지를 체크한다. - 서버에서
CSRF 토큰
을 발행해주고, 클라이언트는 요청을 보낼 때X-XSRF-TOKEN
헤더에 이 토큰을 함께 보낸다.
- 서버에서 요청의
- Token 기반 인증에서는 고려할 필요가 없으며, 쿠키 세션 기반과 SSR을 사용할 때 고려해야한다.
# SOP
- Same Origin Policy
- 동일 출처 정책
- 다른 도메인, 즉 다른 프로토콜, IP, 포트로 보낸 요청에 대한 응답을 브라우저가 차단하는 정책
# CORS
- Cross Origin Resource Sharing
- 교차 출처 리소스 공유
- SOP 문제를 해결하기 위한 표준이 CORS
- 클라이언트는 기본적으로 HTTP 요청을 보낼 때
Orrigin
헤더에 출처를 명시한다. 이때 서버가Access-Control-Allow-Origin
헤더에 허용할 출처를 명시하여 응답하면 웹 브라우저는 두 헤더를 비교한 후 동일하면 응답을 통과시킨다. - 따라서 서버에서 응답을 보낼 떄
Access-Control-Allow-Origin
헤더를 적절하게 설정해주어야 한다. Spring
,Express
같은 웹 프레임워크는CORS
을 쉽게 제어하기 위한 다양한 방법을 제공한다.