반응형

Context Switching(문맥 교환)

병렬처리에 관해 이야기할 때 항상 등장하는 단어인 Context Switching에 대해 공부 해보았다. 해당 단어를 꺼내기 위해서는 기본적으로 알아둬야 할 사전지식이 필요하다. 해당 사전지식도 가볍게 다루며 콘텍스트 스위칭에 대하여 작성해보자.

프로세스

프로세스는 컴퓨터에서 프로그램이 실행될 때 사용되는 실행 단위로, 실행 중인 프로그램의 인스턴스다. 메모리와 CPU 자원을 할당받아 동작하는 상태를 의미하며, 우리가 코드를 통해 만든 하나의 애플리케이션이 실행될 때 생성된다.

멀티 프로세스, 멀티 스레드

  • 멀티 프로세스는 여러 개의 독립된 프로세스를 생성하여 각각의 메모리 공간을 가지고 병렬로 동작
  • 멀티 스레드는 하나의 프로세스 내에서 여러 스레드가 메모리 자원을 공유하며 동작

CPU의 동작

CPU는 하나의 프로세스만을 담당하는 것이 아니라, 컴퓨터에서 실행된 모든 프로그램의 동작을 담당해야 한다.

CPU는 여러 프로그램을 동시에 처리하는 것처럼 보이지만, 사실은 매우 짧은 시간 간격으로 각 프로세스의 작업을 번갈아가며 처리하고 있다. 이 때 각 프로세스는 자신이 중단된 지점의 상태, 즉 레지스터, 스택 포인터, 프로그램 카운터 등의 정보를 저장하고, 다른 프로세스의 상태를 불러와 실행을 이어간다. 이 정보를 Context(문맥) 라고 한다.

Context Switching(문맥 교환)

문맥 교환(Context Switching)은 여러 프로세스나 스레드가 CPU를 사용할 수 있도록 문맥을 저장하고 불러오는 작업을 의미한다. 이 과정에서 실행 중인 프로세스의 상태를 저장하고 다른 프로세스의 상태를 복원하는 작업이 필요하므로 일정한 오버헤드(비용) 가 발생한다. 따라서 병렬 처리를 통해 성능을 개선하려면, 문맥 교환의 빈도와 그로 인한 오버헤드가 전체 성능에 미치는 영향을 신중하게 고려해야 한다.

반응형

'공부 > CS' 카테고리의 다른 글

해시 - 솔트치기  (0) 2024.08.25
CGI, FastCGI  (1) 2024.07.23
Web Server  (0) 2024.07.22
HTTP통신 과정  (0) 2024.07.01
왜 웹 개발자들은 익스플로러를 싫어하나요?  (0) 2023.04.29
반응형

 

해시 - 솔트치기

이번 카카오페이 사건을 통해 대충만 알고있던 솔트에 대해 정리하는 시간을 가져봤다.

암호화를 했는데 왜 문제인가?

보도자료(상세) | 보도자료 | 보도·알림 |

카카오페이에서 외부 api(알리페이)와 통신할 때 사용자의 개인정보 값에 대한 암호화 처리를 제대로 하지 않았다.

보도자료의 랜덤값 없이 단순하게 해시처리(암호화) 라는 말은 암호화 작업을 하긴 했지만 암호화 작업의 기본인 랜덤값(솔트)을 넣지 않았다고 하는 것인데, 이 작업을 진행하지 않고 단순 해시처리를 한다면 레인보우 테이블 공격에 취약하다.

이번 주제에서 설명하는 해시(암호화)는 단방향 암호화인 MD5, SHA256 등의 암호화 즉 디코딩 할 수 없는 값을 기준으로 설명 할 것이다.

암호화 테스트 링크 : https://emn178.github.io/online-tools/sha256.html

해시

우리가 hello 를 회원가입 할 때 입력받아 암호화 하여 데이터베이스에 저장한다고 가정해보자.

회원가입 할 때 받은 비밀번호를 단순 해시화 하여 값을 저장했을 때

SHA256(hello)2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 의 값으로 단방향 해시되어 데이터베이스에는 암호화 된 값을 저장할 것이다. 그래야 데이터베이스를 탈취당해도 유저의 실제 암호는 알 수 없기 때문인데

사실은 값을 찾아낼 수 있다.

레인보우 테이블

복호화를 하지 못하는데 값을 어떻게 찾을 수 있는지 의문이 들지만 해시된 값이 그저 단순 문자열로 이루어진 고정 값이라면 레인보우테이블 기법을 통해 해시된 값을 알아낼 수 있다.

레인보우 테이블이란 기존 문자들을 미리 암호화 처리하여 사전처럼 해시값 기준으로 원래의 문자열을 알아낼 수 있는 형태의 테이블이다.

레인보우 테이블이란 암호화된 해시값을 키로 두고, 키에 대한 원조 값을 찾아낼 수 있는 값을 value로 두는 사전이라고 볼 수 있는데 예시 테이블을 참고해서 보자면

key value
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 hello
8f434346648f6b96df89dda901c5176b10a6d83961dd3c1ac88b59b2dc327aa4 hi
5d5b09f6dcb2d53a5fffc60c4ac0d55fabdf556069d6631545f42aa6e3500f2e sha256
3ebff31b62c0637c54d4ffa990d5c100ea359994b35f4b342ff49797542148cd md5

만약 이러한 테이블을 저장한 레인보우 테이블이 있을 때 해커는 hello의 값을 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 해시 검색을 통해 알아낼 수 있을 것이다.

코드 예시

import java.util.*;

public class main
{
    public static void main(String[] args)
    {

                // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824의 값이 저장됨
        String passwordSave = sha256("hello");

        //만들어져 있는 레인보우 테이블이라고 가정
        Map<String, String> rainbowTable = new HashMap<>();
        rainbowTable.put(sha256("hello"), "hello");

        //얻은 해시값
        System.out.println(rainbowTable.get("2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"));
    }

    public static String sha256(String needEncodingString){
            //해싱처리
        //hello -> sha256 -> 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
        return "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824";
    }
}

---------
출력 값 : hello

솔트 치기

솔트를 치는 이유는 보안 강화이며, 단순한 해시화는 앞에서 보았던 것 처럼 쉽게 예측이 가능한 것을 보았다.
해시작업을 할 때 기존의 문자열만으로 해시하는 것이 아니라 기존 문자열과 함께 서버에서만 알 수 있는 문자열을 부여해서 두 문자를 합친 해시값을 만드는 것이다.
예를 들면 sha256(hello + "qwerafaad" ) 와 같이 암호와 관련이 없는 문자열을 해시하기 전 추가해서 전혀 다른 해시값을 만드는 것이다. 이 때 암호와 관련이 없는 문자열을 솔트(소금)이라고 부른다.

또 솔트를 칠 때 주의해야 할 점이 있는데 이에 대해 알아보자

솔트값

소금 값은 짧지 않은 값으로 생성되어야 한다.
평범한 비밀번호로 구성되어있는 룩업 테이블(레인보우 테이블) 등의 경우 837G 만으로 전체 룩업 테이블을 구성할 수 있다. 이 837GB에서 “asd” 라는 문자가 추가되는 테이블을 만들었다고 했을 때 해커 입장에서는 부담스럽지 않은 값으로 해당 테이블의 조합을 만들어 낼 수 있을 것이다.

때문에 소금 값은 보통 해시 알고리즘을 사용해서 완성되는 해시길이로 생성한다.
ex ) SHA256 알고리즘은 32바이트 이기에 소금 값도 랜덤한 32바이트

유저별로 랜덤한 문자열을 생성

랜덤한 문자열을 만들어놓고 그 값을 그대로 재사용 해서는 안된다. 소금 값의 의미가 없어지는데, 예를 들어 하나의 유저의 비밀번호가 뚫렸다고 생각해보자

  • “hello”(비밀번호) + “adad”(소금)

해커는 hello라는 비밀번호에 대해 adad의 소금 값을 알아냈다.

  • 모든 유저의 비밀번호를 하나의 소금값으로 사용
  • 비밀번호가 유출된 유저가 비밀번호 재설정을 했을 때

위의 두가지 상황에서 해커는 소금값을 알기 때문에 쉽게 찾아낼 수 있을 것이다.
위와 같은 이유로 소금을 칠 때는 반드시 두가지 규칙(짧지 않은 소금 값, 재사용 금지)을 따라야 한다.

정리하면 다음과 같다.

  • 소금값(Salt) 생성
    • 사용자 계정을 생성하거나 비밀번호를 변경할 때, 새로운 임의의 랜덤 소금값을 생성합니다. 이 소금값은 절대 재사용하지 않으며, 충분히 길고 다양한 값을 가지도록 해야 한다. 일반적으로 소금값의 길이는 해시 함수의 출력 길이와 동일하게 해야한다.
  • 비밀번호 해싱
    • 사용자가 입력한 비밀번호에 생성된 소금값을 추가(일반적으로 결합)한 후, 그 결합된 값을 해시 함수에 전달하여 해시된 비밀번호를 생성한다.
  • 저장
    • 생성된 소금값과 해시된 비밀번호를 사용자 계정 테이블에 저장합니다. 이때 소금값은 별도로 저장되며, 해시된 비밀번호와 함께 보관.

참조

https://starplatina.tistory.com/entry/비밀번호-해시에-소금치기-바르게-쓰기

레인보우 테이블 : https://en.wikipedia.org/wiki/Rainbow_table

 
반응형

'공부 > CS' 카테고리의 다른 글

Context Switching(문맥 교환)  (0) 2024.09.19
CGI, FastCGI  (1) 2024.07.23
Web Server  (0) 2024.07.22
HTTP통신 과정  (0) 2024.07.01
왜 웹 개발자들은 익스플로러를 싫어하나요?  (0) 2023.04.29
반응형

CGI(Common Gateway Interface)

서버 사이드에서 사용자의 프로그램을 동작하도록 하기 위한 프로토콜

CGI는 웹 서버에서 동적인 클라이언트의 요구에 응답하기 위해 만들어졌다.

CGI의 역할 및 흐름

  • 보통의 경우 클라이언트가 HTTP요청을 했을 때 웹 서버에서는 요청이 백엔드 서버까지 들어가서 프로그램을 실행해야 하는지, 정적인 콘텐츠(html, css, js, image 등)만을 Response할지를 정함
  • 로직 처리 프로그램에 넘겨야 한다면 서버에서 CGI프로토콜로 HTTP요청을 변환하여 백엔드 서버로 넘김
  • 백엔드 서버에서 요청을 처리 후 CGI프로토콜로 서버에 Response 반환
  • 상당히 많은 언어가 이러한 프로토콜(FastCGI API)을 지원 ( 파이썬, PHP, JAVA, Node.js 등 )

FastCGI

기존 CGI의 변형된 버전으로 주요 목적은 웹 서버와 CGI 프로그램 간 통신 시 발생되는 부하를 줄이며, 더 많은 요청을 관리할 수 있게 하는 것이다.

FastCGI 특징

  • 여러 웹 서버들이 FastCGI를 구현하며, 다양한 언어로 만들어진 프로그램을 api호출할 수 있다
  • Nginx같은 웹 서버들은 이 FastCGI통신을 하기 위해 게이트웨이 역할(프로토콜 변환)을 포함한다.

WebServer와의 상관관계

아래의 자료와 함께 Nginx Web Server를 예시로 설명을 하자면

  1. 클라이언트가 웹 서버에 보내는 HTTP 또는 HTTPS 요청
  2. Nginx에서 HTTPS요청이였다면 HTTP로 변환 후 FastCGI프로토콜로 다시 담아 FastCGI API를 지원하는 언어에 요청
  3. 애플리케이션 프로그램은 요청된 로직을 처리 후 FastCGI 프로토콜로 Nginx측에 반환
  4. Nginx는 응답받은 FastCGI 데이터를 HTTPS였다면 HTTPS로, HTTP였다면 HTTP로 반환
  5. 통신 종료

정리

  • 위에서 Nginx는 WS의 정적 페이지 반환, 게이트웨이 역할, FastCGI API와 연계하며 WAS의 역할을 모두 수행
  • CGI, FastCGI는 웹 서버에서 사용 언어의 제약없이 통신에 활용할 수 있는 프로토콜
  • 현 시점에서는 CGI가 아닌 FastCGI로 동적 데이터 처리를 주로 하고있음

출처 : https://ko.wikipedia.org/wiki/FastCGI

반응형

'공부 > CS' 카테고리의 다른 글

Context Switching(문맥 교환)  (0) 2024.09.19
해시 - 솔트치기  (0) 2024.08.25
Web Server  (0) 2024.07.22
HTTP통신 과정  (0) 2024.07.01
왜 웹 개발자들은 익스플로러를 싫어하나요?  (0) 2023.04.29
반응형

WebServer

웹 서버의 주요 기능

  • 정적 콘텐츠 제공
    • HTML, CSS, JavaScript, 이미지파일 등과 같은 정적 파일을 클라이언트에게 제공하는 역할
    • 클라이언트가 URL을 통해 요청한 파일을 디스크에서 찾아 클라이언트에게 반환
  • HTTP 요청 처리
    • 웹 서버는 클라이언트로부터 HTTP 요청을 받고 이에 대한 HTTP 응답을 반환
    • GET, POST, PUT, DELETE등 HTTP메서드를 처리
  • 로드 밸런싱
    • 웹 서버는 여러 대의 서버에 요청을 분산시켜 처리 성능을 향상시키고 서버 과부하를 방지
  • SSL/TLS 암호화
    • 웹 서버는 HTTPS를 통해 클라이언트와의 통신을 암호화하여 데이터의 기밀성과 무결성을 보호

Apach (1995)

  • 기본적으로는 요청을 받기위한 프로세스가 생성되어있고, 프로세스를 미리 만들어두는 Prefork 방식을 사용.
  • 새로운 요청이 들어올 때 미리 만들어 둔 프로세스를 가져다 사용하는 방식
  • 만들어진 프로세스를 모두 사용하고 있다면 추가 프로세스를 만들어 할당
  • 첫 도입 때부터 이용자가 상당히 많았지만 절대적인 컴퓨터를 사용하는 유저가 적어 프로세스 생성 형식이 문제가 없었지만, 컴퓨터의 보급이 많이 이뤄진 후에는 그만큼 많은 요청이 들어왔고 결국 C10K (Connection 10,000) 의 문제가 발생
  • 많은 프로세스로 메모리 부족현상 발생

Nginx

  • 트래픽이 많은 웹사이트의 WAS를 돕는 비동기 이벤트 기반 경량화 웹 서버
  • WS의 역할만을 위해 활용되기도 하고, Reverse Proxy Server로 활용해 WAS의 부하를 줄일 수 있는 로드밸런서 역할도 가능
    • Reverse Proxy Server : 클라이언트가 리버스 프록시 서버에 요청하면 프록시 서버가 배후 서버(실제 응답서버)에서 데이터를 가져오는 형태
  • C10K 문제 해결의 핵심은 비동기 이벤트 기반구조
  • Nginx의 구조
    • 멀티 프로세스(master process)
      • master process는 서버의 설정, worker process를 관리하며 워커 프로세스의 생성, 관리 작업을 수행
    • 싱글 스레드(worker process)
      • 생성된 worker process에서는 각각 독립적으로 이벤트 루프 동작이 실행하며 루프의 큰 틀은 아래와 같음
        • 이벤트 감시
        • 이벤트 큐에 추가 : 이벤트 발생 시 이벤트 큐에 추가
        • 이벤트 처리 : 이벤트 큐에서 이벤트를 꺼내 non-blocking 비동기적으로 여러 요청을 수행
        • 반복

Nginx는 여러 프로세스를 사용하기 때문에 수 천개의 동시 연결을 처리할 수 있다.


반응형

'공부 > CS' 카테고리의 다른 글

해시 - 솔트치기  (0) 2024.08.25
CGI, FastCGI  (1) 2024.07.23
HTTP통신 과정  (0) 2024.07.01
왜 웹 개발자들은 익스플로러를 싫어하나요?  (0) 2023.04.29
HTML, CSS, JavaScript가 뭔가요?  (0) 2023.04.12
반응형

우리가 알고있는 HTTP통신은 OSI 7계층의 응용계층에 속한다. 이 통신을 하기 위해 어떤 동작이 이루어지는지 키워드를 갖고 간단하게 다뤄보자

TCP(Transmission Controll Protocol)

TCP는 클라이언트와 서버간의 데이터 통신을 위해 사용하는 4계층에 속하는 프로토콜이다.
HTTP는 기본적으로 통신을 하기 위해 TCP를 활용해 3-way-handshake 과정을 거쳐 TCP 소켓 연결을 하고 데이터를 전송한다.이후 소켓 연결을 해제할 때는 4-way-handshake 과정을 거쳐 연결을 해제한다.

3-way-handshake

TCP통신은 기본적으로 3방향 핸드셰이크라는 방식으로 네트워크 소켓연결을 시도하는데
SYN → SYN-ACK → ACK 의 순서로 진행된다.

  1. SYN(SYNchronize) : 클라이언트가 TCP SYN FLAG패킷을 서버로 송신
  2. SYN-ACK(Synchronize-ACKnowledgement) : 서버는 SYN을 수신해 클라이언트에게 SYN-ACK를 송신
  3. ACK(ACKnowledge) : 클라이언트에서 SYN-ACK를 수신하면 ACK를 서버에 송신

서버는 위의 과정을 거친 최종ACK를 수신받았을 때 TCP 소켓연결이 설정된다.

4-way-handshake

소켓연결 후 소켓을 끊을 때는 4-way-handshake 과정을 진행한다. 여기서 사용하는 주요 FLAG는 FIN, ACK이 있다.

해당 연결해제 절차는 클라이언트 측과 서버 측 모두 사용 가능하기에 A, B로 설명하자면,

  1. A(FIN) → B
  2. B(ACK) → A
  3. B(FIN) → A
  4. A(ACK) → B

위의 순서를 통해 A와 B의 소켓이 해제되는데 최초 (1)FIN요청을 받은 B는 A에게 (2)ACK신호를 줌과 동시에 연결을 끊는 작업을 시행하고 연결을 종료할 수 있는 준비작업이 완료되면 B가 A에게 최종종료되었다는 (3)FIN FLAG를 넘겨준다. 이를 받은 A는 최종확인 (4)ACK FLAG를 B에게 보냄으로써 소켓은 서로 닫히게 된다.

HTTP 통신

HTTP통신으로 호출하기 위한 흐름은 기본적으로 TCP 소켓 연결을 기본으로 소켓연결이 된 후 Request & Response작업이 진행된다.

때문에 순서를 다시한번 적자면 이렇게 된다

3-way-handshake → Request → Response → 4-way-handshake의 순서로 통신 흐름을 이해할 수 있다.

HTTPS 통신

우리가 평소에 사용하는 사이트들은 모두 HTTP가 아닌 HTTPS를 사용하고있다.
HTTPS는 Http에 S(Secure)가 붙어서 보안을 강화시킨 통신방식인데, 이 통신을 시행하면 중간에 데이터를 가로채가도 데이터는 암호화되어있기에 어떤 데이터를 가로챈건지 알 수 없게 되는 보안프로토콜이다.

이 통신방식은 Secure Sockets Layer(SSL)/Transport Layer Security (TLS) 등으로 불리우는 암호화 프로토콜통신(SSL Handshake, TLS Negotiation)을 HTTP통신의 데이터 교환에 앞서서 시행한다.

SSL Handshake, TLS Negotiation

이 통신을 SSL Handshake/TLS Negotiation이라고도 불리며, 기존의 소켓연결인 3-way-handshake 직후에 시행하는 통신작업인데, 순서는 다음과 같다.

  1. Client → ClientHello → Server
  2. Server → ServerHello → Client
  3. Client → PremasterSecret → Server
  4. Server → PremasterSecret(decrypt) → Client
  5. HTTPS 통신가능

위의 과정을 거쳐 진행되고 전체 진행순서를 총 정리하면

3-way-handshake → SSL Handshake/TLS Negotiation(소켓 연결 완료) → Request → Response → 4-way-handshake(연결 해제)

의 순서가 된다.

출처 : https://sh-safer.tistory.com/146

https://velog.io/@dyunge_100/Network-TCPIP-4계층에-대하여

https://velog.io/@tess/아니-왜-http를-써요-tcp를-쓰지

https://brunch.co.kr/@sangjinkang/38

https://sooolog.dev/HTTP-통신과-TCP-통신-그리고-웹-소켓에-대한-기본-개념-정리/

반응형
반응형

movie

얄코님 유튜브영상

  • 익스플로러는 한동안 독과점을 한 채로 있었기에 국제 웹 표준을 지키지 않았다
  • 때문에 호환이 잘 안된다
반응형
반응형

movie

얄코님 유튜브영상

  • 웹 프로그래밍 필수 html, css, js
반응형
반응형

movie

뇌과학자님 유튜브영상

  • 이해안되면 외워라
  • 외우는게 때로는 정답
반응형

'공부 > CS' 카테고리의 다른 글

왜 웹 개발자들은 익스플로러를 싫어하나요?  (0) 2023.04.29
HTML, CSS, JavaScript가 뭔가요?  (0) 2023.04.12
비동기 프로그래밍이 뭔가요?  (0) 2023.04.09
REST API가 뭔가요?  (0) 2023.04.09
객체지향 디자인패턴 2  (0) 2023.04.09
반응형

movie

얄코님 유튜브영상

  • 비 동기 좀 웃기네 ㅋㅋㅋㅋ
  • 동기 : 순서대로 실행되는 경우 앞의 코드가 끝나야 다음 코드가 실행됨
  • 비동기 : 꼭 순서대로 실행되는게 아님 여러스레드를 통해서 일을 함
  • 특징으로는 콜백함수가 있다.
  • 콜백지옥을 해결하기 위해 promise를 도입 (많이 직관적이다)
반응형
반응형

movie

얄코님 유튜브영상

  • 정보를 주고받는데 있어서 개발자들 사이에서 널리쓰이는 일종의 형식
  • API : 소프트웨어가 다른 소프트웨어로부터 지정된 형식으로 요청 명령을 받을 수 있는 수단
  • REST API : HTTP요청을 보낼 때 어떤 URI에 어떤 메서드를 사용할지 정해둔 규칙
반응형

+ Recent posts