12월 21, 2025
30 분 읽기

주니어 보안 엔지니어 면접 질문: 완벽 가이드

interview
career-advice
job-search
entry-level
주니어 보안 엔지니어 면접 질문: 완벽 가이드
MB

Milad Bonakdar

작성자

CIA 트라이어드, OWASP Top 10, 암호화, 방화벽 및 보안 모범 사례를 다루는 포괄적인 면접 질문을 통해 주니어 보안 엔지니어 역할에 필요한 핵심 사이버 보안 기초를 마스터하세요.


소개

보안 엔지니어는 보안 제어 구현, 시스템 모니터링, 사고 대응을 통해 조직을 사이버 위협으로부터 보호합니다. 주니어 보안 엔지니어로서 보안 원칙, 일반적인 취약점, 방어 기술에 대한 기본적인 지식이 필요합니다.

본 가이드는 핵심 보안 개념과 실무 기술에 중점을 두어 주니어 보안 엔지니어를 위한 필수 면접 질문을 다룹니다.


보안 기본 사항

1. CIA 트라이어드를 설명하십시오.

답변: CIA 트라이어드는 정보 보안의 기초입니다.

기밀성(Confidentiality):

  • 권한이 있는 사용자만 데이터에 접근할 수 있습니다.
  • 달성 방법: 암호화, 접근 제어, 인증

무결성(Integrity):

  • 데이터가 정확하고 수정되지 않은 상태로 유지됩니다.
  • 달성 방법: 해싱, 디지털 서명, 체크섬

가용성(Availability):

  • 필요할 때 시스템과 데이터에 접근할 수 있습니다.
  • 달성 방법: 이중화, 백업, DDoS 방어
Loading diagram...

위반 사례:

  • 기밀성: 고객 정보를 노출하는 데이터 유출
  • 무결성: 공격자가 재무 기록을 수정
  • 가용성: DDoS 공격으로 웹사이트 다운

희소성: 매우 흔함 난이도: 쉬움


OWASP Top 10

2. OWASP Top 10에서 세 가지 항목을 들고 설명하십시오.

답변: OWASP Top 10은 가장 중요한 웹 애플리케이션 보안 위험 목록입니다.

1. 주입(SQL Injection): 공격자가 악성 코드를 쿼리에 삽입합니다.

# 취약한 코드
username = request.GET['username']
query = f"SELECT * FROM users WHERE username = '{username}'"
# 공격: username = "admin' OR '1'='1"

# 안전한 코드 (매개변수화된 쿼리)
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))

2. 손상된 접근 통제: 사용자가 접근해서는 안 되는 리소스에 접근할 수 있습니다.

# 취약: 인증 확인 없음
@app.route('/admin/users/<user_id>')
def get_user(user_id):
    return User.query.get(user_id)

# 안전: 인증 확인
@app.route('/admin/users/<user_id>')
@require_admin
def get_user(user_id):
    if not current_user.is_admin:
        abort(403)
    return User.query.get(user_id)

3. 크로스 사이트 스크립팅 (XSS): 공격자가 악성 스크립트를 웹 페이지에 삽입합니다.

<!-- 취약 -->
<div>Welcome, {{ username }}</div>

<!-- 공격 -->
username = "<script>alert('XSS')</script>"

<!-- 안전 (출력 이스케이프) -->
<div>Welcome, {{ username | escape }}</div>

희소성: 매우 흔함 난이도: 중간


3. 취약점 관리를 어떻게 수행합니까?

답변: 취약점 관리는 보안 취약점을 식별, 평가 및 수정하는 지속적인 프로세스입니다.

프로세스:

Loading diagram...

취약점 스캔:

# Nmap 취약점 스캔
nmap --script vuln 192.168.1.100

# OpenVAS 스캔
openvas-start
# 웹 인터페이스 접근: https://localhost:9392

# Nessus 스캔 (상업용)
# 웹 인터페이스를 통해 구성

Nessus 예제:

# Nessus 스캔 자동화
import requests
import time

class NessusScanner:
    def __init__(self, url, access_key, secret_key):
        self.url = url
        self.headers = {
            'X-ApiKeys': f'accessKey={access_key}; secretKey={secret_key}'
        }
    
    def create_scan(self, name, targets):
        data = {
            'uuid': 'template-uuid',  # Basic Network Scan
            'settings': {
                'name': name,
                'text_targets': targets
            }
        }
        response = requests.post(
            f'{self.url}/scans',
            headers=self.headers,
            json=data,
            verify=False
        )
        return response.json()['scan']['id']
    
    def launch_scan(self, scan_id):
        requests.post(
            f'{self.url}/scans/{scan_id}/launch',
            headers=self.headers,
            verify=False
        )
    
    def get_results(self, scan_id):
        response = requests.get(
            f'{self.url}/scans/{scan_id}',
            headers=self.headers,
            verify=False
        )
        return response.json()

# 사용 예시
scanner = NessusScanner('https://nessus:8834', 'access_key', 'secret_key')
scan_id = scanner.create_scan('Weekly Scan', '192.168.1.0/24')
scanner.launch_scan(scan_id)

패치 관리:

# Linux 패치 관리
# Ubuntu/Debian
sudo apt update
sudo apt list --upgradable
sudo apt upgrade -y

# CentOS/RHEL
sudo yum check-update
sudo yum update -y

# 자동 패치
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

우선 순위 지정 매트릭스:

CVSS 점수악용 가능성자산 중요도우선 순위
심각 (9-10)공개된 익스플로잇프로덕션P1 (즉시)
높음 (7-8.9)PoC 사용 가능프로덕션P2 (1주)
중간 (4-6.9)익스플로잇 없음내부P3 (1개월)
낮음 (0-3.9)익스플로잇 없음개발/테스트P4 (다음 주기)

수정 추적:

# 취약점 추적
class VulnerabilityTracker:
    def __init__(self):
        self.vulnerabilities = []
    
    def add_vulnerability(self, vuln):
        self.vulnerabilities.append({
            'id': vuln['id'],
            'severity': vuln['severity'],
            'asset': vuln['asset'],
            'status': 'open',
            'discovered': datetime.now(),
            'sla_deadline': self.calculate_sla(vuln['severity'])
        })
    
    def calculate_sla(self, severity):
        sla_days = {
            'critical': 7,
            'high': 30,
            'medium': 90,
            'low': 180
        }
        return datetime.now() + timedelta(days=sla_days[severity])
    
    def get_overdue(self):
        return [v for v in self.vulnerabilities 
                if v['status'] == 'open' and 
                datetime.now() > v['sla_deadline']]

희소성: 흔함 난이도: 쉬움-중간


암호화 기본 사항

4. 대칭키 암호화와 비대칭키 암호화의 차이점은 무엇입니까?

답변:

대칭키 암호화:

  • 암호화와 복호화에 동일한 키를 사용합니다.
  • 빠릅니다.
  • 예시: AES, DES, 3DES

비대칭키 암호화:

  • 공개키로 암호화하고 개인키로 복호화합니다.
  • 더 느립니다.
  • 예시: RSA, ECC
# 대칭키 암호화 (AES)
from cryptography.fernet import Fernet

# 키 생성
key = Fernet.generate_key()
cipher = Fernet(key)

# 암호화
encrypted = cipher.encrypt(b"Secret message")

# 복호화
decrypted = cipher.decrypt(encrypted)

# 비대칭키 암호화 (RSA)
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

# 키 쌍 생성
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)
public_key = private_key.public_key()

# 공개키로 암호화, 개인키로 복호화

사용 사례:

  • 대칭키: 대량 데이터 암호화 (파일, 데이터베이스)
  • 비대칭키: 키 교환, 디지털 서명, SSL/TLS

희소성: 매우 흔함 난이도: 쉬움-중간


5. SSL/TLS는 어떻게 작동하며 인증서는 어떻게 관리합니까?

답변: SSL/TLS는 클라이언트와 서버 간 전송 중인 데이터를 암호화합니다.

TLS 핸드셰이크:

Loading diagram...

작동 방식:

  1. Client Hello: 클라이언트가 지원하는 암호화 스위트 전송
  2. Server Hello: 서버가 암호화 방식을 선택하고 인증서 전송
  3. 인증서 확인: 클라이언트가 인증서 체인 유효성 검사
  4. 키 교환: 공유 비밀 키 설정
  5. 암호화된 통신: 대칭키 암호화 사용

인증서 구성 요소:

# 인증서 세부 정보 보기
openssl x509 -in certificate.crt -text -noout

# 인증서 내용:
# - 제목 (도메인 이름)
# - 발급자 (CA)
# - 유효 기간
# - 공개키
# - 서명

인증서 관리:

CSR(인증서 서명 요청) 생성:

# 개인 키 생성
openssl genrsa -out private.key 2048

# CSR 생성
openssl req -new -key private.key -out request.csr

# CSR 보기
openssl req -text -noout -verify -in request.csr

자체 서명 인증서 (테스트):

# 자체 서명 인증서 생성
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

# 서버용으로 결합
cat cert.pem key.pem > server.pem

인증서 설치:

# Nginx
server {
    listen 443 ssl;
    server_name example.com;
    
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
}

# Apache
<VirtualHost *:443>
    ServerName example.com
    
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/cert.pem
    SSLCertificateKeyFile /etc/apache2/ssl/key.pem
    SSLCertificateChainFile /etc/apache2/ssl/chain.pem
    
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite HIGH:!aNULL:!MD5
</VirtualHost>

일반적인 잘못된 구성:

1. 취약한 프로토콜:

# 나쁨: SSLv3, TLSv1.0 허용
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;

# 좋음: 최신 TLS만 사용
ssl_protocols TLSv1.2 TLSv1.3;

2. 취약한 암호화:

# SSL 구성 테스트
sslscan example.com
nmap --script ssl-enum-ciphers -p 443 example.com

# 또는 온라인 도구 사용
# https://www.ssllabs.com/ssltest/

3. 만료된 인증서:

# 인증서 만료 확인
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>/dev/null | \
    openssl x509 -noout -dates

# 만료 모니터링
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | \
    openssl x509 -noout -enddate

인증서 자동화 (Let's Encrypt):

# certbot 설치
sudo apt install certbot python3-certbot-nginx

# 인증서 획득
sudo certbot --nginx -d example.com -d www.example.com

# 자동 갱신 (cron)
0 0 * * * certbot renew --quiet

문제 해결:

# TLS 연결 테스트
openssl s_client -connect example.com:443 -servername example.com

# 인증서 체인 확인
openssl verify -CAfile ca-bundle.crt certificate.crt

# 인증서가 개인 키와 일치하는지 확인
openssl x509 -noout -modulus -in cert.pem | openssl md5
openssl rsa -noout -modulus -in key.pem | openssl md5
# 해시가 일치해야 함

희소성: 흔함 난이도: 중간


방화벽

6. 상태 저장 방화벽과 상태 비저장 방화벽의 차이점을 설명하십시오.

답변:

상태 비저장 방화벽:

  • 각 패킷을 독립적으로 검사합니다.
  • 연결 추적 없음
  • 더 빠르지만 보안성이 떨어집니다.
  • 예시: 기본 패킷 필터

상태 저장 방화벽:

  • 연결 상태를 추적합니다.
  • 이전 패킷을 기억합니다.
  • 더 안전합니다.
  • 예시: 최신 방화벽
# iptables (상태 저장)
# 설정된 연결 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 새 SSH 연결 허용
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

# 나머지 모두 삭제
iptables -A INPUT -j DROP

연결 상태:

  • NEW: 연결의 첫 번째 패킷
  • ESTABLISHED: 기존 연결의 일부
  • RELATED: 기존 연결과 관련됨
  • INVALID: 어떤 상태와도 일치하지 않음

희소성: 흔함 난이도: 중간


SIEM

7. SIEM이란 무엇이며 왜 중요합니까?

답변: **SIEM (보안 정보 및 이벤트 관리)**은 로그 수집 및 분석을 중앙 집중화합니다.

핵심 기능:

  1. 로그 수집: 여러 소스에서 로그 수집
  2. 정규화: 로그 형식 표준화
  3. 상관 관계 분석: 패턴 및 관계 식별
  4. 경고: 의심스러운 활동에 대한 알림
  5. 보고: 규정 준수 및 포렌식
Loading diagram...

사용 사례:

  • 무차별 대입 공격 감지
  • 데이터 유출 식별
  • 권한 있는 접근 모니터링
  • 규정 준수 보고 (PCI-DSS, HIPAA)

인기 있는 SIEM 도구:

  • Splunk
  • ELK Stack (Elasticsearch, Logstash, Kibana)
  • IBM QRadar
  • ArcSight

희소성: 흔함 난이도: 중간


8. IDS와 IPS의 차이점은 무엇입니까?

답변: **IDS (침입 탐지 시스템)**와 **IPS (침입 방지 시스템)**는 네트워크 트래픽에서 위협을 모니터링합니다.

주요 차이점:

기능IDSIPS
동작탐지 및 경고탐지 및 차단
배치대역 외 (수동적)인라인 (능동적)
영향트래픽 중단 없음합법적인 트래픽 차단 가능
대응수동자동
오탐덜 중요더 중요

IDS 배포:

Loading diagram...

IPS 배포:

Loading diagram...

Snort 구성 (IDS/IPS):

# Snort 설치
sudo apt install snort

# 네트워크 구성
sudo vi /etc/snort/snort.conf
# HOME_NET 설정
ipvar HOME_NET 192.168.1.0/24
ipvar EXTERNAL_NET !$HOME_NET

# IDS 모드로 실행
sudo snort -A console -q -c /etc/snort/snort.conf -i eth0

# IPS 모드로 실행 (인라인)
sudo snort -Q -c /etc/snort/snort.conf -i eth0

Snort 규칙:

# 규칙 구문
# action protocol src_ip src_port -> dst_ip dst_port (options)

# SQL Injection 탐지
alert tcp any any -> $HOME_NET 80 (msg:"SQL Injection 시도"; \
    content:"UNION SELECT"; nocase; sid:1000001; rev:1;)

# 포트 스캔 탐지
alert tcp any any -> $HOME_NET any (msg:"포트 스캔 탐지됨"; \
    flags:S; threshold:type both, track by_src, count 20, seconds 60; \
    sid:1000002; rev:1;)

# 무차별 대입 SSH 탐지
alert tcp any any -> $HOME_NET 22 (msg:"SSH 무차별 대입"; \
    flags:S; threshold:type both, track by_src, count 5, seconds 60; \
    sid:1000003; rev:1;)

# 악성 IP 차단 (IPS 모드)
drop tcp 203.0.113.50 any -> $HOME_NET any (msg:"악성 IP 차단됨"; \
    sid:1000004; rev:1;)

Suricata (최신 대안):

# Suricata 설치
sudo apt install suricata

# 규칙 업데이트
sudo suricata-update

# Suricata 실행
sudo suricata -c /etc/suricata/suricata.yaml -i eth0

# 경고 보기
sudo tail -f /var/log/suricata/fast.log

경고 분석:

# Snort 경고 파싱
import re
from collections import Counter

def analyze_snort_alerts(log_file):
    alerts = []
    
    with open(log_file, 'r') as f:
        for line in f:
            # 경고 파싱
            match = re.search(r'\[\*\*\] \[(\d+):(\d+):(\d+)\] (.+?) \[\*\*\]', line)
            if match:
                alerts.append({
                    'sid': match.group(1),
                    'message': match.group(4),
                    'line': line
                })
    
    # 상위 경고
    alert_counts = Counter([a['message'] for a in alerts])
    print("상위 10개 경고:")
    for alert, count in alert_counts.most_common(10):
        print(f"{count:5d} - {alert}")
    
    return alerts

# 사용 예시
alerts = analyze_snort_alerts('/var/log/snort/alert')

일반적인 공격 시그니처:

# SQL Injection
content:"' OR 1=1--";
content:"UNION SELECT";

# XSS
content:"<script>";
content:"javascript:";

# Command Injection
content:";cat /etc/passwd";
content:"|whoami";

# Directory Traversal
content:"../../../";

# Shellshock
content:"() { :; };";

모범 사례:

  • 시그니처를 정기적으로 업데이트
  • 오탐을 줄이기 위해 규칙 조정
  • 차단된 합법적인 트래픽에 대해 IPS 모니터링
  • 상관 관계 분석을 위해 SIEM과 통합
  • IPS를 활성화하기 전에 IDS 모드에서 테스트

희소성: 흔함 난이도: 중간


보안 모범 사례

9. 비밀번호는 어떻게 보호합니까?

답변: 다층 비밀번호 보안:

1. 해싱 (암호화 아님):

import hashlib
import os

def hash_password(password):
    # 솔트 생성
    salt = os.urandom(32)
    
    # 솔트를 사용하여 비밀번호 해싱
    key = hashlib.pbkdf2_hmac(
        'sha256',
        password.encode('utf-8'),
        salt,
        100000  # 반복 횟수
    )
    
    # 솔트 + 해시 저장
    return salt + key

def verify_password(stored_password, provided_password):
    salt = stored_password[:32]
    stored_key = stored_password[32:]
    
    key = hashlib.pbkdf2_hmac(
        'sha256',
        provided_password.encode('utf-8'),
        salt,
        100000
    )
    
    return key == stored_key

2. 비밀번호 정책:

  • 최소 길이 (12자 이상)
  • 복잡성 요구 사항
  • 비밀번호 이력
  • 만료 (논란의 여지 있음)

3. 추가 보안:

  • 다단계 인증 (MFA)
  • 실패 시도 후 계정 잠금
  • 비밀번호 강도 측정기
  • 유출 감지 (Have I Been Pwned API)

절대 금지:

  • 비밀번호를 일반 텍스트로 저장
  • 취약한 해싱 사용 (MD5, SHA1)
  • 솔트 없이 해싱

희소성: 매우 흔함 난이도: 중간


사고 대응

10. 사고 대응의 단계는 무엇입니까?

답변: NIST 사고 대응 라이프사이클:

1. 준비:

  • IR 계획 개발
  • 팀 교육
  • 도구 및 모니터링 설정

2. 탐지 및 분석:

  • 사고 식별
  • 범위 및 영향 분석
  • 대응 우선 순위 지정

3. 격리:

  • 단기: 영향을 받은 시스템 격리
  • 장기: 패치 적용, 시스템 재구축

4. 근절:

  • 멀웨어 제거
  • 취약점 해결
  • 방어 강화

5. 복구:

  • 시스템 복원
  • 재감염 모니터링
  • 정상 운영으로 복귀

6. 사고 후:

  • 교훈 문서화
  • 절차 업데이트
  • 방어 개선
Loading diagram...

희소성: 흔함 난이도: 중간


결론

주니어 보안 엔지니어 면접을 준비하려면 보안 기본 사항과 실무 기술을 이해해야 합니다. 다음 사항에 집중하십시오.

  1. 기본 사항: CIA 트라이어드, 보안 원칙
  2. OWASP: 일반적인 웹 취약점
  3. 취약점 관리: 스캔, 패치, 우선 순위 지정
  4. 암호화: 암호화, 해싱, 인증서
  5. SSL/TLS: 인증서 관리, 일반적인 잘못된 구성
  6. 방어 도구: 방화벽, SIEM, IDS/IPS
  7. 모범 사례: 안전한 코딩, 비밀번호 보안
  8. 사고 대응: 탐지, 격리, 복구

보안 뉴스를 최신 상태로 유지하고, 랩에서 연습하고, 자격증 (Security+, CEH)을 취득하십시오. 행운을 빕니다!

Newsletter subscription

실제로 효과가 있는 주간 커리어 팁

최신 인사이트를 받은 편지함으로 직접 받아보세요

Decorative doodle

다음 면접은 이력서 하나로 결정됩니다

몇 분 만에 전문적이고 최적화된 이력서를 만드세요. 디자인 기술은 필요 없습니다—입증된 결과만 있으면 됩니다.

내 이력서 만들기

이 게시물 공유

75% ATS 거부율을 극복하세요

4개 중 3개의 이력서는 사람의 눈에 닿지 않습니다. 우리의 키워드 최적화는 통과율을 최대 80%까지 높여 채용 담당자가 실제로 당신의 잠재력을 볼 수 있도록 합니다.