네트워크에서 데이터를 주고받기 위한 통신 통로.
네트워크 통신용 인터페이스로, 프로그램이 네트워크로 데이터를 주고받기 위해 OS에 요청할 수 있는 표준화된 통신 엔드포인트(endpoint)이다.
운영체제는 네트워크 프로토콜(TCP/IP 등)을 직접 제어하게 하지 않는다. 대신 소켓이라는 표준 인터페이스를 제공해서 프로그램이 다음을 요청할 수 있게 한다.
즉, 네트워크 통신의 모든 동작은 소켓을 통해서만 이루어지며 다음과 같은 구조로 동작한다.
프로그램 → 소켓 API → OS → 네트워크 스택(TCP/IP) → 외부 네트워크
import socket
# 소켓 생성
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# AF_INET: IPv4 주소 사용
# SOCK_STREAM: TCP 소켓 (연결 지향형)
socket.socket()은 OS의 소켓 시스템 호출을 감싸는 함수다.
운영체제에게 네트워크 통신용 소켓을 하나 생성하라고 요청하는 것이다.
socket.socket(address_family, socket_type)
address_family
네트워크 프로토콜의 주소 체계를 지정한다.
| 값 | 의미 |
|---|---|
AF_INET | IPv4 주소 체계 사용 |
AF_INET6 | IPv6 주소 체계 사용 |
socket_type
전송 계층 프로토콜을 선택한다.
| 값 | 의미 |
|---|---|
SOCK_STREAM | TCP 사용 (연결형, 신뢰 전송) |
SOCK_DGRAM | UDP 사용 (비연결형, 비신뢰 전송) |
포트 번호란 IP 주소와 함께 사용되는 가상 통신 주소이다. 0부터 65535까지의 숫자로 이루어지며, 웹 서버(포트 80)나 보안 웹(포트 443)처럼 특정 서비스에 할당된 번호와 사용자가 임의로 사용할 수 있는 동적 포트 등으로 나뉜다.
| 상태 | 트래픽 흐름 | TCP 응답 | 의미 |
|---|---|---|---|
| Open | SYN → 서버 도착 | SYN/ACK | 서버 프로세스가 해당 포트에서 LISTEN 중 |
| Closed | SYN → 서버 도착 | RST/ACK | 해당 포트를 사용하는 프로세스 없음 |
| Filtered | SYN → 방화벽에서 차단 | 응답 없음 또는 ICMP | 패킷이 OS까지 도달하지 못함 |
특정 컴퓨터의 어떤 포트가 열려있는지 확인하는 과정
즉, 네트워크 장비(서버, PC 등)의 각 포트 번호에 대해 연결을 시도하거나 특정 패킷을 보내고 그 응답을 분석해서 해당 포트가 실제로 서비스 중인지, 차단됐는지, 비어 있는지를 알아내는 작업이다.
❗왜 포트 스캔을 하는가
사용자가 키보드로 입력하는 내용을 기록하는 프로그램.
해킹, 악성코드, 모의해킹, 디버깅 등 다양한 목적에 사용된다.
정보를 읽을 수 없는 형태로 변환하는 것.
기밀성 (Confidentiality) - 중요한 정보를 다른 사람이 읽지 못해야 함
무결성 (Integrity) - 정보가 변경되지 않아야 함
인증 (Authentication) - 정보의 출처 확인
평문 (Plaintext) - 암호화하기 전의 원본 데이터
암호문 (Ciphertext) - 암호화한 후의 데이터. 읽을 수 없는 형태
암호화 키 (Encryption Key) - 암호화와 복호화에 사용하는 데이터. 키 없이 복호화 불가
암호화 알고리즘 - 암호화를 수행하는 방법(예: XOR, AES, RSA)
대칭키 암호화 (Symmetric Encryption)
암호화 키 = 복호화 키
암호화와 복호화 수행 시 동일한 키를 사용
예: XOR, AES
장점: 빠름
단점: 키를 안전하게 전달해야 함
비대칭키 암호화 (Asymmetric Encryption)
암호화 키 ≠ 복호화 키
공개키와 개인키 쌍 사용
예: RSA
장점: 키 전달이 안전함
단점: 느림
| 구분 | 암호화 키 | 설명 | 예 | 장점 | 단점 |
|---|---|---|---|---|---|
| 대칭키 암호화 (Symmetric Encryption) | 암호화 키 = 복호화 키 | 암호화와 복호화 수행 시 동일한 키를 사용 | XOR, AES | 빠름 | 키를 안전하게 전달해야 함 |
| 비대칭키 암호화 (Asymmetric Encryption) | 암호화 키 ≠ 복호화 키 | 공개키와 개인키 쌍 사용 | RSA | 키 전달이 안전함 | 느림 |
자기 역원 - A XOR B XOR B = A
암호화와 복호화가 동일
암호화: 평문 XOR 키 = 암호문
복호화: 암호문 XOR 키 = 평문
평문: 5
키: 3
.
암호화:
5 XOR 3 = 6 (이진수: 101 XOR 011 = 110)
.
복호화:
6 XOR 3 = 5 (이진수: 110 XOR 011 = 101)
평문: "A"
키: "K"
문자 "A"의 ASCII 코드: 65 (이진수: 01000001)
키 "K"의 ASCII 코드: 75 (이진수: 01001011)
.
암호화:
01000001 (A)
X 01001011 (K)
───────────
00001010 (결과: 10)
.
복호화:
00001010 (암호문)
X 01001011 (K)
───────────
01000001 (A - 원본 복구)
❗키가 짧은 경우
평문: "Hello" (5바이트)
키: "AB" (2바이트)
.
평문: H e l l o
키: A B A B A (키를 반복하여 확장)
.
H XOR A = 암호문[0]
e XOR B = 암호문[1]
l XOR A = 암호문[2]
l XOR B = 암호문[3]
o XOR A = 암호문[4]
파일 암호화의 절차
파일 읽기 - 파일을 바이트(byte) 형태로 읽어옴
암호화 키 생성 - 암호화에 사용할 키 생성
XOR 연산 수행 - 파일 데이터와 키를 XOR 연산
암호화된 데이터 저장 - 암호화된 바이트를 파일에 저장