Go 보안 주니어 기술면접

Go 주니어 (1~3년) 보안 5문항 조회수 26 · 2026-08-04 (화) 14:04:28
1 SQL 인젝션
Easy

Q. SQL 인젝션 공격이 무엇인지 설명하고, Go의 database/sql 패키지에서 SQL 인젝션을 방지하기 위해 사용해야 하는 쿼리 작성 방법을 설명해주세요. 문자열 포맷팅으로 쿼리를 만들면 안 되는 이유도 함께 설명해주세요.

사용자 입력이 SQL 쿼리에 직접 포함될 때의 위험성과 파라미터 바인딩 방식을 생각해보세요.

A. 모범답안

SQL 인젝션은 악의적인 사용자가 입력값에 SQL 구문을 삽입하여 의도하지 않은 데이터베이스 작업을 수행하게 만드는 공격입니다. Go에서는 Query나 Exec 메서드에 플레이스홀더(?)를 사용하고 별도의 인자로 값을 전달하는 prepared statement 방식을 사용해야 합니다. 예를 들어 db.Query('SELECT * FROM users WHERE id = ?', userID)처럼 작성하면 데이터베이스 드라이버가 값을 안전하게 이스케이프 처리합니다. fmt.Sprintf로 쿼리 문자열을 직접 조합하면 사용자 입력에 포함된 SQL 구문이 그대로 실행되어 데이터 유출이나 삭제가 발생할 수 있습니다. prepared statement는 쿼리 구조와 데이터를 분리하여 처리하므로 입력값이 항상 데이터로만 취급됩니다.

핵심 포인트
  • • SQL 인젝션은 사용자 입력을 통해 악의적인 SQL 구문을 실행하는 공격
  • • 플레이스홀더(?)와 파라미터 바인딩을 사용한 prepared statement로 방지
  • • 문자열 포맷팅은 사용자 입력을 쿼리에 직접 삽입하여 위험함
답변에 넣으면 좋은 키워드
SQL 인젝션 prepared statement 플레이스홀더 파라미터 바인딩 이스케이프 쿼리 파라미터
실무에서는

사용자 검색 기능이나 로그인 기능에서 입력값을 쿼리에 안전하게 전달할 때 필수적으로 적용됩니다.

Follow-up 질문

ORM 라이브러리(예: GORM)를 사용할 때도 SQL 인젝션 위험이 있을 수 있나요? 어떤 경우에 주의해야 하나요?

2 XSS 방어
Medium

Q. XSS(Cross-Site Scripting) 공격이 무엇인지 설명하고, Go의 html/template 패키지가 어떻게 XSS를 방지하는지 설명해주세요. text/template 패키지와는 어떤 차이가 있으며, 사용자 입력을 HTML로 렌더링할 때 주의할 점은 무엇인가요?

사용자 입력이 브라우저에서 스크립트로 실행되는 것을 막기 위한 이스케이프 처리를 생각해보세요.

A. 모범답안

XSS는 공격자가 악의적인 스크립트를 웹 페이지에 삽입하여 다른 사용자의 브라우저에서 실행되게 만드는 공격입니다. Go의 html/template 패키지는 템플릿에 삽입되는 모든 값을 자동으로 컨텍스트에 맞게 이스케이프 처리하여 HTML, JavaScript, CSS 등에서 스크립트가 실행되지 않도록 방지합니다. text/template 패키지는 이러한 자동 이스케이프 기능이 없어 HTML 출력에는 적합하지 않습니다. 사용자 입력을 렌더링할 때는 반드시 html/template을 사용하고, template.HTML 같은 타입으로 강제 변환하여 이스케이프를 우회하는 것은 신뢰할 수 있는 데이터에만 사용해야 합니다. API 응답으로 JSON을 반환할 때도 Content-Type을 application/json으로 명시하여 브라우저가 HTML로 해석하지 않도록 해야 합니다.

핵심 포인트
  • • XSS는 악의적인 스크립트를 웹 페이지에 삽입하는 공격
  • • html/template은 자동으로 컨텍스트 기반 이스케이프 처리를 수행
  • • text/template은 이스케이프 기능이 없어 HTML 출력에 부적합
  • • template.HTML 같은 타입 변환은 신뢰할 수 있는 데이터에만 사용
답변에 넣으면 좋은 키워드
XSS html/template 자동 이스케이프 컨텍스트 기반 template.HTML text/template
실무에서는

사용자 프로필, 댓글, 게시글 등 사용자 입력을 웹 페이지에 표시할 때 XSS 방어가 필수적입니다.

Follow-up 질문

사용자가 입력한 HTML을 일부 허용해야 하는 경우(예: 게시판의 서식 있는 텍스트)에는 어떻게 처리해야 하나요?

3 CSRF 방어
Medium

Q. CSRF(Cross-Site Request Forgery) 공격이 무엇인지 설명하고, Go 웹 애플리케이션에서 CSRF를 방지하기 위한 방법을 설명해주세요. CSRF 토큰을 사용하는 방식의 동작 원리와 구현 시 주의할 점을 포함해서 답변해주세요.

인증된 사용자의 권한을 악용하여 의도하지 않은 요청을 보내는 공격과 토큰 검증 방식을 생각해보세요.

A. 모범답안

CSRF는 공격자가 피해자의 인증 정보(쿠키 등)를 이용하여 피해자 모르게 악의적인 요청을 서버에 보내는 공격입니다. 방어 방법으로는 각 세션마다 고유한 CSRF 토큰을 생성하여 폼이나 요청 헤더에 포함시키고, 서버에서 요청 시 이 토큰을 검증하는 방식이 일반적입니다. Go에서는 gorilla/csrf 같은 미들웨어를 사용하거나 직접 구현할 수 있으며, 토큰은 암호학적으로 안전한 난수로 생성해야 합니다. CSRF 토큰은 쿠키가 아닌 폼 필드나 커스텀 헤더에 포함되어야 하며, GET 요청에는 상태 변경 작업을 수행하지 않도록 설계해야 합니다. SameSite 쿠키 속성을 Strict나 Lax로 설정하는 것도 추가적인 방어 수단이 됩니다.

핵심 포인트
  • • CSRF는 인증된 사용자의 권한으로 의도하지 않은 요청을 보내는 공격
  • • 세션별 고유한 CSRF 토큰을 생성하여 요청마다 검증
  • • 토큰은 폼 필드나 커스텀 헤더에 포함, 쿠키만으로는 전송되지 않음
  • • GET 요청은 상태 변경을 하지 않도록 설계
답변에 넣으면 좋은 키워드
CSRF CSRF 토큰 gorilla/csrf SameSite 쿠키 상태 변경 토큰 검증
실무에서는

회원 정보 수정, 결제, 게시글 작성 등 중요한 상태 변경 작업에서 CSRF 방어가 필수입니다.

Follow-up 질문

REST API를 JWT 토큰 기반으로 인증할 때도 CSRF 방어가 필요한가요? 그 이유는 무엇인가요?

4 세션 보안
Medium

Q. Go 웹 애플리케이션에서 세션을 안전하게 관리하기 위한 방법을 설명해주세요. 세션 ID 생성 시 주의할 점, 세션 쿠키 설정 시 보안 플래그(Secure, HttpOnly, SameSite), 그리고 세션 고정 공격을 방지하는 방법을 포함해서 답변해주세요.

세션 ID의 예측 불가능성과 쿠키의 보안 속성들을 고려해보세요.

A. 모범답안

세션 ID는 crypto/rand 패키지를 사용하여 암호학적으로 안전한 난수로 생성해야 하며, 충분한 길이(최소 128비트)를 가져야 합니다. 세션 쿠키는 HttpOnly 플래그를 설정하여 JavaScript에서 접근할 수 없게 하고, Secure 플래그를 설정하여 HTTPS 연결에서만 전송되도록 해야 합니다. SameSite 속성을 Lax나 Strict로 설정하면 CSRF 공격을 추가로 방어할 수 있습니다. 세션 고정 공격을 방지하려면 로그인 성공 시 기존 세션 ID를 폐기하고 새로운 세션 ID를 발급해야 합니다. 또한 세션에는 적절한 타임아웃을 설정하고, 로그아웃 시 서버 측 세션 데이터를 완전히 삭제해야 합니다.

핵심 포인트
  • • 세션 ID는 crypto/rand로 생성하여 예측 불가능하게 만듦
  • • HttpOnly, Secure, SameSite 플래그로 쿠키 보안 강화
  • • 로그인 시 세션 ID를 재생성하여 세션 고정 공격 방지
  • • 적절한 타임아웃과 로그아웃 시 세션 삭제
답변에 넣으면 좋은 키워드
세션 ID crypto/rand HttpOnly Secure SameSite 세션 고정 공격 세션 타임아웃
실무에서는

로그인 상태를 유지하는 모든 웹 애플리케이션에서 세션 보안은 사용자 계정 보호의 핵심입니다.

Follow-up 질문

세션 데이터를 메모리가 아닌 Redis 같은 외부 저장소에 저장하는 이유는 무엇이며, 보안 측면에서 어떤 장점이 있나요?

5 Rate Limiting
Hard

Q. API 서버에서 무차별 대입 공격(brute force attack)이나 DDoS 공격을 방어하기 위해 Rate Limiting을 구현하려고 합니다. Go에서 IP 기반 또는 사용자 기반으로 요청 속도를 제한하는 방법을 설명하고, golang.org/x/time/rate 패키지의 토큰 버킷 알고리즘을 어떻게 활용할 수 있는지 설명해주세요. 분산 환경에서의 구현 방법도 함께 설명해주세요.

요청 빈도를 추적하고 제한하는 알고리즘과 여러 서버 간 상태 공유 방법을 생각해보세요.

A. 모범답안

Rate Limiting은 특정 시간 동안 허용되는 요청 수를 제한하여 무차별 대입 공격이나 서비스 남용을 방지합니다. golang.org/x/time/rate 패키지의 Limiter는 토큰 버킷 알고리즘을 구현하며, NewLimiter로 초당 허용 요청 수와 버스트 크기를 설정할 수 있습니다. 미들웨어에서 IP 주소나 사용자 ID를 키로 하는 map에 각 Limiter를 저장하고, Allow 메서드로 요청 허용 여부를 판단합니다. 단일 서버에서는 sync.Map이나 mutex로 동시성을 처리하지만, 분산 환경에서는 Redis를 사용하여 INCR 명령과 EXPIRE로 요청 카운트를 관리하거나, Redis의 Lua 스크립트로 원자적 연산을 수행해야 합니다. 제한을 초과한 요청에는 429 Too Many Requests 상태 코드와 Retry-After 헤더를 반환하여 클라이언트에게 재시도 시점을 알려줍니다.

핵심 포인트
  • • Rate Limiting은 시간당 요청 수를 제한하여 공격 방어
  • • golang.org/x/time/rate의 토큰 버킷 알고리즘 활용
  • • 분산 환경에서는 Redis로 요청 카운트를 중앙 관리
  • • 429 상태 코드와 Retry-After 헤더로 응답
답변에 넣으면 좋은 키워드
Rate Limiting 토큰 버킷 golang.org/x/time/rate 무차별 대입 공격 Redis 429 Too Many Requests Retry-After
실무에서는

로그인 API, 비밀번호 재설정, 결제 API 등에서 자동화된 공격을 방어하는 데 필수적입니다.

Follow-up 질문

로그인 엔드포인트와 일반 API 엔드포인트에 서로 다른 Rate Limiting 정책을 적용하려면 어떻게 구현해야 하나요?

댓글 0

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

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