커뮤니티 사이트 자유게시판 개발이 완료된 후,
댓글 데이터를 가져오는 부분을 검증하던 중 예상치 못한 상황을 마주했다.
브라우저 URL 요청을 통해 AJAX로 데이터를 요청했더니,
회원 정보가 포함된 데이터가 브라우저 창에 그대로 노출되는 것을 발견한 것이다.
문제 발견: 데이터 노출의 위험성
처음에는 단순히 GET 요청으로 AJAX를 검증하려는 의도였지만,
웹 브라우저로 노출된 데이터의 내용을 보니 생각보다 심각했다.
댓글 정보뿐만 아니라 민감한 데이터(아이디 등)가 함께 반환되고 있었던 것이다.
이러한 데이터가 노출되었을 때 회원들에게 미치는 잠재적 위험을 떠올리니, 진심으로 아찔했다.
첫 번째 조치: AJAX 요청 제한
이 문제를 해결하기 위한 첫 단계로, AJAX 요청만 허용하도록 제한하는 로직을 추가했다.
아래와 같이 AJAX가 아닌 요청을 차단했다.
if (!$this->request->isAJAX()) {
return $this->response->setStatusCode(403)->setJSON(['error' => 'Forbidden']);
}
이 조치로 URL을 통해 직접 요청할 경우, 브라우저에는 아래와 같이 "Forbidden" 메시지가 출력되도록 처리했다.
한계점: 개발자 도구에서 여전히 노출되는 데이터
그러나 여기서 끝난 것은 아니었다.
개발자 도구의 Response 탭에서도 데이터가 노출되는 것을 확인할 수 있다.
댓글 데이터에는 여전히 아이디 등 불필요한 정보가 포함되어 있었다
.
이러한 데이터가 클라이언트로 전달될 필요가 없다는 점을 깨닫고,
더 강력한 조치를 취하기로 했다
추가 조치: 클라이언트로 전달되는 데이터 최소화
문제를 해결하기 위해 데이터 구조를 아래와 같이 재구성했다.
* 불필요한 정보 제거: 댓글 데이터에서 아이디와 같이 노출될 필요가 없는 정보를 제거.
* role 키 추가: 댓글 수정/삭제 버튼의 노출 여부를 결정하기 위해 현재 사용자와 댓글 작성자의 관계를 서버에서 판단하고, 이를 클라이언트로 전달
외부 사례 참고: 네이버 카페
해당 문제를 검토하면서 다른 커뮤니티 사이트 중 네이버 카페도 비슷한 문제를 겪고 있는지 확인해보았다.
네이버 카페에서는 웹사이트 화면에서 댓글 작성 시 닉네임만 노출되지만,
개발자 도구에서 요청을 확인해보니 아이디(이메일 계정)와 기타 정보가 함께 노출되고 있음을 확인했다.
이로 인해 데이터 최소화의 중요성을 깨닫는 계기가 되었다.
추가적인 서버 검증 로직
단순히 클라이언트에 표시되는 데이터를 최소화하는 것만으로는 보안을 완벽하게 보장할 수 없다.
따라서 당연히 수정/삭제 API 호출 시에도 반드시 서버에서 추가 검증을 진행하도록 구현해야한다.
예를 들어, 서버는 요청한 사용자의 세션 정보와 댓글의 등록자 ID를 비교하여 권한을 확인한 후 요청을 처리한다.
교훈: 보안은 한 단계씩 발전하는 과정
비밀번호나 민감한 정보가 노출된 것은 아니었지만,
불필요한 데이터가 전달된 것만으로도 보안 측면에서 개선이 필요하다고 판단했다.
보안은 완벽할 수 없으며, 지속적으로 보완해나가는 과정임을 이번 경험을 통해 다시 한번 깨달았다.
앞으로도 데이터 최소화와 검증 로직 강화를 통해 보안을 점진적으로 개선해 나갈 것이다.
그나저나 사이트 개발 진도는 언제나가지? ㅜㅜ
'개발 > 취약점' 카테고리의 다른 글
http 400 505 error code 노출 막기 (0) | 2022.12.08 |
---|