Go 신입 개발자 보안 면접
새 면접Q. Go에서 사용자 비밀번호를 데이터베이스에 저장할 때, 평문(plain text)으로 저장하면 안 되는 이유와 어떤 방식으로 저장해야 하는지 설명해주세요.
단방향 암호화와 해시 함수의 특징을 생각해보세요.
비밀번호를 평문으로 저장하면 데이터베이스가 유출되었을 때 모든 사용자 계정이 노출됩니다. 비밀번호는 bcrypt, scrypt, argon2 같은 단방향 해시 함수로 암호화하여 저장해야 합니다. Go에서는 golang.org/x/crypto/bcrypt 패키지를 주로 사용합니다. 해시 함수는 복호화가 불가능하므로, 로그인 시 입력된 비밀번호를 같은 방식으로 해시하여 저장된 값과 비교합니다. bcrypt는 salt를 자동으로 생성하고 연산 비용을 조절할 수 있어 무차별 대입 공격(brute force)을 방어할 수 있습니다.
- • 평문 저장 시 유출 위험
- • bcrypt 등 단방향 해시 함수 사용
- • salt와 연산 비용을 통한 brute force 방어
- • 복호화 불가능, 비교 방식으로 검증
회원가입 및 로그인 기능 구현 시 사용자 비밀번호를 안전하게 저장하고 검증하는 상황
bcrypt의 cost factor는 무엇이며, 실무에서 어떤 값을 주로 사용하나요?
Q. SQL 인젝션(SQL Injection)이 무엇인지 설명하고, Go에서 이를 방지하는 방법을 말씀해주세요.
사용자 입력을 쿼리에 직접 결합하는 것과 prepared statement의 차이를 생각해보세요.
SQL 인젝션은 악의적인 사용자가 입력값에 SQL 구문을 삽입하여 데이터베이스를 조작하는 공격입니다. 예를 들어 로그인 폼에 OR 1=1 같은 구문을 넣어 인증을 우회하거나 데이터를 삭제할 수 있습니다. Go에서는 database/sql 패키지의 prepared statement를 사용하여 방지합니다. db.Query나 db.Exec 메서드에서 물음표(?)나 $1, $2 같은 placeholder를 사용하고 인자를 별도로 전달하면, 입력값이 쿼리 구조가 아닌 데이터로만 처리됩니다. 절대로 fmt.Sprintf로 쿼리 문자열을 직접 조합해서는 안 됩니다.
- • 악의적인 SQL 구문 삽입 공격
- • prepared statement 사용
- • placeholder와 인자 분리
- • 문자열 직접 조합 금지
사용자 입력을 받아 데이터베이스를 조회하는 검색, 로그인, 게시판 기능 구현 시
ORM(예: GORM)을 사용하면 SQL 인젝션으로부터 완전히 안전한가요?
Q. JWT(JSON Web Token)의 구조와 동작 원리를 설명하고, Go 웹 서버에서 JWT를 사용한 인증 흐름을 간단히 설명해주세요.
JWT의 세 부분과 서명 검증 과정을 생각해보세요.
JWT는 Header, Payload, Signature 세 부분이 점(.)으로 구분된 토큰입니다. Header는 토큰 타입과 알고리즘을, Payload는 사용자 정보(claims)를, Signature는 변조 방지를 위한 서명을 담습니다. 사용자가 로그인하면 서버는 사용자 정보를 Payload에 담고 비밀키로 서명하여 JWT를 생성해 클라이언트에게 전달합니다. 클라이언트는 이후 요청마다 Authorization 헤더에 JWT를 담아 보내고, 서버는 비밀키로 서명을 검증한 후 Payload의 정보를 신뢰하여 인가 처리합니다. Go에서는 golang-jwt/jwt 같은 라이브러리를 사용하여 토큰을 생성하고 검증합니다.
- • Header, Payload, Signature 구조
- • 서명을 통한 변조 방지
- • 로그인 시 토큰 발급
- • 요청마다 토큰 검증으로 인증
모바일 앱이나 SPA에서 stateless한 인증 시스템을 구현할 때
JWT의 단점은 무엇이며, Refresh Token은 왜 필요한가요?
Q. XSS(Cross-Site Scripting) 공격이 무엇인지 설명하고, Go 웹 애플리케이션에서 이를 방지하기 위한 방법을 말씀해주세요.
사용자 입력을 HTML에 출력할 때 발생하는 문제와 escape 처리를 생각해보세요.
XSS는 공격자가 악의적인 스크립트를 웹 페이지에 삽입하여 다른 사용자의 브라우저에서 실행시키는 공격입니다. 예를 들어 게시판에 <script>alert('XSS')</script> 같은 코드를 입력하면 다른 사용자가 해당 게시글을 볼 때 스크립트가 실행됩니다. Go에서는 html/template 패키지를 사용하면 자동으로 HTML escape 처리가 되어 XSS를 방지할 수 있습니다. 사용자 입력을 출력할 때 특수문자(<, >, &, 등)를 HTML 엔티티로 변환해야 합니다. 또한 Content-Security-Policy 헤더를 설정하여 외부 스크립트 실행을 제한할 수 있습니다.
- • 악의적인 스크립트 삽입 공격
- • html/template 패키지의 자동 escape
- • 특수문자를 HTML 엔티티로 변환
- • CSP 헤더 설정
사용자가 입력한 댓글, 게시글, 프로필 정보를 웹 페이지에 표시하는 기능 구현 시
Stored XSS와 Reflected XSS의 차이는 무엇인가요?
Q. CSRF(Cross-Site Request Forgery) 공격이 무엇인지 설명하고, Go 웹 애플리케이션에서 이를 방어하는 방법을 말씀해주세요.
사용자의 인증 상태를 악용하는 공격과 CSRF 토큰의 역할을 생각해보세요.
CSRF는 공격자가 사용자의 의도와 무관하게 인증된 사용자의 권한으로 악의적인 요청을 보내는 공격입니다. 예를 들어 로그인한 사용자가 악성 사이트를 방문하면, 해당 사이트에서 사용자 몰래 송금이나 정보 변경 요청을 보낼 수 있습니다. 방어 방법은 CSRF 토큰을 사용하는 것입니다. 서버는 폼을 렌더링할 때 랜덤한 토큰을 생성하여 세션에 저장하고 hidden input으로 포함시킵니다. 요청이 들어오면 폼에서 전달된 토큰과 세션의 토큰을 비교하여 검증합니다. Go에서는 gorilla/csrf 같은 미들웨어를 사용하여 쉽게 구현할 수 있습니다.
- • 인증된 사용자 권한을 악용한 요청 위조
- • CSRF 토큰을 통한 요청 검증
- • 세션 토큰과 폼 토큰 비교
- • gorilla/csrf 미들웨어 활용
사용자의 정보를 변경하거나 결제, 송금 등 중요한 작업을 수행하는 폼 기반 웹 애플리케이션
SameSite 쿠키 속성은 CSRF 방어에 어떻게 도움이 되나요?
Q. 인증(Authentication)과 인가(Authorization)의 차이를 설명하고, 각각의 예시를 들어주세요.
누구인지 확인하는 것과 무엇을 할 수 있는지 확인하는 것의 차이를 생각해보세요.
인증은 사용자가 누구인지 확인하는 과정이고, 인가는 인증된 사용자가 특정 자원에 접근할 권한이 있는지 확인하는 과정입니다. 예를 들어 로그인 과정에서 아이디와 비밀번호를 확인하는 것이 인증입니다. 로그인 후 관리자 페이지에 접근하려 할 때 해당 사용자가 관리자 권한을 가지고 있는지 확인하는 것이 인가입니다. Go 웹 애플리케이션에서는 미들웨어를 통해 인증을 먼저 수행하고, 이후 역할(role)이나 권한(permission)을 확인하여 인가를 처리합니다.
- • 인증은 신원 확인
- • 인가는 권한 확인
- • 인증 후 인가 수행
- • 미들웨어를 통한 구현
웹 서비스에서 일반 사용자와 관리자를 구분하여 각기 다른 기능에 접근하도록 제어하는 상황
Go에서 역할 기반 접근 제어(RBAC)를 구현하려면 어떻게 해야 하나요?
Q. HTTPS가 무엇이며, HTTP와 어떻게 다른지 설명해주세요. 그리고 Go 웹 서버에서 HTTPS를 적용하는 방법을 간단히 말씀해주세요.
SSL/TLS를 통한 암호화와 인증서의 역할을 생각해보세요.
HTTPS는 HTTP에 SSL/TLS 프로토콜을 적용하여 통신을 암호화한 것입니다. HTTP는 평문으로 데이터를 전송하여 중간에 가로채기(sniffing)가 가능하지만, HTTPS는 데이터를 암호화하여 전송하므로 안전합니다. HTTPS는 서버의 신원을 인증서로 검증하고, 클라이언트와 서버 간 대칭키를 안전하게 교환하여 통신 내용을 보호합니다. Go에서는 http.ListenAndServeTLS 함수를 사용하며, 인증서 파일(.crt)과 개인키 파일(.key)을 인자로 전달하면 됩니다. Let's Encrypt 같은 무료 인증서를 사용할 수 있습니다.
- • SSL/TLS를 통한 암호화
- • 중간자 공격 방지
- • 인증서를 통한 서버 신원 검증
- • http.ListenAndServeTLS 사용
사용자의 개인정보나 결제 정보를 다루는 웹 서비스에서 안전한 통신을 보장하는 상황
대칭키 암호화와 비대칭키 암호화의 차이는 무엇이며, HTTPS에서는 어떻게 함께 사용되나요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!