웹 보안 신입 트러블슈팅 면접
새 면접Q. 사용자가 게시판에 글을 작성한 후, 다른 사용자들이 해당 게시글을 볼 때마다 alert 창이 뜨는 현상이 발생했습니다. 어떤 보안 문제가 발생한 것이고, 어떻게 원인을 파악하고 해결하시겠습니까?
사용자가 입력한 내용이 그대로 브라우저에서 실행되고 있는지 확인해보세요.
이는 XSS(Cross-Site Scripting) 공격으로 판단됩니다. 먼저 문제가 발생한 게시글의 내용을 데이터베이스에서 직접 확인하여 스크립트 태그가 포함되어 있는지 확인합니다. 브라우저 개발자 도구에서 HTML 소스를 확인하여 스크립트가 실제로 실행되고 있는지 검증합니다. 해결 방법으로는 사용자 입력값을 저장하기 전 또는 출력하기 전에 HTML 이스케이핑 처리를 적용해야 합니다. 재발 방지를 위해 모든 사용자 입력 필드에 대해 입력 검증과 출력 인코딩을 일관되게 적용하고, CSP(Content Security Policy) 헤더를 설정합니다.
- • XSS 공격임을 식별
- • 데이터베이스와 HTML 소스 확인을 통한 원인 분석
- • HTML 이스케이핑 또는 출력 인코딩 적용
- • CSP 헤더 설정을 통한 재발 방지
실제 커뮤니티 사이트나 게시판 서비스에서 사용자 입력을 처리할 때 반드시 적용해야 하는 기본 보안 대응입니다.
Stored XSS와 Reflected XSS의 차이점은 무엇이며, 각각 어떻게 방어해야 할까요?
Q. 로그인 페이지에서 특정 사용자가 비밀번호 없이 로그인에 성공하는 문제가 발견되었습니다. 로그를 확인해보니 ID 입력란에 'admin' OR '1'='1' 같은 문자열이 입력된 것을 확인했습니다. 어떤 보안 취약점이고, 어떻게 디버깅하고 해결하시겠습니까?
사용자 입력이 SQL 쿼리문에 직접 결합되어 실행되고 있는지 확인해보세요.
이는 SQL Injection 취약점입니다. 먼저 로그인 처리 코드에서 SQL 쿼리문이 어떻게 작성되어 있는지 확인하고, 사용자 입력이 문자열 결합 방식으로 쿼리에 포함되는지 검토합니다. 실제로 실행되는 SQL 쿼리를 로깅하여 OR 조건이 추가되어 항상 참이 되는 쿼리가 실행되는지 확인합니다. 해결 방법으로는 Prepared Statement 또는 Parameterized Query를 사용하여 사용자 입력을 쿼리 파라미터로 바인딩해야 합니다. 추가로 입력값 검증, 최소 권한 원칙의 데이터베이스 계정 사용, 에러 메시지에서 데이터베이스 정보 노출 방지 등을 적용하여 재발을 방지합니다.
- • SQL Injection 공격임을 식별
- • 쿼리 로깅을 통한 실행 쿼리 분석
- • Prepared Statement 사용으로 해결
- • 입력 검증 및 최소 권한 원칙 적용
데이터베이스를 사용하는 모든 웹 애플리케이션에서 가장 빈번하게 발생하는 보안 취약점 중 하나입니다.
ORM을 사용하면 SQL Injection이 완전히 방지되나요? 주의해야 할 점은 무엇인가요?
Q. 사용자가 로그인한 상태에서 이메일의 링크를 클릭했더니, 본인도 모르게 비밀번호가 변경되거나 게시글이 작성되는 문제가 발생했습니다. 서버 로그를 확인하니 정상적인 세션으로 요청이 들어온 것으로 보입니다. 어떤 공격이며, 어떻게 원인을 분석하고 방어하시겠습니까?
요청이 사용자가 의도한 곳에서 발생한 것인지 확인할 방법을 생각해보세요.
이는 CSRF(Cross-Site Request Forgery) 공격입니다. 먼저 문제가 발생한 요청의 Referer 헤더를 확인하여 외부 사이트에서 요청이 발생했는지 검토합니다. 이메일의 링크나 악의적인 사이트의 HTML 소스를 분석하여 자동으로 폼 제출이나 요청이 발생하는 코드가 있는지 확인합니다. 해결 방법으로는 CSRF 토큰을 생성하여 폼이나 요청 헤더에 포함시키고, 서버에서 이를 검증하는 로직을 추가합니다. SameSite 쿠키 속성을 Strict 또는 Lax로 설정하고, 중요한 작업에는 재인증을 요구하며, Referer 헤더 검증을 추가로 적용합니다.
- • CSRF 공격임을 식별
- • Referer 헤더와 요청 출처 분석
- • CSRF 토큰 생성 및 검증 구현
- • SameSite 쿠키 속성 설정
은행 거래, 비밀번호 변경, 결제 등 중요한 작업을 처리하는 모든 웹 서비스에서 필수적으로 방어해야 하는 공격입니다.
CSRF 토큰은 어떻게 생성하고 관리해야 안전한가요? 토큰의 유효기간은 어떻게 설정해야 할까요?
Q. 사용자가 로그아웃을 했는데도 브라우저의 뒤로가기 버튼을 누르면 로그인이 필요한 페이지가 그대로 보이는 문제가 발생했습니다. 어떤 원인이며, 어떻게 해결하시겠습니까?
브라우저 캐시와 서버 세션 검증의 관계를 생각해보세요.
이는 브라우저 캐시 문제로, 로그아웃 후에도 이전에 로드된 페이지가 캐시에서 표시되는 현상입니다. 먼저 네트워크 탭에서 뒤로가기 시 실제 서버 요청이 발생하는지, 아니면 캐시에서 로드되는지 확인합니다. 서버에서 로그인이 필요한 페이지에 대해 Cache-Control 헤더를 no-store, no-cache, must-revalidate로 설정하여 캐싱을 방지합니다. 또한 모든 보호된 페이지에서 세션 유효성을 검증하는 미들웨어를 적용하고, 로그아웃 시 서버 세션을 완전히 삭제하며 클라이언트 쿠키도 제거합니다. 추가로 Pragma: no-cache 헤더도 함께 설정하여 하위 호환성을 확보합니다.
- • 브라우저 캐시 문제 식별
- • Cache-Control 헤더 설정으로 캐싱 방지
- • 세션 유효성 검증 미들웨어 적용
- • 로그아웃 시 세션 및 쿠키 완전 삭제
인터넷 뱅킹이나 관리자 페이지 등 보안이 중요한 서비스에서 반드시 처리해야 하는 세션 관리 이슈입니다.
세션 고정 공격(Session Fixation)은 무엇이며, 로그인 시 어떻게 방어해야 할까요?
Q. 이미지 업로드 기능에서 사용자가 PHP 파일을 업로드한 후, 해당 파일에 직접 접근하여 서버에서 임의의 코드가 실행되는 문제가 발생했습니다. 어떻게 원인을 파악하고 해결하시겠습니까?
파일의 확장자 검증과 저장 위치, 실행 권한을 함께 고려해보세요.
이는 악성 파일 업로드를 통한 원격 코드 실행 취약점입니다. 먼저 파일 업로드 코드에서 확장자 검증이 제대로 이루어지는지, 클라이언트 측 검증만 있는지 확인합니다. 업로드된 파일의 실제 MIME 타입을 서버에서 검증하고, 파일 헤더(매직 넘버)를 확인하여 실제 파일 형식을 판별합니다. 해결 방법으로는 화이트리스트 기반의 확장자 검증을 서버에서 수행하고, 업로드 디렉토리의 스크립트 실행 권한을 제거합니다. 파일명을 랜덤하게 변경하여 저장하고, 업로드 디렉토리를 웹 루트 외부에 배치하거나, 정적 파일 서버를 통해 제공하여 스크립트 실행을 원천 차단합니다.
- • 파일 확장자와 MIME 타입 검증 부족 식별
- • 파일 헤더 검증을 통한 실제 파일 형식 확인
- • 화이트리스트 기반 검증 및 실행 권한 제거
- • 업로드 디렉토리 분리 및 파일명 랜덤화
프로필 사진, 첨부파일 등 파일 업로드 기능이 있는 모든 웹 서비스에서 발생할 수 있는 심각한 보안 위협입니다.
이미지 파일 내부에 악성 코드를 삽입하는 공격은 어떻게 방어할 수 있을까요?
Q. 일반 사용자가 URL을 직접 수정하여 관리자 페이지에 접근하거나, 다른 사용자의 개인정보를 조회할 수 있는 문제가 발견되었습니다. 어떤 보안 문제이며, 어떻게 디버깅하고 해결하시겠습니까?
인증(Authentication)과 인가(Authorization)의 차이를 생각하고, 각각이 제대로 구현되어 있는지 확인해보세요.
이는 인가(Authorization) 처리 누락으로 인한 접근 통제 실패입니다. 먼저 문제가 발생한 엔드포인트의 코드를 확인하여 로그인 여부만 확인하고 권한 검증은 하지 않는지 점검합니다. URL 파라미터로 전달되는 사용자 ID 등을 세션의 사용자 정보와 비교하는 로직이 있는지 확인합니다. 해결 방법으로는 모든 보호된 리소스에 대해 역할 기반 접근 제어(RBAC)를 구현하고, 미들웨어나 데코레이터를 통해 권한 검증을 일관되게 적용합니다. 사용자가 요청한 리소스의 소유자인지 확인하는 로직을 추가하고, 최소 권한 원칙에 따라 필요한 권한만 부여합니다. API 응답에서도 권한이 없는 데이터는 필터링하여 반환합니다.
- • 인가 처리 누락 문제 식별
- • 세션 정보와 요청 리소스의 소유권 검증
- • 역할 기반 접근 제어(RBAC) 구현
- • 미들웨어를 통한 일관된 권한 검증
마이페이지, 주문 내역, 관리자 페이지 등 사용자별로 다른 권한이 필요한 모든 기능에서 필수적인 보안 처리입니다.
JWT를 사용할 때 권한 정보를 토큰에 포함시키는 것과 서버에서 매번 확인하는 것의 장단점은 무엇인가요?
Q. 데이터베이스가 유출되어 사용자 비밀번호가 노출되는 사고가 발생했습니다. 조사 결과 비밀번호가 평문으로 저장되어 있었습니다. 이 문제를 어떻게 해결하고, 기존 사용자들에 대해서는 어떻게 대응해야 할까요?
단방향 암호화와 솔트(Salt)의 개념을 생각해보세요.
비밀번호를 평문으로 저장한 것이 근본 원인입니다. 즉시 모든 사용자에게 비밀번호 유출 사실을 공지하고 강제 비밀번호 변경을 요구해야 합니다. 새로운 비밀번호 저장 방식으로 bcrypt, scrypt, Argon2 등의 단방향 해시 함수를 사용하도록 코드를 수정합니다. 각 비밀번호마다 고유한 솔트(Salt)를 생성하여 함께 해싱하도록 구현하여 레인보우 테이블 공격을 방어합니다. 비밀번호 정책을 강화하여 최소 길이, 복잡도 요구사항을 추가하고, 비밀번호 변경 이력을 관리하여 이전 비밀번호 재사용을 방지합니다. 추가로 2단계 인증(2FA) 도입을 검토합니다.
- • 평문 저장의 위험성 인식 및 즉시 공지
- • bcrypt 등 단방향 해시 함수 적용
- • 솔트를 사용한 해싱으로 레인보우 테이블 공격 방어
- • 비밀번호 정책 강화 및 2FA 도입
사용자 인증 시스템을 구축하는 모든 서비스에서 가장 기본적이면서도 중요한 보안 요구사항입니다.
bcrypt의 work factor는 무엇이며, 시간이 지남에 따라 어떻게 조정해야 할까요?
Q. 웹사이트에 HTTPS를 적용했는데도 브라우저에서 '안전하지 않음' 경고가 표시되고, 일부 사용자들이 로그인 정보가 노출될 수 있다는 우려를 제기했습니다. 어떤 문제들이 있을 수 있으며, 어떻게 확인하고 해결하시겠습니까?
Mixed Content와 인증서 유효성을 함께 확인해보세요.
먼저 브라우저 개발자 도구의 콘솔과 네트워크 탭에서 Mixed Content 경고를 확인합니다. HTTPS 페이지 내에서 HTTP로 로드되는 이미지, 스크립트, CSS 등의 리소스가 있는지 점검하고, 모든 리소스를 HTTPS로 변경합니다. 인증서의 유효기간, 도메인 일치 여부, 인증 기관의 신뢰성을 확인하고, 만료되었거나 자체 서명된 인증서인 경우 정식 인증서로 교체합니다. HSTS(HTTP Strict Transport Security) 헤더를 설정하여 브라우저가 항상 HTTPS로 접속하도록 강제합니다. 추가로 TLS 버전이 1.2 이상인지 확인하고, 약한 암호화 스위트는 비활성화합니다.
- • Mixed Content 문제 확인 및 모든 리소스 HTTPS 전환
- • SSL/TLS 인증서 유효성 검증
- • HSTS 헤더 설정으로 HTTPS 강제
- • 안전한 TLS 버전 및 암호화 스위트 사용
로그인, 결제 등 민감한 정보를 다루는 모든 웹사이트에서 필수적으로 적용해야 하는 전송 계층 보안입니다.
HSTS Preload는 무엇이며, 적용 시 주의해야 할 점은 무엇인가요?
Q. REST API에서 특정 사용자가 짧은 시간에 수천 건의 요청을 보내 서버가 느려지고, 정상 사용자들이 서비스를 이용하지 못하는 문제가 발생했습니다. 어떻게 원인을 파악하고 대응하시겠습니까?
Rate Limiting과 요청 출처 분석을 함께 고려해보세요.
이는 API 남용 또는 DDoS 공격으로 판단됩니다. 먼저 서버 로그와 모니터링 도구를 통해 비정상적으로 많은 요청을 보내는 IP 주소나 사용자 계정을 식별합니다. 요청 패턴을 분석하여 자동화된 봇인지, 악의적인 공격인지 판단합니다. 즉각적인 대응으로 해당 IP를 차단하고, Rate Limiting을 구현하여 특정 시간 동안 허용되는 요청 수를 제한합니다. IP 기반, 사용자 기반, API 엔드포인트별로 다른 제한을 설정하고, 초과 시 429 상태 코드를 반환합니다. 추가로 API 키 또는 토큰 기반 인증을 강화하고, CAPTCHA를 도입하며, CDN이나 WAF를 통해 트래픽을 필터링합니다.
- • 로그 분석을 통한 비정상 트래픽 식별
- • Rate Limiting 구현으로 요청 수 제한
- • IP 차단 및 429 상태 코드 반환
- • API 키 인증 강화 및 WAF 도입
공개 API, 검색 기능, 로그인 시도 등 반복적인 요청이 가능한 모든 엔드포인트에서 필요한 보안 조치입니다.
Token Bucket과 Leaky Bucket 알고리즘의 차이점은 무엇이며, 어떤 상황에서 각각 사용하나요?
Q. 사용자가 공용 와이파이에서 서비스를 이용한 후, 다른 사람이 해당 사용자의 계정으로 로그인되는 세션 하이재킹 문제가 보고되었습니다. 쿠키 설정과 관련하여 어떤 문제가 있을 수 있으며, 어떻게 해결하시겠습니까?
쿠키의 보안 속성들(Secure, HttpOnly, SameSite)을 점검해보세요.
세션 쿠키의 보안 속성이 제대로 설정되지 않아 쿠키가 탈취된 것으로 판단됩니다. 먼저 현재 쿠키 설정을 확인하여 Secure, HttpOnly, SameSite 속성이 적용되어 있는지 점검합니다. Secure 플래그를 설정하여 HTTPS 연결에서만 쿠키가 전송되도록 하고, HttpOnly 플래그로 자바스크립트를 통한 쿠키 접근을 차단하여 XSS 공격을 방어합니다. SameSite 속성을 Strict 또는 Lax로 설정하여 CSRF 공격을 방어합니다. 세션 ID를 주기적으로 재생성하고, 로그인 시 이전 세션을 무효화하며, 사용자의 IP나 User-Agent 변경을 감지하여 세션을 무효화하는 추가 검증을 구현합니다.
- • 쿠키 보안 속성 누락 문제 식별
- • Secure, HttpOnly, SameSite 플래그 설정
- • 세션 ID 주기적 재생성
- • IP/User-Agent 변경 감지 및 세션 무효화
로그인 세션을 유지하는 모든 웹 애플리케이션에서 쿠키 보안 설정은 필수적인 보안 요구사항입니다.
세션을 쿠키 대신 LocalStorage에 저장하면 어떤 보안 문제가 있을까요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!