CodeIgniter 미드레벨 보안 면접

CodeIgniter 미드레벨 (3~7년) 보안 5문항 조회수 18 · 2026-08-20 (목) 22:11:06
1 CSRF 방어
Medium

Q. CodeIgniter에서 CSRF 보호 기능을 활성화했음에도 불구하고, AJAX 요청에서 'The action you have requested is not allowed' 에러가 발생했습니다. 이 문제의 원인과 해결 방법을 설명해주세요.

CSRF 토큰을 어떻게 전달해야 하는지 생각해보세요.

A. 모범답안

CodeIgniter의 CSRF 보호가 활성화되면 모든 POST 요청에 CSRF 토큰이 필요합니다. AJAX 요청 시에는 폼 데이터에 csrf_token_name과 csrf_hash 값을 함께 전송해야 합니다. 해결 방법은 첫째, 쿠키에서 CSRF 토큰을 읽어 AJAX 요청 헤더나 데이터에 포함시키거나, 둘째, 페이지 로드 시 hidden input이나 meta 태그로 토큰을 렌더링하고 JavaScript로 읽어서 사용하는 것입니다. config.php에서 csrf_regenerate를 false로 설정하면 토큰이 매 요청마다 재생성되지 않아 관리가 쉬워지지만, 보안 수준은 약간 낮아집니다. 또한 csrf_exclude_uris 설정으로 특정 URI를 제외할 수 있지만, 이는 보안상 권장되지 않습니다.

핵심 포인트
  • • CSRF 토큰을 AJAX 요청에 명시적으로 포함해야 함
  • • 쿠키, hidden input, meta 태그 등을 통해 토큰 전달
  • • csrf_regenerate 설정의 보안 트레이드오프 이해
답변에 넣으면 좋은 키워드
CSRF 토큰 csrf_token_name csrf_hash AJAX csrf_regenerate 쿠키
실무에서는

SPA나 모바일 앱의 API 연동 시 CSRF 토큰 처리가 필수적입니다.

Follow-up 질문

CSRF 토큰 재생성(regenerate) 옵션을 켜는 것과 끄는 것의 보안상 차이점은 무엇인가요?

2 SQL 인젝션 방어
Medium

Q. CodeIgniter의 Query Builder를 사용하면 SQL 인젝션으로부터 안전하다고 알려져 있습니다. 하지만 Query Builder를 사용하더라도 SQL 인젝션에 취약할 수 있는 경우들을 3가지 이상 설명하고, 각각의 안전한 대안을 제시해주세요.

Query Builder의 특정 메서드들은 자동 이스케이핑을 하지 않습니다.

A. 모범답안

첫째, where 메서드에서 두 번째 파라미터를 생략하고 문자열 연결로 조건을 만들면 취약합니다. 반드시 where('column', $value) 형태로 사용하거나 prepared statement를 사용해야 합니다. 둘째, order_by나 select 메서드에 사용자 입력을 직접 전달하면 위험합니다. 화이트리스트 검증을 통해 허용된 컬럼명만 사용하도록 제한해야 합니다. 셋째, like 메서드 사용 시 와일드카드 문자를 사용자가 조작할 수 있으면 의도치 않은 데이터 노출이 발생할 수 있습니다. 넷째, set 메서드에서 세 번째 파라미터를 FALSE로 설정하면 이스케이핑이 비활성화되므로 주의해야 합니다. 다섯째, query 메서드로 직접 SQL을 작성할 때는 반드시 바인딩 파라미터를 사용해야 합니다.

핵심 포인트
  • • where, order_by, select 등에서 사용자 입력 직접 사용 금지
  • • 화이트리스트 검증과 바인딩 파라미터 활용
  • • set 메서드의 이스케이핑 옵션 이해
답변에 넣으면 좋은 키워드
Query Builder SQL 인젝션 바인딩 이스케이핑 화이트리스트 prepared statement
실무에서는

검색 기능이나 정렬 옵션을 제공하는 게시판에서 사용자 입력을 안전하게 처리해야 합니다.

Follow-up 질문

동적으로 ORDER BY 절을 구성해야 하는 경우, 안전하게 구현하는 방법은 무엇인가요?

3 XSS 방어
Medium

Q. CodeIgniter에서 사용자가 입력한 HTML 컨텐츠를 게시판에 표시해야 하는 요구사항이 있습니다. XSS 공격을 방어하면서도 안전한 HTML 태그는 허용하는 방법을 설계해주세요. xss_clean 함수의 한계점과 함께 설명해주세요.

HTML Purifier 같은 전문 라이브러리 사용을 고려해보세요.

A. 모범답안

CodeIgniter의 xss_clean 함수는 deprecated 되었으며 완벽한 보안을 보장하지 못합니다. 안전한 HTML 허용을 위해서는 HTML Purifier 라이브러리를 통합하는 것이 권장됩니다. HTML Purifier는 화이트리스트 기반으로 동작하며, 허용할 태그와 속성을 명시적으로 정의할 수 있습니다. 구현 시에는 입력 시점에 정화하기보다는 출력 시점에 이스케이핑하는 것이 원칙이며, 필요한 경우에만 HTML Purifier를 적용합니다. esc 함수를 기본으로 사용하고, HTML이 필요한 필드만 선택적으로 Purifier를 적용하는 이중 접근이 효과적입니다. 또한 Content-Security-Policy 헤더를 설정하여 인라인 스크립트 실행을 차단하는 추가 방어층을 구축해야 합니다.

핵심 포인트
  • • xss_clean은 deprecated되어 사용 비권장
  • • HTML Purifier 같은 전문 라이브러리 활용
  • • 출력 시점 이스케이핑과 CSP 헤더 적용
답변에 넣으면 좋은 키워드
XSS HTML Purifier 화이트리스트 esc 함수 CSP 출력 이스케이핑
실무에서는

위지윅 에디터를 사용하는 블로그나 커뮤니티 사이트에서 필수적인 보안 처리입니다.

Follow-up 질문

CSP 헤더를 CodeIgniter에서 어떻게 설정하며, nonce나 hash 방식 중 어떤 것을 선택하시겠습니까?

4 세션 보안
Hard

Q. CodeIgniter 애플리케이션에서 세션 하이재킹과 세션 고정 공격을 방어하기 위한 전략을 수립해주세요. sess_regenerate 설정, 세션 저장소 선택, 그리고 추가적인 보안 조치들을 포함해서 설명해주세요.

세션 ID 재생성 시점과 세션 데이터 저장 위치가 핵심입니다.

A. 모범답안

세션 고정 공격 방어를 위해 로그인 성공 시 반드시 session_regenerate_id를 호출하여 세션 ID를 재생성해야 합니다. config.php에서 sess_regenerate를 TRUE로 설정하면 일정 시간마다 자동 재생성되지만, 로그인 시점의 명시적 재생성이 더 중요합니다. 세션 저장소는 기본 파일 시스템보다 데이터베이스나 Redis를 사용하는 것이 안전하며, sess_driver를 'database' 또는 'redis'로 설정합니다. 세션 쿠키 설정에서 sess_cookie_httponly를 TRUE로, sess_cookie_secure를 TRUE로 설정하여 JavaScript 접근과 HTTP 전송을 차단합니다. 추가로 사용자의 IP 주소나 User-Agent를 세션에 저장하고 매 요청마다 검증하는 핑거프린팅 기법을 적용할 수 있습니다. 또한 sess_time_to_update를 적절히 설정하고, 민감한 작업 전에는 재인증을 요구하는 것이 좋습니다.

핵심 포인트
  • • 로그인 시 session_regenerate_id 명시적 호출
  • • Database나 Redis 세션 저장소 사용
  • • HttpOnly, Secure 쿠키 플래그 설정 및 핑거프린팅 적용
답변에 넣으면 좋은 키워드
세션 하이재킹 세션 고정 session_regenerate_id HttpOnly Secure Redis 핑거프린팅
실무에서는

금융 서비스나 관리자 페이지처럼 높은 보안이 요구되는 시스템에서 필수적입니다.

Follow-up 질문

세션 핑거프린팅에서 IP 주소를 검증하는 것이 모바일 환경에서 문제가 될 수 있는 이유는 무엇인가요?

5 암호화 및 개인정보 보호
Hard

Q. CodeIgniter 프로젝트에서 사용자 비밀번호와 주민등록번호를 저장해야 합니다. 각각에 적합한 암호화 방식과 그 이유를 설명하고, CodeIgniter의 Encryption 라이브러리 사용 시 주의사항을 말씀해주세요.

비밀번호는 단방향, 개인정보는 양방향 암호화가 필요합니다.

A. 모범답안

비밀번호는 단방향 해시 함수를 사용해야 하며, PHP의 password_hash 함수(bcrypt 또는 argon2)를 사용하는 것이 표준입니다. CodeIgniter에서는 password_hash($password, PASSWORD_BCRYPT)로 저장하고 password_verify로 검증합니다. 절대 MD5나 SHA1 같은 빠른 해시 함수를 사용해서는 안 되며, salt는 자동으로 생성되므로 별도 관리가 불필요합니다. 주민등록번호 같은 개인정보는 복호화가 필요하므로 AES-256 같은 양방향 암호화를 사용하며, CodeIgniter의 Encryption 라이브러리를 활용합니다. 암호화 키는 반드시 config/encryption_key에 안전하게 설정하고, 환경변수로 관리하여 코드 저장소에 노출되지 않도록 해야 합니다. Encryption 라이브러리 사용 시 driver를 'openssl'로 설정하고, cipher는 'AES-256-CBC' 또는 'AES-256-CTR'을 선택합니다. 암호화된 데이터는 Base64 인코딩되어 저장되므로 DB 컬럼 크기를 충분히 확보해야 합니다.

핵심 포인트
  • • 비밀번호는 password_hash(bcrypt/argon2) 사용
  • • 개인정보는 AES-256 양방향 암호화
  • • 암호화 키는 환경변수로 관리하고 코드 저장소에서 분리
답변에 넣으면 좋은 키워드
password_hash bcrypt argon2 AES-256 Encryption 라이브러리 환경변수 단방향 해시
실무에서는

개인정보보호법 준수를 위해 민감정보 암호화는 법적 의무사항입니다.

Follow-up 질문

암호화 키를 로테이션해야 하는 상황에서 기존 암호화된 데이터를 어떻게 마이그레이션하시겠습니까?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!