작성
·
928
·
수정됨
0
안녕하세요!
현재 올려주신 강의 내용을 바탕으로 쇼핑몰 상품의 정품 등록을 하는 서비스를 구현하려고 하고 있습니다.
정품 등록 과정에서 사용자가 정품 인증 코드를 입력하면, API 서버를 통해 데이터베이스에 해당 코드가 존재하는지 찾은 후, 존재한다면 해당 코드와 사용자를 매칭시키는 방식으로 우선 구현하고자 합니다. (약간 문화상품권 등록 같기도 하네요 ㅎㅎ)
물론 위 내용에 관련된 코드 질문은 아니구요 ㅎㅎ 위와 같은 내용이 구현되었을 때 악의를 가진 사용자가 postman 등 툴을 통해 API 서버에 무작위로 정품 인증 코드를 보낸 후, 정말 우연히 존재하는 코드를 찾은 경우에 그 코드를 사용해서 정품 등록을 할 수 있을 것 같은데, 이를 어떻게 대비하는게 좋을지 궁금합니다. rate limit이 생각나긴 하지만... 그리 완벽한 방법은 아닐 것 같아서요..!!
그리고 API 서버 주소가 외부에 노출이 되지 않는 경우엔 무차별 대입 공격을 하기도 힘들텐데, 개발자도구에서 소스를 확인하면 결국 API 서버 주소가 나오잖아요~ 그래서 API 서버 주소를 쉽게 알아내지 못하게 하는 방법이 있을지도 궁금합니다.
또 하나 구현해야 하는 기능이 사용자 본인이 정품 등록한 제품을 조회할 수 있도록 하는 기능인데요, userID가 API 서버에 전송되면 데이터베이스에서 해당 userID로 등록된 제품들을 찾아서 보여주도록 구축하려고 합니다. 다만 이 경우에도 위와 비슷하게 API 서버 주소를 알고있는 사람이 다른 사람 ID를 API 서버에 전송해서 그 사람의 정품 등록된 제품을 조회할 수 있는 문제점이 있을 것 같은데요, 이를 어떻게 해결하는게 좋을지도 의견 여쭤보고 싳습니다.
요약하자면 다음과 같습니다.:
API 서버에 무작위 정품인증 코드를 보내는걸 어떻게 막는게 좋을까요? 제가 생각한 방법은 rate limit인데, 더 좋은 방법이 있을까요?
API 서버 주소를 개발자도구 등을 통해 쉽게 알아내지 못하게 하는 방법이 있을까요?
userID를 통해 API 서버에서 해당 사용자의 정보를 가져오는 경우, 타인이 API 서버와 통신해서 다른 사용자의 정보를 가져오는걸 어떻게 막을 수 있을지 궁금합니다. 제 짧은 생각으로는 ID를 암호화해서 API 서버와 통신해야 될 것 같은데, 조금 막막한 감이 있네요.. 현재 제가 사용하는 프론트엔드가 react가 아니라 순정 html+JS인지라...
약간 질문이 두서없고 강의 주제랑 조금 벗어난 것 같지만... 잘 부탁드리겠습니다..ㅎㅎ
지금 질문드리는 내용이 결국 API 서버 보안과 관련된 내용인 것 같은데, 혹시나 해당 내용과 관련해서 말씀해주고 싶으신 내용이 있으시다면 설령 TMI라고 생각드실지라도 얼마든 알려주세요!! 열심히 배우겠습니다. 💪
좋은 강의 감사드립니다. 좋은 하루 되세요!
답변 1
0
좋은 질문이네요 ㅎㅎ 이런 질문들 적극 환영입니다!
사용자가 정품 인증 코드를 입력한다는 것은 기본적으로 요청할 때 사용자의 ID와 인증 코드를 함께 보내야 합니다. 보통 무작위 인증 코드를 보내는 Brute Force 방식의 공격을 할 수 있겠지만, 사용자의 ID를 알고 있기에 조금은 간단하게 해결될 것 같습니다. 예를 들어 해당 ID로 틀린 요청을 3번 이상 보냈을 때 해당 정품 등록 과정 자체를 Block하는 방식으로 구현하는 방식이 있습니다!
API 서버 주소는 결국 공개되어야 브라우저에서 통신이 가능합니다! 그래서 누구나 웹 서비스를 사용하는 사람이라면 브라우저 개발자 도구를 통해 어느 API 서버로 요청이 가는지 확인이 가능합니다. 보통은 API 서버는 누구나 접근이 가능하지만 민감한 API 처리의 경우 앞단에 인증체계가 붙어 유효한 토큰을 가진(로그인을 한 사람에게만 부여되는) 요청에만 응답하는 식으로 서버에서 구현을 하게 됩니다.
보통 악의적으로 DDOS 공격과 같이 무작위로 API 요청을 보내는 경우들이 있을 수 있는데 이 경우 전문 업체의 방어 서비스를 사용하는 것도 방법일 것 같습니다 (사실 DDOS 공격의 완벽한 해결책이 없긴 합니다.. 구글도 아직 해결하지 못했다고 하더라구요)
2번 답변이 어느정도 답변이 된 것 같은데요. 결국 걱정하시는 문제는 인증/인가라는 시스템을 이해하시면 해결될 것 같습니다. 결국 로그인 했을 때 암호화된 토큰을 사용자가 가지고 있어서 해당 토큰이 하나의 신분증이 되어 통신한다고 보시면 됩니다. 인증/인가는 제가 예전에 썼던 글을 한 번 읽어보셔도 도움이 될 것 같으며 간단하게 서버 프로젝트를 해봐도 도움이 될 것 같습니다. 요건 구글링해보면 많은 글들이 있어 설명은 생략하겠습니다.
https://tansfil.tistory.com/58
사용자가 사용하는 서비스를 직접 개발해보면서 이런 필요성들을 느끼는 게 가장 빠르게 공부하시는 방법이라고 생각이 들어요~! 공부해보시고 어려운 부분있으면 또 질문주세요!