# 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 Standard
    • AES: Advanced Encryption Standard

# 비대칭키 암호화 알고리즘

  • 암호화와 복호화에 다른 키를 사용한다.
  • 개인키로 암호화한 암호문을 공개키로 복호화할 수 있으며, 공개키로 암호화한 암호문을 개인키로 복호화할 수도 있다.
  • 수신자가 개인키, 공개키 쌍을 생성한다.
  • 개인키는 수신자만 가지고 있으며, 수신자는 공개키를 여러 송신자에게 분배한다.
  • 송신자는 평문을 공개키로 암호화하여 전송하고, 수신자는 개인키로 암호문을 복호화하여 평문을 얻는다.
  • 알고리즘이 복잡하기 때문에 복호화 속도가 느리다.
  • 비대칭키 암호화 알고리즘 다음 분야에 활용된다.
    • 키 분배
    • 전자서명
  • 다음과 같은 비대칭키 암호화 알고리즘이 있다.
    • Diffie-Hellman: 이산대수 문제의 어러움
    • RSA: 소인수분해

# 전자서명

  • 전자서명은 송신자 식별, 송신 부인 방지, 위변조 방지에 사용된다.
  • 전자서명 절차는 다음과 같다.
    1. 송신자는 평문으로 해시값을 만든다.
    2. 송신자는 평문+해시값을 개인키로 암호화하여 암호문을 전송한다.
    3. 수신자는 암호문을 공개키로 복호화하여 평문+해시값을 얻는다.
    4. 수신자가 공개키로 복호화에 성공했다는 것은 올바른 송신자가 개인키로 암호화했다는 것을 뜻하기 때문에 송신자 인증과 송신 부인 방지에 성공한다.
    5. 평문과 해시값을 비교하여 위변조 여부를 확인한다.

# PKI와 공동인증서

  • Public Key Infrastructure (공개키 기반구조)
  • 공동인증서 발급과 인증을 위해 구축한 인프라
  • 공동인증서 발급 절차
    1. 사용자는 신분증, 계좌번호 등으로 본인을 인증하고 은행, 증권사 같은 등록대행기관(RA)에 공동인증서 발급을 요청한다. 이때 사용자는 개인키를 암호화하는데 사용하는 비밀번호를 함께 제공한다.
    2. 등록대행기관은 인증서에게 공동인증서 발급을 요청한다.
    3. 등록대행기관은 금융결제원, 코스콤 같은 인증기관(CA)에 공동인증서 발급을 요청한다.
    4. 인증기관은 사용자의 개인키와 공개키를 생성한다.
    5. 인증기관은 사용자 정보, 만료기간 등의 정보 등을 사용자의 개인키로 암호화한다.
    6. 인증기관은 개인키로 암호화한 암호문과 사용자 공개키를 합친 후 전자서명을 해서 공동인증서를 만든다.
    7. 인증기관은 사용자가 제공한 비밀번호로 사용자의 개인키를 암호화한다.
    8. 인증기관은 공동인증서사용자 개인키를 암호화한 암호문를 사용자에게 발급한다.
  • 공동인증서 인증 절차
    1. 사용자는 공동인증서, 사용자 개인키를 암호화한 암호문, 개인키 비밀번호를 제공한다.
    2. 인증기관은 본인이 서명한 공동인증서인지를 확인한다.
    3. 인증기관은 사용자의 공개키로 복호화하여 사용자 정보, 만료기간 등을 확인한다.

# 쿠키와 세션

  • HTTP는 비연결성(Connectionless)무상태성(Stateless)을 가진다.
  • 쿠키(Cookie)세션(Session)을 사용하면 HTTP에 연결성과 상태를 부여할 수 있다.
  • 쿠키와 세션은 다음과 같이 동작한다.
    1. 클라이언트가 첫 요청을 보내면 서버는 1:1로 대응되는 쿠키와 세션을 생성한다.
    2. 서버는 세션을 메모리나 온디스크 데이터베이스에서 저장하며, 쿠키를 클라이언트에 보낸다.
    3. 클라이언트는 쿠키를 브라우저에 저장한다.
    4. 클라이언트는 다음 요청부터 쿠키를 헤더에 함께 보낸다.
    5. 서버는 이 쿠키를 세션과 비교하여 일치하는지 확인한다.
  • 세션을 인메모리 방식으로 관리하면 서버가 재시작될 때 사라지기 때문에 Redis 같은 데이터베이스에서 관리한다.
  • 세션을 유지하는 것은 서버에 부담을 줄 수 있기 때문에 요즘에는 토큰 기반 인증도 많이 사용한다.

# JWT

  • Json Web Token
  • 검증이 가능하고 만료 기한이 있는 문자열
  • 토큰 내에 사용자 정보 같은 특정 정보를 포함시킬 수 있다.
  • 보통 토큰 인증방식에서 Access TokenRefresh Token을 생성하는데 사용한다.
  • 쿠키 세션 인증방식처럼 세션을 서버에 저장할 필요가 없기 때문에 서버의 부담이 줄어든다.

# OAuth 2.0

  • 구글, 카카오 간편 로그인 같이 제 3자에게 인증을 위임하는 인증 방식
  • 순서
    • 어플리케이션을 구글, 카카오 같은 제 3자에게 등록하고 리다이렉션 URLAPI Key를 발급받는다.
    • 개발자는 제 3자에게 발급받은 API Key를 어플리케이션에 등록한다.
    • 사용자가 어플리케이션으로 로그인하면 리다이렉션 URL로 이동하도록 구현한다.
    • 사용자가 제 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을 쉽게 제어하기 위한 다양한 방법을 제공한다.