해커들의 단골 공격 막아내기: 인증과 3대 웹 취약점
유저의 신원을 확인하고 권한을 검사하는 방법과, 웹 서비스에서 가장 흔하게 발생하는 3대 보안 취약점의 방어법을 배웁니다.
여러분이 정성스럽게 만든 백엔드 서버가 인터넷에 공개되는 순간, 전 세계 해커들의 공격 대상이 됩니다. '우리 서비스는 작으니까 안 털리겠지'라고 생각하면 큰 오산입니다. 봇(Bot) 프로그램들은 24시간 내내 취약한 서버를 찾아다니며 공격 코드를 자동으로 쏴댑니다. 이번 시간에는 유저가 진짜 본인이 맞는지, 이 글을 지울 권한이 있는지를 확인하는 '인증과 인가'의 개념을 잡고, 바이브코딩 AI가 코드를 짤 때 가장 많이 뚫려주는 악명 높은 3대 웹 보안 취약점의 방어막을 쳐봅시다.
너 누구야? 그리고 권한 있어?: 인증과 인가
보안의 가장 첫걸음은 출입국 심사와 같습니다. 이 두 가지 개념을 헷갈리면 시스템에 큰 구멍이 뚫립니다.
- 인증 (Authentication - 너 누구야?): 유저가 제출한 여권(아이디/비밀번호)을 보고 진짜 홍길동이 맞는지 확인하는 절차입니다. 보통 한 번 성공하면 서버는 출입증(JWT 토큰이나 세션 쿠키)을 발급해 줍니다.
- 인가 (Authorization - 권한 있어?): 출입증을 가진 홍길동이 'VIP 라운지'의 문을 열려고 할 때, "홍길동은 맞지만 VIP 등급은 아니니까 출입 금지!"라고 막아내는 권한 검사입니다.
바이브코딩 시 권한(인가) 검사 누락 사고
오해 또는 실수
게시글 삭제 기능의 허점
바로잡기
AI는 '글 삭제 기능 짜줘'라고 하면, DB에서 글 번호를 찾아 냅다 삭제(DELETE)하는 코드만 짜줍니다. 해커가 1번부터 1000번까지 남의 글 삭제 요청을 보내면 전부 싹 지워집니다.
오해 또는 실수
필수 지시사항 프롬프트
바로잡기
반드시 AI에게 '게시글 수정/삭제 핸들러를 짤 때는, 글의 원작자와 현재 로그인한 토큰의 유저 ID가 똑같은지(인가) 검사하는 로직을 반드시 1순위로 넣어줘'라고 호통쳐야 합니다.
절대 방치하면 안 되는 3대 웹 취약점
인증과 인가 벽을 세워도, 들어오는 요청 데이터 안에 폭탄을 숨겨오면 서버가 뚫립니다. 역사상 가장 유명하고 지금도 털리고 있는 3대 취약점을 알아봅시다.
웹 3대 보안 취약점과 원리
| 공격 이름 | 해커의 수법 | 발생하는 대참사 |
|---|---|---|
| SQL Injection (SQL 주입 공격) | 검색창에 검색어 대신 데이터베이스를 조작하는 해킹 SQL 명령어를 몰래 끼워 넣음 | 해커가 남의 비밀번호를 다 보거나 회원 테이블 전체를 날려버림 |
| XSS (크로스 사이트 스크립팅) | 게시판 본문에 글 대신 악성 자바스크립트 코드를 몰래 숨겨서 작성함 | 다른 착한 유저가 그 글을 읽는 순간, 브라우저가 해킹 코드를 실행하여 해커에게 유저의 지갑이나 아이디가 털림 |
| CSRF (사이트 간 요청 위조) | 해커가 만든 가짜 사기 사이트의 버튼을 무심코 클릭하게 만듦 | 내 브라우저에 남아있던 로그인 상태가 도용당해, 나도 모르게 내 계좌에서 해커 통장으로 돈이 송금됨 |
방패 1: SQL Injection 방어 (안전한 쿼리 작성)
안전한 파라미터 쿼리 사용 원칙
절대 프론트엔드에서 넘어온 글자를 서버의 SQL 쿼리 문장에 '+' 기호로 더해서 이어 붙이면 안 됩니다. (예: `SELECT * FROM users WHERE name = '` + 입력값 + `'`) 반드시 Go 언어의 ORM 패키지나 파라미터화된 쿼리(`?` 기호 사용)를 써야 데이터베이스가 해킹 명령어를 일반 텍스트로 인식하여 방어할 수 있습니다.
방패 2: XSS 방어 (위험한 HTML 태그 치환)
사용자가 쓴 글을 프론트엔드에 그대로 돌려주기 전에, 백엔드에서 악성 해킹 코드인 `<script>` 같은 태그를 화면에 아무 기능 없는 안전한 텍스트로 강제 변환(Sanitize, HTML 인코딩)시켜야 합니다.
방패 3: CSRF 방어 (일회용 비밀번호 챙기기)
돈이 송금되거나 비밀번호가 바뀌는 중요한 액션을 할 때는, 브라우저의 로그인 상태만 믿지 말고 백엔드가 프론트엔드에게 몰래 넘겨주었던 일회용 CSRF 토큰이 함께 날아왔는지 한 번 더 깐깐하게 검사해야 가짜 사이트에서의 요청을 막을 수 있습니다.
보안을 위한 AI 지시 가이드
- 1AI에게 코드를 요구할 때 끝에 '보안을 위해 SQL Injection 방어(Parameterized Query)가 되어 있는지 확인해 줘'라고 덧붙이세요.
- 2게시판 같은 기능을 짤 때는 'XSS 공격을 막기 위해 입력값을 검열(Sanitize)하는 라이브러리를 추가해 줘'라고 지시하세요.
- 3중요한 정보를 수정하는 API라면 'CSRF 방어용 미들웨어나 토큰 검사 로직을 함께 세팅해 줘'라고 요청해야 안전합니다.
개념 퀴즈
퀴즈 답을 맞춰야 학습 완료가 됩니다.우리 서비스의 리뷰 게시판에 어떤 유저가 다음과 같이 악의적인 자바스크립트 코드를 리뷰 내용에 적어서 등록했습니다. [ <script>alert('당신의 토큰을 해커에게 전송합니다!');</script> ] 다른 착한 유저들이 이 리뷰를 읽기 위해 화면을 열자마자 이 악성 코드가 실행되어 정보가 털리는 현상이 발생했습니다. 이 악명 높은 해킹 공격 기법의 이름은 무엇인가요?
3줄 요약
- 1인증(Authentication)은 유저가 누구인지 확인하는 과정이며, 인가(Authorization)는 그 유저가 특정 행동(삭제, 수정 등)을 할 자격이 있는지 검사하는 필수 로직입니다.
- 2SQL Injection 공격은 데이터베이스 명령을 가로채므로, 변수를 문자열 덧붙이기로 조합하지 말고 반드시 파라미터 쿼리(?, ORM)를 사용해야 합니다.
- 3XSS는 게시물에 악성 스크립트를 심는 공격이므로 HTML 치환(인코딩)을 통해 방어하고, CSRF는 가짜 요청을 위조하므로 일회용 토큰 검사를 통해 차단합니다.