학습의 발단

  • EC2 인스턴스의 vcpu가 2개 일 때 Nginx가 코어를 하나만 사용하여 자원이 낭비되는 사례를 접함
  • Celery worker를 독립된 인스턴스에 구축할지, 같은 인스턴스에 구축할 지 고민하다 만약 코어가 남는다면 그 코어를 활용하는 방안에 대하여 리서치 시작

리서치 시작

  • 사용중인 인스턴스는 t3.large 인스턴스 였는데, 스펙상 물리적 코어가 1개라는 것을 알고, 실제 사용 가능한 코어가 한개 뿐이라는 생각을 했지만, 이는 가상 cpu 개수가 2이기 때문에 논리적으로 2개의 코어를 사용할 수 있었다
  • Apache Bench를 활용하여 stress 테스트 진행

 

리서치 결과

  • nginx 설정(worker_processes auto*;*)으로로 인하여 worker는 인스턴스의 코어 수에 따라 생성됨
  • 코어 수와 worker_processes 값이 같다면, Nginx는 각 프로세스를 서로 다른 코어에 할당
  • Apache Bench를 활용하여 10초를 대기하는 api를 동시에 100개 총 10번 반복 테스트 진행
  • htop으로 확인한 결과 두 코어 모두 사용량이 증가하는 것을 확인

결론

운영 서버는 api 요청을 두 코어를 모두 병렬적으로 사용하여 처리하는 것을 확인

CSRF 토큰이란?

Django에서 CSRF(Cross-Site Request Forgery) 공격을 방지하기 위해 CSRF 토큰을 사용합니다. CSRF 공격은 인증된 사용자의 브라우저를 악의적으로 이용하여, 해당 사용자가 원하지 않는 요청을 서버에 보내는 공격입니다. CSRF 토큰은 이러한 공격을 방지하기 위해 사용되는 보안 메커니즘 중 하나입니다.

 

Django에서의 CSRF

Django에는 애플리케이션의 요청과 응답을 처리하는데 사용되는 다양한 middleware가 있다. 그중 csrf 공격을 막기위한 middleware는 "django.middleware.csrf.CsrfViewMiddleware"로 구현 되어있다. 이 미들웨어는 모든 POST 요청에 대하여 CSRF 토큰을 요청하고, 토큰이 없는 경우에는 요청을 실패 처리한다.

 

문제상황

DRF를 활용하여 API를 개발하고 테스트하는 과정에서 Chrome 브라우저에서 해당 api를 Front End를 붙여 테스트 하였을 때 CSRF토큰이 없어 403에러가 지속적으로 발생하는 문제가 발생했다.

 

트러블 슈팅

1. 해당 API에 적용된 인증 클래스들에 어떤것이 있는지 확인 -> 어떠한 인증 클래스도 적용되지 않았음

2. Settings.py에 "django.middleware.csrf.CsrfViewMiddleware"가 설정되어 있는지 확인 -> 설정되어있지 않음

3. 해당 api에 @csrf_exempt() decorator를 사용하여 csrf token 인증 무효화 -> 계속 csrf token missing 에러 발생

4. DRF의 DEFAULT_AUTHENTICATION_CLASS에 아무것도 없을 때 default로 다른 인증이 적용되지 않은 api에 대하여 Session 인증을 적용한다는 사실 확인 -> 브라우저에서 처음 서버와 통신할때 CSRF 토큰을 발급 받고 Session 인증시에 CSRF 토큰 유무를 확인한다는 것을 새롭게 알게됨

5.  DEFAULT_AUTHENTICATION_CLASS에 빈 리스트를 넣어 모든 api에 대한 설정을 바꾸는데 무리가 있다는 것을 고려하여 기존 settings.py를 수정하지 않음

6. Chrome이 아닌 다른 브라우저에서는 잘 작동하는 것을 확인 -> Chrome 브라우저에서 https 인증서에 문제가 있는 도메인에 대해서는 csrf토큰이 담기는 쿠키가 저장되지 않는다는 것을 알게됨

7. 사이트 설정을 변경하여 쿠키를 잘 저장하도록 한 후 문제해결

 

 

Memory 관련 용어

  • 논리적 주소(Logical Address):
    • 프로세스가 메모리에 적재되기 위한 독자적인 주소 공간인 논리적 주소가 생성 됩니다.
    • 논리적 주소는 각 프로세스마다 독립적으로 할당 되며 0번지 부터 시작됩니다.
  • 물리적 주소(Pysical address)
    • 물리적으로 프로세스가 실제 메모리에 적재되는 위치를 말합니다.
  • 주소 바인딩(address binding)
    • CPU가 기계어 명령을 수행하기 위해 프로세스의 논리적 주소가 실제 물리적 메모리의 어느 위치에 매핑되는지 확인하는 과정
  • 메모리 단편화
    • 내부 단편화 : 프로세스가 필요한 공간 보다 더 많은 메모리가 할당되어 메모리가 낭비되는 상황
    • 외부 단편화 : 메모리 중간중간에 사용하지 않는 공간이 생겨서 더이상 사용할 수 없는 상황

 

Q1. Paging이란 무엇인가요?

 

paging 기법은 process의 메모리 공간을 동일한 크기의 page 단위로 나누어 물리적 메모리의 서로 다른 위치에 page들을 저장하는 메모리 관리 기법입니다. paging 기법에서는 물리적 메모리를 page와 같은 크기의 frame으로 미리 나누어둡니다.

 

  • Paging 기법에서는 주소 바인딩을 위해 모든 프로세스가 각각의 주소 변환을 위한 page table을 갖습니다.

 

꼬리 질문 1 : Paging 기법 사용시 발생할 수 있는 메모리 단편화 문제에 대해 설명하시오.

paging기법에서는 process의 논리적 주소 공간과 물리적 메모리가 같은 크기의 page 단위로 나누어지기 때문에 외부 단편화 문제는 발생하지 않습니다.
하지만 process 주소 공간의 크기가 page 크기의 배수라는 보장이 없기 때문에 프로세스의 주소 공간 중 마지막에 위치한 page에서는 내부 단편화 문제가 발생할 가능성이 있습니다.

 

 

Q2. Segmentation에 대해서 설명해주세요.

 

Segmentation 기법은 process가 할당받은 메모리 공간을 논리적 의미 단위(segment)로 나누어 연속되지 않는 물리 메모리 공간에 할당될 수 있도록 하는 메모리 관리 기법입니다.
일반적으로 메모리 영역을 Code, Data, Heap, Stack 등의 기능 단위로 segment를 정의하는 경우가 많습니다.
Segmentation 기법에서는 주소 바인딩을 위해 모든 프로세스가 각각의 주소 변환을 위한 segmentation table을 갖습니다.

 

 

꼬리 질문 1 : Segmentation의 메모리 단편화 문제에 대해 설명하시오.

Segmentation 기법에서는 Segment의 크기만큼 메모리를 할당하므로 내부 단편화 문제는 발생하지 않습니다.
하지만 서로 다른 크기의 segment들이 메모리에 적재되고 제거되는 일이 반복되면 외부 단편화 문제가 발생할 가능성이 있습니다.

 

꼬리 질문 2 : Segmentation과 paging의 차이는 뭔가요?

Paging은 일정한 크기의 단위로 나누어 할당을 하는데 반해
Segmentation 기법에서는 code, data, heap, stack등의 기능단위로 물리 메모리를 할당하는 기법입니다.
paging의 경우 내부 단편화의 문제가 발생할 수 있는데, 이에 반해
segmentation은 외부 단편화의 문제가 발생할 수 있습니다.

 

꼬리 질문 3 : Paged segmentation 기법에 대해 설명하시오.

paged sementation이란 segmentation을 기본으로 하되 이를 다시 동일한 크기의 page로 나누어 물리 메모리에 할당하는 메모리 관리 기법입니다. 즉, 프로그램을 의미하는 단위의 segment로 나누고 개별 segment의 크기를 page의 배수가 되도록 하는 방법입니다.

이를 통해 segmentation 기법에서 발생하는 외부 단편화 문제를 해결함과 동시에 segment 단위로 processrksdml rhddbsk process내의 접근 권한 보호가 이루어지도록 하여 paging 기법의 단점을 해결 합니다.

 

Q3. 가상 메모리에 대해서 설명해주세요

 

가상메모리(virtual memory)는 실제의 물리 메모리 개념과 개발자 입장의 논리 메모리 개념을 분리한 것입니다. 이렇게 함으로써 개발자가 메모리 크기에 관련한 문제를 염려할 필요 없이 쉽게 프로그램을 작성할 수 있게 해줍니다.
운영체제는 가상 메모리 기법을 통해 프로그램의 논리적 주소 영역에서 필요한 부분만 물리적 메모리에 적재하고 직접적으로 필요하지 않은 메모리 공간은 디스크(Swap 영역)에 저장하게 됩니다.

 

요구 페이징(demend paging)

당장 사용될 주소 공간을 page단위로 메모리에 적재하는 방법을 요구 페이징(demend paging)이라고 합니다. 요구 페이징 기법에서는 특정 page에 대해 cpu의 요청이 들어온 후에 해당 page를 메모리에 적재합니다. 당장 실행에 필요한 page만을 메모리에 적재하기 때문에 메모리 사용량이 감소하고 프로세스 전체를 메모리에 적재하는 입출력 오버헤드도 감소하는 장점이 있습니다.

요구 페이징 기법에서는 유효/무효 비트(valid/invalid bit)를 두어 page가 메모리에 존재하는지 표시하게 됩니다.

 

Page Fault

CPU가 무효 비트로 표시된 page에 엑세스하는 상황을 page fault라고 합니다.

CPU가 무효 page에 접근하면 주소 변환을 담당하는 하드웨어인 MMU가 page fault trap을 발생시키게 되고 다음과 같은 순서로 page fault를 처리하게 됩니다.

1. CPU가 페이지 N을 참조

2. Page table에서 페이지 N이 무효 상태임을 확인

3. MMU에서 Page fault trap이 발생

4. 디스크에서 페이지 N을 빈프레임에 적재하고 page table을 업데이트합니다. (invalid -> valid)

 

Page 교체 알고리즘

page fault가 발생하면 요청된 page를 디스크에서 메모리로 가져옵니다. 이때 물리적 메모리에 공간이 부족할 수 있습니다. 그럴 경우에는 메모리에 올라와있는 page를 디스크로 옮겨서 메모리 공간을 확보해야 합니다. 이것을 페이지 교체(page replacement)라고 하고 어떤 page를 교체할 것이냐를 결정하는 알고리즘이 page교체 알고리즘입니다.

 

 

'CS 기술면접 준비' 카테고리의 다른 글

서버 인증 방식(쿠키, 세션, 토큰)  (0) 2023.01.30
Queue & Stack  (0) 2023.01.27
Array & Linked List  (0) 2023.01.26

Hash Table  이란?

Hash table은 효율적인 탐색을 위한 자료구조로써 key-value쌍의 데이터를 입력받습니다. Hash function h에 key값을 입력으로 넣어 얻은 해시값을 h(k)를 위치로 지정하여 key-value 데이터 쌍을 저장합니다. 저장,삭제, 검색의 시간복잡도는 모두 O(1)입니다.

 

Collision

충돌을 피하는 방법

  1. Open addressing - 미리 정한 규칙에 따라 비어있는 slot 찾기
    • Linear Probing - 일정한 값만큼(+1,+2,+3,...) 건너 뛰어 비어있는 slot에 저장
    • Quadratic Probing - 제곱수(+1,+4,+9,...)로 건너 뛰어 비어 있는 slot에 저장
    • Double Hashing - 위 두 방법은 이동 폭이 일정하기 때문에 클러스터링 문제가 발생할 수 있어서 해싱함수를 2개를 사용하는 방식. 하나의 해시는 최초 해시값을 얻을 때 사용하고, 다른 하나의 해시는 충돌이 일어날 때 탐사 이동폭을 얻기위해 사용.
  2. Separate Chaining
    • Linked list 또는 Tree를 이용하여 collision 해결
    • 삽입- O(1)
    • 검색과 삭제는 기본적으로 O(1)이지만 최악의 경우 O(n)도 가능
    • BST를 활용하면 최악의 경우를 O(logn)으로 낮출 수 있다.

코딩테스트 활용

  • Python의 경우 Dictionary 자료형 활용
  • Hash Table은 메모리를 활용하여 시간복잡도를 줄일 때 사용
  • Dictionary의 "key in {}"를 잘 사용하여 시간복잡도를 줄여보자

 

예제 문제

 

def longestConsecutive(self, nums: list [int]) -> int:
    longest = 0
    dictionary = {}
    for n in nums:
        dictionary[n] = True


    for n in dictionary:
        cnt = 1
        target = n + 1
        while target in dictionary:
            cnt += 1
            target += 1
            longest = max(longest, cnt)

    return longest

 

HTTP

  • 인터넷상에서 정보를 주고받을 수 있는 프로토콜
  • 클라이언트와 서버 사이에 요청/응답을 위한 규칙
  • 주로 일반 텍스트로 이루어진 HTML 문서를 주고받는데에 사용

 

SSL/TLS

  • 데이터를 안전하게 전송하기 위한 인터넷 암호화 통신 프로토콜
  • 전자상거래의 보안을 위해 넷스케이프에서 처음 만듦
  • SSL을 표준화하여 만든것이 TLS
  • SSL/TLS로 함께 묶어 분류

 

HTTPS

  • HTTP의 보안이 강화된 버전
  • SSL/TLS 프로토콜로 세션 데이터 암호화

'AWS' 카테고리의 다른 글

트래픽과 대역폭  (0) 2023.02.09
AWS 리소스 네이밍 컨벤션  (0) 2023.02.09
AWS 서버 인프라의 확장 과정  (0) 2023.02.09
AWS Well-Architecture Framework  (0) 2023.02.09
AWS Developer Associate Quiz - IAM  (0) 2023.02.01

트래픽이란?

트래픽은 서버를 통해 사용자에게 전달된 데이터의 양을 말합니다.
단위는 일반적으로 바이트단위로 (KBytes, MegaBytes, GigaBytes 등등) 표현합니다.
트래픽 = 용량 * 사용자 수 * 개수 
ex) 4GB 영화 * 10명 * 10개 = 400GB

 

네트워크 대역폭이란?

대역폭은 초당 처리할 수 있는 데이터의 양 입니다.
대역폭 단위는 bps로 bit per second 즉, 초당 bit단위의 데이터 처리량을 말합니다.
대역폭 = (용량 * 사용자수 * 8) / 처리 시간 = bps 
참고로 8을 곱하는 이유는 Bytes에서 bit로 변환하기 위함입니다.​

 

예상 트래픽과 대역폭 예측하기

https://kim-dragon.tistory.com/99

'AWS' 카테고리의 다른 글

HTTP/SSL/TLS 개념  (0) 2023.02.09
AWS 리소스 네이밍 컨벤션  (0) 2023.02.09
AWS 서버 인프라의 확장 과정  (0) 2023.02.09
AWS Well-Architecture Framework  (0) 2023.02.09
AWS Developer Associate Quiz - IAM  (0) 2023.02.01

네이밍 컨벤션이란?

식별자를 만들 때 가독성이 좋은 단어를 선택하기 위해 정해 놓은 규칙

 

네이밍 표현 기법

  • 카멜케이스(camelCaseStyle)
  • 스네이크(snake_case_style)
  • 케밥(kebab-case-sytle)
  • 파스칼(PascalCaseStyle)

 

AWS에서 Name은?

  • 리소스 태그의 Name
    • vpc, ec2, subnet등 모든 리소스
    • 상시 변경 가능
  • 리소스 자체의 Name
    • ELB, RDS, Elasticache등
    • 변경 불가

 

네이밍 컨벤션 예시

 

'AWS' 카테고리의 다른 글

HTTP/SSL/TLS 개념  (0) 2023.02.09
트래픽과 대역폭  (0) 2023.02.09
AWS 서버 인프라의 확장 과정  (0) 2023.02.09
AWS Well-Architecture Framework  (0) 2023.02.09
AWS Developer Associate Quiz - IAM  (0) 2023.02.01

첫번째

 

두번째

 

세번째

 

네번째

 

다섯 번째

 

여섯 번째

 

일곱 번째

 

여덟 번째

아홉 번째

'AWS' 카테고리의 다른 글

트래픽과 대역폭  (0) 2023.02.09
AWS 리소스 네이밍 컨벤션  (0) 2023.02.09
AWS Well-Architecture Framework  (0) 2023.02.09
AWS Developer Associate Quiz - IAM  (0) 2023.02.01
AWS 기초 다지기 - Bastion Host, NAT Gateway  (0) 2023.01.26

+ Recent posts