6 분 소요

☀️공지 사항☀️ 해당 게시글은 SK 쉴더스 루키즈, 생성형AI 활용 사이버보안 전문인력 양성과정 을 수업을 듣고 정리한 글입니다. 자세한 교육 정보는 SK 쉴더스 홈페이지 를 확인해주세요.

학습 내용 요약 (25/10/27)

📝 파이썬 기본 문법 및 자료형 총정리

1. 변수와 선언 규칙

주제 핵심 내용 추가 개념
변수 기본 규칙 숫자로 시작 불가. 언더바(_)와 달러 기호($) 허용. 예약어(keyword) 사용 불가. 식별자(Identifier) 규칙: 변수, 함수, 클래스 등을 구분하는 이름. 대소문자를 구분하며 유니코드 문자도 사용 가능하다.
변수 선언 방식 Camel Case (변수/함수, 현업 권장), Pascal Case (클래스), Snake Case (비추천) 동적 타입(Dynamic Typing): 파이썬은 변수 선언 시 타입을 명시할 필요 없이, 값이 할당되는 순간 자동으로 타입이 결정된다.

2. 파이썬 내장 자료형 (Built-In Types) 및 불변성/가변성

파이썬 자료형에서 가장 중요한 개념 중 하나는 **불변성(Immutable)과 가변성(Mutable)**이다.

2.1. 불변형 (Immutable Types)

객체가 생성된 후 내부 값을 변경할 수 없는 자료형이다. 값을 변경하려 하면 새로운 객체가 생성된다.

  • Numeric: int, float
  • Text Sequence: str (문자열)
  • Sequence: tuple
  • Bool: True, False

2.2. 가변형 (Mutable Types)

객체가 생성된 후 내부 값을 변경할 수 있는 자료형이다. 값을 변경해도 동일한 객체를 유지한다.

  • Sequence: list
  • Mapping: dict
  • Set: set


분류 자료형 표현식 인덱싱/슬라이싱 불변성(Immutable) 여부
Numeric int, float   ❌ 불가능 ❌ 불변형 (Immutable)
Text Sequence str (문자열) '', "" ✅ 가능 ❌ 불변형 (Immutable)
Sequence tuple () ✅ 가능 ❌ 불변형 (Immutable)
Sequence list [] ✅ 가능 ✅ 가변형 (Mutable)
Mapping dict (딕셔너리) {} Key로 접근 ✅ 가변형 (Mutable)
Set set (집합) {} ❌ 불가능 ✅ 가변형 (Mutable)

3. Sequence 및 Mapping/Set 심화 활용

자료형 핵심 특징 필수 추가 개념
List 순서 있고, 가변적이다. 배열(Array)과의 차이: List는 다양한 타입의 요소를 저장할 수 있어 배열보다 유연하다.
Tuple 순서 있고, 불변적이다. Packing & Unpacking: a, b = 10, 20과 같이 여러 값을 변수에 동시에 할당하는 기능. 함수에서 여러 값을 반환할 때 유용하다.
Dictionary Key-Value 쌍, 가변적이다. Key의 조건: Key는 불변형(Immutable) 객체만 사용할 수 있다 (str, int, tuple 등). List는 Key로 사용 불가능하다.
Set 순서 없고, 중복 불가, 가변적이다. 빈 Set 생성: empSet = set()을 사용해야 한다. 단순한 {}는 빈 Dictionary를 생성한다.

4. Boolean과 논리 연산자

개념 핵심 내용 추가 개념 (논리 연산자)
Boolean True, False 두 값만 존재한다. AND (and): 두 피연산자가 모두 True일 때만 True.
Trusy/Falsy Falsy 값 (0, '', [], {}) 외에는 모두 Trusy로 간주된다. OR (or): 두 피연산자 중 하나라도 True이면 True.
형 변환 int(True)는 1, int(False)는 0이다. NOT (not): 피연산자의 논리 값을 반전시킨다.

5. 출력 형식 및 로깅 (보안적 관점)

출력 방식 문법 (예시) 보안 및 추가 활용 개념
F-string f"{변수:포맷지정}" 가장 안전하고 권장되는 방법. % 연산자의 Format String Vulnerability (포맷 스트링 취약점) 발생 위험이 없어 보안성이 높다.
repr() 함수 print(repr(data)) 로깅 시 필수 함수. 문자열 내부의 이스케이프 문자(\n, \t)까지 그대로 출력하여, 로그 데이터의 변조 여부나 실제 값을 디버깅하는 데 매우 유용하다.
로그 포맷팅 f"[ALERT] User={...}..." 로그 파싱 용이성: 로그 메시지를 규칙적인 형식(e.g., Key=Value)으로 출력하여, SIEM이나 로그 분석 도구에서 데이터를 쉽게 분리하고 탐지 규칙을 생성할 수 있도록 한다.

고급 활용

1. 출력 함수 (print)의 활용

파이썬의 print() 함수는 sep (Separator, 구분자) 옵션을 사용하여 출력되는 인수들 사이의 기본 공백을 다른 문자로 변경할 수 있다. 이는 데이터를 특정 형식으로 구조화할 때 유용하다.

옵션 설명
sep 여러 인수를 출력할 때, 인수와 인수 사이에 삽입될 문자열을 지정한다.

Python

# sep 옵션을 사용해 전화번호를 하이픈(-)으로 구분
print('010', '1234', '5678', sep="-")

# 이메일 주소를 @으로 결합
print('jslim9413', 'naver.com', sep="@")

2. Sequence 자료형 활용: 인덱싱, 슬라이싱, 언패킹

list, tuple, str과 같은 순서가 있는 자료형은 인덱싱과 슬라이싱을 지원하며, 튜플은 패킹(Packing)과 언패킹(Unpacking) 기능을 제공한다.

A. 슬라이싱 (Slicing) 및 리버스 인덱싱

슬라이싱은 [시작:끝] 형태로, 끝 인덱스는 포함되지 않는다는 점이 중요하다. 리버스 인덱싱은 맨 뒤부터 -1로 시작한다.

Python

keywordList = ['A', 'B', 'C', 'D', 'E', 'F']

# [0:5]는 0부터 4번째 인덱스까지 (총 5개)를 의미한다.
print('slicing - ', keywordList[0:5]) 

# 리버스 인덱싱 -1은 맨 마지막 요소를 가리킨다.
print('리버스 인덱싱 - ', keywordList[-1])

B. 튜플 패킹(Packing)과 언패킹(Unpacking)

튜플은 소괄호(())를 생략하여 값을 할당하는 패킹이 가능하며, 이를 다시 여러 변수로 나누어 할당하는 언패킹을 지원한다. 특히 * 기호는 가변형 언패킹을 위해 사용되며, 나머지 모든 요소를 리스트로 묶어 할당한다.

Python

# 패킹: 소괄호 생략 가능 (Packing)
tupleTemp = "a", "b", "c", "d", "e", "f"

# 언패킹: 원소 개수에 맞춰 할당. *d는 나머지 요소를 리스트로 묶는다.
aa, bb, cc, *d = tupleTemp

print('unpacking - ', aa, bb, cc, *d)		# 언패킹할 때도 *를 붙혀줘야 리스트도 풀린 상태로 출력된다.
# 출력: unpacking - a b c d e f

print('unpacking - ', aa, bb, cc, d)		# 언패킹할 때 *d가 아닌 d만 사용한 경우
# 출력: unpacking - a b c ['d', 'e', 'f']

3. Set 자료형: 집합 연산과 보안 활용

Set은 중복을 허용하지 않고 순서가 없다. 이 특성 덕분에 권한 관리, 데이터 필터링 등 보안 분야에서 효율적인 집합 연산에 활용된다.

A. 주요 집합 연산자 및 XOR 연산

연산자 연산 이름 의미 보안 관점 핵심
| 합집합 (Union) 두 집합의 모든 요소  
& 교집합 (Intersection) 공통 요소  
- 차집합 (Difference) 첫 번째 집합에만 있는 요소  
^ 대칭 차집합 교집합을 제외한 나머지 요소 XOR 연산과 동일. 두 권한 집합의 차이점을 분석하는 데 유용하다.

Python

adminRoles = {"read", "write", "delete", "update"}
userRoles = {"read", "comment"}

print('type - ', type(adminRoles), type(userRoles))

print('합집함(|) - ', adminRoles | userRoles) 
print('교집합(&) - ', adminRoles & userRoles) 
print('차집합(-) - ', adminRoles - userRoles) 
print('대칭차집합(^) - ', adminRoles ^ userRoles) 
# 대칭차집합은 교집합('read')을 제외한 나머지 차이점('write', 'delete', 'update', 'comment')을 보여준다.
# 출력 결과
type -  <class 'set'> <class 'set'>
합집함(|) -  {'read', 'delete', 'update', 'write', 'comment'}
교집합(&) -  {'read'}
차집합(-) -  {'delete', 'update', 'write'}
대칭차집합(^) -  {'write', 'delete', 'update', 'comment'}

B. in, not in 연산자의 효율성

요소의 포함 여부를 확인할 때, 리스트(list)는 풀 스캔(Full Scan) 방식이라 자원 소모가 크지만, Set은 해시 테이블 기반으로 매우 빠른 탐색이 가능하다.

따라서 중복 방지나 빠른 존재 유무 확인에는 Set을 사용하는 것이 거의 필수이다.

Python - in 으로 요소의 포함 여부 확인

fruits = ['apple', 'banana', 'durian', 'orange']
print('data - ', fruits)
print('type - ', type(fruits))

# 리스트에서 in 연산: 리소스 소모가 크다.
print('orange' in fruits) # True
  • set( )을 활용한 중복 방지 예시는 아래 4.에 있다.

4. set( ) 활용 - 중복 로그인 감지

userTokens = set()

# 사용자 정의 함수 만들기
def login(token) :
    if token in userTokens :
        raise ValueError(f"[보안경고] 이미 로그인 중: {token}")
    userTokens.add(token)
    print(f"{token} 로그인 성공")

login('jslim')
login('sk')
login('jslim')

중복 로그인 감지 함수 실행 결과:

  • 처음 jslim와 sk 는 로그인 되었지만, 다시 jslim으로 로그인을 시도할 시 오류가 뜬다.

  • 92610


5. 안전하고 구조화된 출력 형식 (로깅 관점)

A. 출력 형식 정리 예시

가장 권장되는 방식은 f-string이며, 서식 지정 연산자(%)는 보안 취약점 위험 때문에 사용을 지양한다.

로그를 기록할 때 Key=Value 형태로 구조화하는 것은 필수이다. 이는 이벤트 수집 시스템(SIEM)에서 데이터 파싱(Parsing)을 용이하게 하여 탐지 규칙을 생성하기 위함이다.

추가적으로 repr() 함수 사용은 데이터 변조 식별에 도움을 준다.

# 로그로 수집된 데이터 예시
loginUser = {
    'type' : 'guest',
    'ip'   : '192.168.0.2',
    'event': 'LOGIN_SUCCESS'
}

# f-string을 사용해 Key=Value 형태로 구조화된 로그 메시지 생성 (파싱 용이성 확보)
logMsg = f"[ALERT] User={loginUser['type']}, IP={loginUser['ip']}, Event={loginUser['event']}"
print(logMsg)

# 출력 결과: [ALERT] User=guest, IP=192.168.0.2, Event=LOGIN_SUCCESS

6. 다중 라인 출력

""" """ 을 이용하면 다중 라인을 출력할 수 있다.

# 민감 정보는 마스킹 처리해야된다. 마스킹 하는 방법 공부해보자!

query = f"""
select * 
from table 
where id = admin or 1 = 1
"""

print(query)

print()

msg = f"""
[User login Report]
===================
ID     : sk
Time   : 2025-10-27
Status : success
"""

print(msg)

출력 예시:

  • image-20251027203336706

7. (심화) 파이썬으로 민감 정보 마스킹 처리하는 방법

1. 문자열 슬라이싱(Slicing)을 이용한 고정 마스킹

A. 전화번호 마스킹 (가운데 4자리)

Python

def maskPhoneNumber(phoneNumber):
    # 하이픈('-') 제거 (선택 사항)
    phoneNumber = phoneNumber.replace('-', '')
    
    # 앞 3자리와 뒤 4자리는 노출, 중간 4자리는 마스킹
    if len(phoneNumber) == 11:
        # phoneNumber[:3] : 앞 3자리
        # phoneNumber[7:] : 뒤 4자리
        return f"{phoneNumber[:3]}-****-{phoneNumber[7:]}"
    return phoneNumber

# 예시:
# print(maskPhoneNumber("010-1234-5678"))
B. 이메일 주소 마스킹

이메일 주소의 로컬 파트(아이디)와 도메인 파트를 분리하여 처리 후 마스킹 하기

Python

def maskEmail(emailAddress):
    # '@'를 기준으로 로컬 파트와 도메인 파트 분리
    localPart, domainPart = emailAddress.split('@')
    
    # 로컬 파트의 첫 글자를 제외하고 마스킹
    if len(localPart) > 2:
        # 첫 글자 노출 + 나머지 마스킹
        maskedLocalPart = localPart[0] + '*' * (len(localPart) - 1)
        return f"{maskedLocalPart}@{domainPart}"
    
# 예시:
# print(maskEmail("admin@company.co.kr"))

태그: ,

카테고리:

업데이트:

댓글 남기기