강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

김진규님의 프로필 이미지
김진규

작성한 질문수

React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드

ch7-2. (백엔드) routes/post.js 게시글 생성, 가져오기 (2부)

ipify.org api 호출 시 클라이언트 ip주소를 반환하는지?

해결된 질문

작성

·

18

0

ch-7-2에서
포스트 상세 조회 router 안에서 ipify.org api를 호출하는데

포스트 상세 조회 API를 클라이언트에서 호출할 경우
서버에서 ipify.org api를 호출하기 때문에 의도한바와 다르게 서버 ip 주소가 나오고 클라이언트 IP는 req.ip를 통해서만 얻을 수 있지않나요??

const response = await axios.get("https://api.ipify.org?format=json");
ip = response.data.ip;

답변 2

0

닭강정님의 프로필 이미지
닭강정
지식공유자

안녕하세요. 질문 주셔서 감사합니다!

말씀하신 대로 백엔드 기준으로

const response = await axios.get("https://api.ipify.org?format=json");

axios.get("https://api.ipify.org?format=json")를 쓰면 실제 클라이언트의 IP가 아니라 백엔드 서버의 공인 IP가 반환됩니다.제가 착각했습니다. 죄송합니다.

클라이언트 IP를 얻으려면 req.ip을 쓰거나, 배포 환경에 따라 프록시 헤더를 신뢰하도록 설정하고 다음처럼 가져와야 합니다.

const ip = req.headers["x-forwarded-for"] || req.socket.remoteAddress || req.ip;

따라서 포스트 상세 조회 시 조회수 체크 로직은 아래처럼 수정하시면 됩니다

router.get("/:id", async (req, res) => {
  try {
    const post = await Post.findById(req.params.id);
    if (!post) {
      return res.status(404).json({ message: "게시글을 찾을 수 없습니다." });
    }

    const ip = req.headers["x-forwarded-for"] || req.socket.remoteAddress || req.ip;
    const userAgent = req.headers["user-agent"];

    const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
    const hasRecentView = post.viewLogs.some(
      (log) =>
        log.ip === ip &&
        log.userAgent === userAgent &&
        new Date(log.timestamp) > oneDayAgo
    );

    if (!hasRecentView) {
      post.views += 1;
      post.viewLogs.push({
        ip,
        userAgent,
        timestamp: new Date(),
      });
      await post.save();
    }

    res.json(post);
  } catch (error) {
    res.status(500).json({ message: "서버 오류가 발생했습니다." });
  }
});

정리하면, ipify.org는 서버 IP만 찍히기 때문에 의미가 없고, req.ip 또는 위 코드처럼 x-forwarded-for까지 확인하는 방식으로 바꾸는 게 맞습니다.

혼란 드려 죄송합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 김진규님.

질문해주신 내용에 대해서 설명드리겠습니다. ipify.org API는 요청을 보낸 주체의 IP 주소를 반환합니다. 따라서 서버측 코드에서 axios를 사용하여 ipify.org를 호출하면, 서버의 IP 주소가 반환됩니다. 만약 클라이언트의 IP 주소를 얻고자 하신다면, 클라이언트 측에서 직접 ipify.org API를 호출하거나, 서버로부터 클라이언트 IP를 전송 받는 방법을 고려해야 합니다.

서버에서 클라이언트의 IP 주소를 얻고 싶다면, req.ip를 사용하여 요청의 IP 주소를 가져오는 것이 일반적입니다. 이는 클라이언트가 서버에 요청할 때 자동으로 포함되는 정보입니다.

추가적으로, 관련된 유사 질문이 있어 소개드립니다. 본 문제를 해결하는 방식이나 차이점을 이해하는데 도움이 될 것입니다:

이 링크들은 비슷한 상황을 다루고 있으므로, 문제 해결에 큰 도움이 되리라 생각합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김진규님의 프로필 이미지
김진규

작성한 질문수

질문하기