Overview
통합 검색
통합 검색
Overview
요즘 계속 포트폴리오랑 기록 서비스인 ProofyLife를 고민하다 보니까
한 가지 생각이 계속 들었다.
“기록을 잘 남기는 것도 중요한데,
그 기록을 담는 서비스 자체를 내가 직접 만들어본 경험도 필요하지 않나?”
그래서 복잡한 주제 말고,
내가 실제로 자주 쓰는 기능 하나를 서비스로 만들어보기로 했다.
그게 바로 북마크 서비스였다.
사실 북마크는 굉장히 단순한 기능이다.
브라우저에도 있고, 노션에도 있고, 메모 앱에도 다 있다.
그런데 이상하게
링크는 항상 여기저기 흩어져 있고,
나중에 다시 보려고 저장한 것들은 결국 안 보게 된다.
그래서 이런 생각이 들었다.
로그인해서 진짜 나만 쓰는 북마크 공간 하나 있으면 어떨까?
연습용으로도 좋고, 실제로 배포까지 해보기에도 딱 맞는 주제였다.
처음 구현은 비교적 빠르게 끝났다.
로컬에서는 잘 돌아갔고,
닷홈 서버에 배포해서 실제 도메인으로도 접속이 됐다.


그런데 여기서 끝내려고 하니까
계속 마음에 걸리는 게 있었다.
이걸 실제 서비스라고 해도 괜찮을까?
서비스를 어느 정도 정리한 뒤
주변 사람들한테 한번 보여줬다.
그때 거의 공통적으로 나왔던 말이 이거였다.
“근데 이거 로그인 뚫리면 그 사람 북마크 같은 개인 기록 다 털리는 거 아니야?”
이 말 듣고 솔직히 바로 반박이 안 나왔다.
틀린 말이 아니었기 때문이다.
북마크라고 해도 개인 기록이고
경우에 따라서는 충분히 사적인 정보일 수도 있다.
이때부터 관점이 완전히 바뀌었다.
기능이 된다에서
이 구조를 설명할 수 있는가? 로 기준이 옮겨갔다.
북마크 추가, 수정, 삭제는 전부 POST 요청이다.
그럼 자연스럽게 CSRF가 떠올랐다.
그래서 모든 POST 요청에 대해
이 구조를 적용했다.


로그인 상태에서 발생하는 POST 요청이 실제 사용자의 의도인지 확인하기 위해
세션에 CSRF 토큰을 생성하고, 모든 POST 요청에서 이를 검증하도록 했다.
외부 사이트에서 위조된 요청이 들어오는 것을 구조적으로 차단하기 위한 장치다.
기존에는 로그인하면
로그아웃하기 전까지 세션이 계속 유지되는 구조였다.
그런데 이건 너무 위험하다는 생각이 들었다.
그래서 마지막 활동 시간을 세션에 기록하고,
일정 시간(30분) 활동하지 않으면 자동 로그아웃이 되는 구조를 설계했다.

물론 계속 로그인 상태로 남아있으면 사용자에게 편리한 점도 있지만
보안적으로 생각해보았을때 언제든 세션이 남아있다는 문제가 개인정보침해로 이어질 수 있겠다는 생각이 들었다.
수정, 삭제 로직을 다시 점검하면서
가장 신경 쓴 부분이다.
모든 쿼리는 id만 보지 않고 반드시 user_id까지 함께 조건으로 걸었다
다시 말해 URL을 조작해도
구조적으로 남의 북마크에는 접근이 안 된다.

북마크 조회 시 URL 파라미터가 아니라 세션의 user_id를 기준으로 데이터를 가져온다.
이 방식으로 로그인한 사용자 본인의 데이터만 접근 가능하도록 제한했다.
ID를 조작해도 타인의 데이터에는 접근할 수 없다.
피드백 중에는 이런 말도 있었다.
“특수문자나 비밀번호 규칙 같은 것도 더 넣어야 하지 않아?”
이 말도 맞는 말이다.
지금 구조에서는 bcrypt 해시 사용, 최소 길이만 체크까지만 되어 있다.
지금은 완벽한 보안 서비스라기보다는
보안을 의식하고 설계한 개인 서비스정도로 목표로
진행하는 프로젝트이다.
물론 위 피드백처럼 더 개선할 점도 찾아냈다.
그리고 다음 단계로 보완할 것들도 명확해졌다.
지금 당장 다 넣지 않더라도 왜 아직 안 넣었는지는
설명할 수 있는 상태를 만드는 게 목표다.
오늘은 코드보다 주변 피드백을 통해 프로젝트를 다시 본 날이었다.
혼자 만들 때는 괜찮다고 생각했던 것들이
남한테 보여주니까 바로 질문으로 돌아왔다.
그리고 그 질문 덕분에 이 프로젝트는 그냥 토이 프로젝트가 아니라,
보안을 고민했고, 구조를 정리했고, 실제 배포까지 책임지고 마무리한 서비스로 발전시키고 싶다는 생각이 들었다.
댓글 0