(SK쉴더스)AI 활용한 클라우드 & 보안 전문가 양성 캠프

1차 사후 평가 대비 요약 (네트워크 ~ 파이썬)

hunm719 2024. 12. 13. 09:24

네트워크 & 리눅스

방화벽(Firewall)의 역할

  • 네트워크 트래픽 통제 : 트래픽을 모니터링하고 보안 규칙에 따라 허용하거나 차단
  • 패킷 필터링 : 패킷의 내용을 분석하여 악성 코드나 비정상적 트래픽을 탐지

 

안전한 패스워드

서브넷 마스크 역할

  • IP 네트워크에서 네트워크 주소와 호스트 주소를 구분하는 데 사용되는 비트 마스크

 

리눅스 환경에서 시스템의 IP 주소를 확인하는 방법

  • ifconfig
  • ip addr show
  • ip ad(2번째거 줄인 거)

 

리눅스 환경에서 DNS 서버 정보와 호스트 이름이 들어 있는 파일

  • etc/resolve.conf -> DNS 서버 정보
  • etc/hosts -> 호스트 이름과 매핑 정보

 

OSI 7 Layer에서 주소를 이용하는 계층

  • MAC : 2계층 data link
  • IP : 3계층 Network
  • PORT : 4계층 Transport

왼쪽이 OSI 7Layer / 오른쪽이 TCP/IP

계층 장비 프로토콜
7계층   SMTP, HTTP, POP3
6계층    
5계층   TLS / SSL
4계층 게이트웨이(Gateway), 프록시(Proxy) TCP / UDP
3계층 패킷(Packet), 라우터(Router) IPSec, ICMP, IGMP,
2계층 스위치(Switch), 브릿지(Bridge) CSMA/CD
1계층 허브(Hub), 리피터(Repeater, 신호증폭기)  

 

OSI 7 Layer 에서 중요한 개념

  • 2계층에서 MAC 주소와 CSMA/CD의 관계
    • MAC (Media Access Control)
      • 여러 장치가 동일한 전송 매체를 공유할 때, 누가 언제 데이터를 전송할 지 관리하는 역할
      • 각각의 장치를 식별하기 위해 고유한 MAC 주소를 사용함
    • CSMA/CD (Carrier Sense Multiple Access with Collision Detection)
      • 동시에 여러 장치가 데이터를 전송하려고 할 때 발생하는 충돌을 감지하고 해결하는 방법
        • CSMA : 데이터를 전송하기 전에 전송 매체가 현재 사용 중인지 확인
        • CD : 전송 중 충돌이 발생했을 때 충돌을 감지하고, 전송을 멈추고, 임의이 시간을 기다린 후 재전송
  • 3계층에서 Local과 Remote 개념의 구분 및 이를 활용한 라우팅(Routing)과 최적 경로 결정
    • 로컬(Local) : 같은 네트워크 내에 있는 경우
      • 로컬 네트워크에 있을 경우 라우팅이 필요 없이 직접 통신이 가능하므로 스위치 또는 MAC 주소를 사용해 목적지에 전달됨
    • 원격(Remote) : 다른 네트워크에 있는 경우
      • 라우터가 패킷을 전달해 줄 경로를 찾고 라우팅*을 수행해야함
        • *라우팅(Routing) : 패킷이 출발지에서 목적지까지 도달할 수 있도록 가장 효율적인 경로를 찾고, 패킷을 전송하는 작업
      • 라우팅 테이블**을 참고해 패킷을 올바른 방향으로 보내는 최적 경로(Best Path)를 결정함
        • **라우팅 테이블(Routing Table) : 라우터나 컴퓨터가 네트워크 패킷을 효율적으로 전송할 경로를 결정하기 위해 사용하는 데이터베이스
  • 캡슐화와 역캡슐화
    • 캡슐화(Encapsulation) : 데이터가 송신지에서 전송될 때 각 계층에서 필요한 프로토콜 헤더와 정보를 추가하여 전송 준비를 완료하는 과정으로, 상위 계층에서 하위 계층으로 내려가면서 이루어지며 최종적으로 물리 계층(1계층)에서 전송 가능한 형태로 변환됨
      • 7~5계층 : 데이터를 생성하여 각 계층에서 필요한 포맷팅이나 인코딩을 수행하고 데이터를 전달
      • 4계층 : 데이터에 전송 제어 정보를 추가함(예 : TCP/UDP 헤더)
      • 3계층 : 목적지 IP 주소와 같은 네트워크 주소 정보를 추가해 패킷을 생성
      • 2계층 : MAC 주소와 같은 물리적 네트워크 주소 정보를 포함해 프레임을 생성함
      • 1계층 : 데이터가 전기 신호(Bits) 같은 물리적인 형태로 변환되어 전송
    • 역캡슐화(De-encapsulation) : 데이터가 수신지에서 전달될 때 캡슐화 과정의 역순으로 각 계층에서 헤더 정보를 해석하고 원래의 데이터를 추출하는 과정

 

사설 IP 대역

 

리눅스 명령어

  • mkdir (make directory) : 디렉토리 생성
  • cd (change directory) : 디렉토리 이동
  • chmod (change mode)  : 권한 변경
  • su - (switch user) : 사용자 변경(윈도우 계정 여러 개 만들 수 있는데 그거 바꿀 수 있는 거 처럼)
  • ls (list) : 현재 디렉토리 내의 파일 및 폴더 조회
  • show - ip addr show 아니면 *DB에서는 테이블 조회
  • cat : 내용 전체 다 보는 거
  • touch : 파일 생성
  • ps (process show) : 현재 실행중인 프로세스 보여줌
  • pwd (print working directory) : 현재 내가 있는 디렉토리 위치 알려줌
  • /etc : 리눅스 기본 환경 폴더
    • /etc/passwd : 사용자 정보 저장
    • /etc/shadow : 비밀번호가 해시암호화 되어 저장
  • /bin : 바이너리(실행 파일이 담겨 있는 폴더)
  • /sbin : 시스템 바이너리
  • /mnt : 마운트될 때 생기는 파일이 저장되는 폴더
  • /tmp : 임시 파일 생성될 때 저장되는 폴더
  • /home : 일반 사용자들이 사용할 수 있는 개인용 폴더
  • /root : 루트 사용자의 /home
  • /usr : universal system resources 시스템 프로그램, 라이브러리, 문서 등 포함 (window의 program files 폴더 같은 느낌)
  • /dv : 디바이스 관련 폴더
  • /lib : 라이브러리 모듈 관련 폴더
  • /include : C언어 헤더 파일
  • /boot : 부트 폴더
    • /boot/init
  • /var : 로그나 풀링(pooling)이 저장되는 폴더
    • /var/run/utmp : 로그 폴더 안에 있는 폴더로, 현재 사용자 정보를 저장 (w,who)
    • /var/log/btmp : 실패한 로그인 시도의 로그를 저장 (lastb)
    • /var/log/wtmp : 성공한 로그인 시도의 로그를 저장 (last)

 

기타

  • NAT (Network Address Translation) : 사설 네트워크의 IP 주소공인 네트워크의 IP 주소로 변환하거나 그 반대로 변환하는 기술
    • 보통 라우터나 방화벽에서 수행되며, IP 주소를 절약하고 네트워크 보안을 강화하는 데 사용
    • static NAT : 고정된 공인 IP와 사설 IP를 매핑
      • 1:1 관계
    • Dynamic NAT : 가용한 공인 IP중 하나를 동적으로 매핑
      • N : M 관계
  • NAT + PAT (Port Address Translation) : IP 주소와 포트가 모두 변환되므로 IP 주소 하나로 여러 기기를 동시에 인터넷에 연결할 수 있음
    • PAT는 1:N 관계
  • Tunneling : 네트워크에서 데이터를 다른 프로토콜이나 네트워크를 통해 캡슐화하여 전달하는 기술 
    • VPN을 이용할 때 터널링 기술이 사용됨
    • SSH(원격 로그인) : 터널링 할 때 사용되는 프로토콜
  • VPN (Virtual Private Network) : 인터넷을 통해 안전하고 암호화된 연결을 제공하는 기술, 가상 사설망
  • Encryption : 암호화
    • 대칭키
      • AES : DES 강화판
      • DES
      • seed : 국산, 경량화 알고리즘
      • aria : 국산, 협회+대학에서 개발
      • blowfish
    • 비대칭키(대칭키 교환을 위해 사용)
      • RSA : 소인수분해 기반
      • ECC : 타원을 가지고 그래프 그려서 하는
      • DSA : 서명 전용, 디지털 서명 생성
      • Elgamal(엘가말) : 이산대수 문제를 이용
    • Salt(솔트) : 비밀번호를 해시하기 전에 추가하는 랜덤 데이터, 공격자가 키 원본을 알기 어렵게 하는 용도
    • HTTPS (HTTP over SSL) : 공개키+개인키 복합 사용
    • Diffie-Hellman(디피-헬만)
      • 서로 키가 없어도 교환이 가능(대칭키 교환에 많이 씀)

  • IPSec : IP 프로토콜의 보안을 강화한 것

출처 : 트리플에스 스터디원 장혜림님

클라우드

 AWS 주요 서비스

  • IAM identify and access management : 자격 증명, 접근(권한)관리
  • VPC virtual private cloud : 가상환경 제공
  • EC2 elastic cloud computing : 서버 제공(인스턴스 환경)
  • RDS relational database service : 관계형 db 제공
  • S3 simple storage service : 내구성 좋은 영구저장소
  • Lambda : 서버리스 환경 구성
  • CloudWatch : 모니터링 대시보드 제공

 

클라우드 서비스 모델

  • IaaS Infra as a Service : 인프라만 제공, 예) AWS EC2, Azure, 구글 클라우드 플랫폼, 클라우드 환경 제공해주는 것들
  • PaaS Platform as a Service : 개발 및 배포 환경 제공, 예) Docker, AWS RDS, Amazon Beanstalk, Redhat - openshift, Kubernetes, heroku, aPaaS, IBM Bluemix
  • SaaS Software as a Service : 소프트웨어 제공, 예) Slack(오피스메신저), Office365, git, notion, 구글 시트 등
  • IaC Infrastructure as Code : 인프라를 코드로 만든다! 코드만으로도 서버 생성

 

CNCF (Cloud Native Computing Foundation)

  • 클라우드 네이티브 기술의 채택과 표준화를 촉진하며, 컨테이너, 마이크로서비스, 서버리스 등 클라우드 네이티브 생태계의 성장을 지원하는 글로벌 커뮤니티
  • CNCF 특징 아닌 것 = 모놀리식 monolithic (하나의 서버로 구성) <-> Microservice

 

 

파이썬

문자열, 리스트, 딕셔너리, 튜플, 세트 타입의 변수를 선언하는 방법

  • 문자열 : a = "" or '' (빈 문자열), b = "프문"
  • 리스트 : a = [], b = ["프문"], c = ["김지훈", "슈나쟝"]
  • 딕셔너리 : a = {}, b = {"프문" : "Project Moon"}, c = {"김지훈" : "슈나쟝", "롭토미" : "라오루"}
  • 튜플 : a = (), b = ("프문",), c = ("김지훈", "슈나쟝")
    • 불변(추가,수정,개별삭제x)하고 순서(Order)가 있음 = 인덱스로 원하는 지점을 찍어서 볼 수 있음
  • 세트 : a = set(), b = {"프문"}, c = {"김지훈", "슈나쟝"}
    • 중복 안 되고, 순서가 없음 = 인덱스로 뽑아낼 수 없음

구분 값이 없는 경우 값이 하나인 경우 값이 두 개 이상인 경우
문자열 "" 또는 '' "프문" 변수를 여러 개 사용하거나 리스트 or 튜플 사용
리스트 [] ["프문"] ["김지훈", "슈나쟝"]
딕셔너리 {} {"프문" : "Project Moon"} {"김지훈" : "슈나쟝", "롭토미" : "라오루"}
튜플 () ("프문",) ("김지훈", "슈나쟝")
세트 set() {"프문"} {"김지훈", "슈나쟝"}

 

주석

  • Python = # , ''' ''' or """ """
  • JavaScript = // , /* */
  • JSX = {/* */} 
구분 한 줄 주석 여러 줄 주석
Python # '''('3개) ~ ''' or """("3개) ~ """
JS // /* ~ */
JSX {/ ~ /} 혹은 {/* ~ */}  << 중괄호가 중요

 

문자열 일부 추출

  • yyyymmdd = "20241128" 에서
    • 연도만 추출 : yyyymmdd[0:4] or yyyymmdd[:-4]
    • 월만 추출 : yyyymmdd[4:6] or yyyymmdd[-4:-2] or yyyymmdd[4:-2]
    • 일만 추출 : yyyymmdd[6:] or yyyymmdd[-2:] or yyyymmdd[6:8]
    • 월일만 추출 : yyyymmdd[4:] or yyyymmdd[4:8] or yyyymmdd[-4:]
    • 리버스 : yyyymmdd[::-1] # 8

1 부터 10 까지 순열에서 짝수 또는 홀수만 추출

numbers = list(range(1, 11)) # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11

odds = numbers[0::2] # 인덱스 0 부터 2개 단위로 1, 3, 5, 7, 9, 11
evens = numbers[1::2] # 인덱스 1 부터 2개 단위로 2, 4, 6, 8, 10

리스트 메서드

numbers = [1, 2, 3]
numbers.append(4)         # numbers = [1, 2, 3, 4]
numbers.insert(4,5)       # numbers = [1, 2, 3, 4, 5]
numbers.remove(2)         # numbers = [1, 3, 4, 5] 
 # remove(값)
numbers.pop()             # numbers = [1, 3, 4]
numbers.pop(1)            # numbers = [1, 4]
 # pop(인덱스)

 

 

리액트

리액트 컴포넌트 : UI를 독립적이고 재사용 가능한 코드 조각으로 나눠주는 개념

  • 컴포넌트의 종류
    • 클래스형 컴포넌트 : ES6 클래스 문법으로 정의됨, 상태변수(state)와 라이프사이클 메서드를 기본으로 지원
    • 함수형 컴포넌트 : JS 함수로 정의됨, React Hooks을 사용해 상태 관리와 라이프사이클 메서드를 구현
  • 컴포넌트 특징
    • 재사용성
    • 트리 구조 : 부모 컴포넌트와 자식 컴포넌트의 계층적 구조
    • 단방향 데이터 흐름 : 부모 -> 자식으로 props를 통해 데이터를 전달
  • 기본 구조
    • 부모-자식 컴포넌트
    • props (properties) : 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달하는 방법

state 변수

  • 의미 : 컴포넌트 내부에서 관리되는 데이터, 상태 변경 시 컴포넌트 리렌더링 발생
  • 함수형 컴포넌트에서 사용법 : React Hook 중 하나인 useState 사용
  • 클래스형 컴포넌트에서 사용법 : this.state 속성 사용, setState() 메서드를 통해 상태 변경

props 변수

  • 의미 : 부모 컴포넌트에서 자식 컴포넌트로 전달되는 읽기 전용 데이터(자식은 props 수정 불가), props값 변경 시 컴포넌트 리렌더링 발생
  • 함수형 컴포넌트에서 사용법 : 함수 컴포넌트의 매개변수 props
  • 클래스형 컴포넌트에서 사용법 : this.props 속성 사용

useEffect

  • 컴포넌트가 렌더링 된 후에 비동기 작업이나 외부 데이터 가져오기, 구독 처리, 타이머 설정 등을 처리할 때 사용
useEffect(() => {              # 첫 마운트 되었을 때 실행
	first                  # 의존성 배열의 third라는 값이 변경되었을 때 first 가 재실행
  
	return () => {         # return : 언마운트 되었을 때 실행
	second
  }
}, {thrid})

 

useRef

  • DOM 요소나 값을 기억하는데 사용되는 Hooks
  • 렌더링 없이 값을 지속적으로 저장하거나 DOM을 직접 조작할 때 사용

useMemo

  • 계산 비용이 큰 값을 메모이제이션(memoization) 하여 성능 최적화에 사용

useCallback

  • 함수를 메모이제이션하여 불필요한 함수 재생성을 방지하는 Hooks

React.memo()

  • useMemo와 같은 기능. 컴포넌트 전체를 감싸서 쓸 때 사용.(함수형 클래스형 모두 가능)

React.createRef()

  • useRef와 같은 기능. 태그 안에 넣어서 사용(함수형 클래스형 모두 가능, 대신 클래스에서 쓰려면 this.해야함)

일반적인 생명주기 메서드

  • 호출시점 : 컴포넌트의 생성, 업데이트, 삭제 등
  • 용도 : 컴포넌트의 마운트, 업데이트, 언마운트 등의 제어 및 로직 처리

 + shouldComponentUpdate : render가 실행되기 전에 먼저 강제로 실행되어 렌더링 여부를 결정

 

Context API

  • 부모 컴포넌트에서 전달한 데이터를 중간의 여러 단계를 거치지 않고 필요한 자식 컴포넌트에게 바로 접근할 수 있음

 

기타

HTTP 요청/응답 헤더

# 응답 예시
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 45

{
  "status": "success", "message": "Data received"
}
  • Content-Type : 요청 또는 응답의 본문(body) 데이터가 어떤 타입인지
  • Content-Length : 요청 또는 응답 본문의 바이트 단위 크기가 얼마인지
  • Authorization : 인증 정보를 서버에 제공

요청 메서드

  • GET
  • POST
  • PUT
  • DELETE
  • OPTIONS

OPTIONS에 대한 내용, 사전 요청이 키포인트
서버 응답에서 파란색 체크된 부분이 없어야 안전한 것

curl 주요 옵션

  • -X : 요청 메서드 지정
    • 예) curl -X GET http://example.com
    • 메서드를 명시하지 않으면 기본적으로 GET
  • -H : HTTP 요청 헤더를 설정
    • curl -H "Content-Type: application/json" http:// ~
  • -d : 요청 본문 데이터를 추가(주로 POST 요청에서 사용)
    • curl -X POST -d "name=John&age=30" http:// ~
    • 타입 설정 안 하면 기본값은 application/x-www-form-urlencoded
  • -v : 요청과 응답의 세부 정보를 포함한 디버깅 정보를 표시
    • curl -v http:// ~
      • GET / HTTP/1.1
        > Host: example.com
        > User-Agent: curl/7.68.0
        < HTTP/1.1 200 OK
        < Content-Type: text/html

데이터베이스 정규화

  • 정규화 : 무결성을 유지하려고 함
  • 1정규화 : 모든 column을 원자화(값이 하나인 상태)
  • 2정규화 : 완전 함수 종속성을 만족(복합 키가 있을 때, 복합 키의 모든 부분이 다른 컬럼을 특정지을 수 있어야 함 )
  • 3정규화 : 이행종속이 없어야 함(a -> b, b -> c 이면 a -> c 관계가 성립해야함. 불필요한 중간 관계 제거)
  • bncf정규화 : 모든 결정자(모든 후보키)가 키여야 함
  • 4정규화 : 다치종속성이 없어야 함
  • 5정규화 : 조인종속성이 없어야 함

RESTful API 를 위한 설계 원칙

  • Client-Server - 클라이언트와 서버로 분리되어야 하며 서로 의존성이 없어야 한다.
  • Stateless(무상태성) - 상태 정보를 따로 저장하지 않으며, 이용자가 누구인지 혹은 어디서 접근하는지와 관계없이 결과가 무조건 동일해야 한다. 따라서 REST API는 필연적으로 오픈될 수밖에 없다.
  • Cache - HTTP를 비롯한 네트워크 프로토콜에서 제공하는 캐싱 기능을 적용할 수 있어야 한다.
  • Uniform Interface - 데이터가 표준 형식으로 전송될 수 있도록 구성 요소 간 통합 인터페이스를 사용한다. REST API 태반이 HTTP를 사용하기 때문에 HTTP 표준인 URL과 응답 코드, Request-Response Method 등을 사용한다.
  • Layered System - API는 REST 조건을 만족하면 필연적으로 오픈될 수밖에 없기 때문에, 요청된 정보를 검색하는 데 있어 계층 구조로 분리되어야 한다.
  • Self-descriptiveness - API를 통해 전송되는 내용은 별도 문서 없이 쉽게 이해할 수 있도록 자체 표현 구조를 지녀야 한다. 마찬가지로 웹 표준인 JSON과 XML이 절찬리에 사용 중이다.

JSON

  • 데이터 저장 및 교환 시 널리 사용되는 경량 데이터 포맷

XML (eXtensible Markup Language)

  • 데이터 저장 및 교환을 위한 마크업 언어