
이 글은 인프런 강의 「백엔드 개발자를 위한 서버 보안 실무」 섹션 2의 SSRF 수업을 입문자용으로 풀어 쓴 글이에요.
메신저나 게시판에 링크를 붙이면 제목과 썸네일이 예쁘게 뜨죠. 링크 미리보기 기능입니다. 이 기능은 우리 서버가 그 주소에 직접 접속해서 페이지를 읽어 오는 방식으로 동작해요.
여기서 생각해 볼 점이 있습니다. 우리 서버는 어디까지 닿을 수 있을까요? 외부 인터넷은 물론이고, 사내망, 같은 클라우드 안의 다른 서버, 클라우드가 서버에게만 열어 주는 특별한 주소까지 닿습니다. 바깥의 공격자는 절대 닿을 수 없는 곳들이에요.
회사 건물로 비유하면, 외부인은 로비까지만 들어올 수 있지만 사원증을 찬 택배 기사는 모든 층을 다닐 수 있는 셈이에요. 그런데 이 기사가 누가 시키든, 어디로 가라고 하든 그대로 따른다면 어떻게 될까요?
SSRF(Server-Side Request Forgery) 는 공격자가 우리 서버로 하여금 자기 대신 요청을 보내게 만드는 공격이에요.

정상 사용자는 뉴스 주소를 보내고, 서버는 그 페이지를 읽어 미리보기를 돌려줍니다. 공격자는 주소 자리에 [내부 주소 예시]처럼 서버 안에서만 접근할 수 있는 주소를 넣어요. 서버는 목적지를 가리지 않고 그대로 요청을 보내고, 그 응답이 미리보기 결과에 실려 공격자에게 돌아갑니다.
가장 아픈 목적지는 클라우드 메타데이터 서비스예요. 클라우드 서버는 이 특별한 주소를 통해 자기 정보와, 서버에 붙은 역할의 임시 자격 증명을 받아 씁니다. 이게 미리보기 응답에 실려 나가면, 공격자는 우리 클라우드 계정에서 그 역할이 할 수 있는 모든 일을 할 수 있게 돼요.

그리고 입구도 링크 미리보기만이 아니에요. "이미지 URL로 프로필 사진 올리기", "웹훅 받을 주소 등록하기", "외부 파일 가져오기"처럼 사용자가 준 주소로 서버가 요청을 보내는 기능은 모두 SSRF의 입구가 될 수 있습니다.
가장 먼저 떠오르는 방어는 "입력된 주소 문자열에 내부 주소가 있으면 막자"일 거예요. 하지만 이 방법은 생각보다 쉽게 빠져나갑니다.
그래서 SSRF 방어는 겹겹이 쌓습니다.

택배 기사 비유로 돌아가면, "배송지 목록에 있는 곳만 가고(1), 실제 도착한 층을 확인하고(2), 중간에 배송지가 바뀌면 다시 확인하고(3), 금고실은 출입 카드를 따로 요구하고(4), 애초에 특정 층에는 엘리베이터가 서지 않게(5)" 하는 거예요.
강의에서는 이걸 직접 재현하고 막아 봅니다
SSRF 수업에서는 링크 미리보기 기능으로 메타데이터 자격 증명이 응답에 실려 나오는 장면을 실습 환경에서 직접 재현하고, 한 겹씩 막습니다.
- 표기 변형과 리다이렉트 우회까지 검사하는 목적지 검증 코드
- 메타데이터 보호 설정 전후로 같은 공격이 어떻게 달라지는지 확인
- 공격 입력을 테스트로 남겨 CI에서 회귀를 막는 방법
강의 보러 가기: https://inf.run/XvwyH