Skip to content

feat : 교내 Wi-Fi 검증을 위한 서버 측 IP 추출 및 및 Nginx 프록시 대응#17

Merged
Juhye0k merged 3 commits intodevfrom
wifi
Nov 12, 2025
Merged

feat : 교내 Wi-Fi 검증을 위한 서버 측 IP 추출 및 및 Nginx 프록시 대응#17
Juhye0k merged 3 commits intodevfrom
wifi

Conversation

@Juhye0k
Copy link
Copy Markdown
Contributor

@Juhye0k Juhye0k commented Nov 12, 2025

🚀 개요

기존 프론트엔드에서 전달받던 IP 주소 대신, 서버에서 직접 요청자의 실제 IP를 추출하여 교내 Wi-Fi 접속 여부를 판단하도록 로직을 변경했습니다. 또한, Nginx 리버스 프록시 환경에서 발생하던 내부 IP(127.0.0.1) 인식 문제를 해결하기 위해 헤더 기반의 IP 추출 유틸리티를 구현했습니다.

  1. 보안 강화: 클라이언트 요청 바디에 포함된 IP는 위조될 가능성이 있어, 서버가 직접 식별하는 것이 안전합니다.
  2. Nginx 프록시 문제 해결: Nginx를 거쳐 Spring Boot로 요청이 들어올 경우 request.getRemoteAddr()127.0.0.1을 반환하여 Wi-Fi 검증이 실패하는 문제를 해결해야 했습니다.

📝 작업 내용

1. IpUtil 유틸리티 클래스 추가

  • HttpServletRequest의 헤더를 순차적으로 검사하여 실제 클라이언트 IP를 추출합니다.
  • 검사 우선순위: X-Forwarded-For > X-Real-IP > ... > getRemoteAddr()

2. DTO 및 Controller/Service 수정

  • Request DTO 수정: StudyStartRequest, HeartBeatRequest에서 신뢰할 수 없는 ipAddress 필드를 삭제했습니다.
  • Controller: HttpServletRequest를 파라미터로 주입받아 Service 계층으로 전달하도록 변경했습니다.
  • Service: 전달받은 request 객체를 사용하여 IpUtil.getClientIp(request)를 호출, IP를 확보한 뒤 검증 로직을 수행합니다.

3. Wi-Fi 검증 로직 (CampusWiFiValidationService)

  • validateCampusWiFi, validateFromCache 메서드의 시그니처를 변경했습니다.
    • 기존: (String ssid, String bssid, String ipAddress)
    • 변경: (String ssid, String bssid, HttpServletRequest request)

⚠️ Nginx 설정 확인 (운영 배포 시)

이 로직이 정상 동작하려면 운영 서버의 Nginx 설정(nginx.conf)에 아래 내용이 포함되어 있어야 합니다.

location / {
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
}


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

## 릴리스 노트

* **새로운 기능**
  * 서버에서 클라이언트 IP를 신뢰성 있게 감지하는 기능 추가(프록시 헤더 처리 포함)

* **버그 수정**
  * HeartBeat/시작 요청의 BSSID 검증 강화 — BSSID가 필수로 변경됨 (이전의 ipAddress 필드 제거)

* **개선사항**
  * Wi‑Fi 검증이 요청 기반으로 전환되어 정확도 및 로깅 개선
  * 로컬 환경의 DB 스키마 관리 모드 변경(생성 → 업데이트)
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

@Juhye0k Juhye0k requested a review from kon28289 November 12, 2025 01:39
@Juhye0k Juhye0k self-assigned this Nov 12, 2025
@Juhye0k Juhye0k added the enhancement New feature or request label Nov 12, 2025
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Nov 12, 2025

Walkthrough

HTTP 요청에서 클라이언트 IP를 서버 측에서 추출하도록 새로운 유틸리티 IpUtil을 추가했고, 요청 DTO들에서 ipAddress를 제거하여 컨트롤러→API→서비스 계층에 HttpServletRequest를 전달하도록 메서드 시그니처를 변경했습니다. Wi‑Fi 검증 로직은 이제 요청에서 추출한 IP를 사용합니다. 또한 로컬 설정의 Hibernate DDL을 create에서 update로 변경했습니다.

Changes

Cohort / File(s) Summary
IP 유틸리티 추가
src/main/java/com/gpt/geumpumtabackend/global/wifi/IpUtil.java
HTTP 헤더(X-Real-IP, X-Forwarded-For)와 getRemoteAddr()를 검사해 클라이언트 IP를 반환하는 getClientIp(HttpServletRequest) 추가; isUnknown(String) 헬퍼 포함
요청 DTO 수정
src/main/java/com/gpt/geumpumtabackend/study/dto/request/StudyStartRequest.java, src/main/java/com/gpt/geumpumtabackend/study/dto/request/HeartBeatRequest.java
DTO에서 ipAddress 필드 제거, bssid@NotBlank(message = "BSSID는 필수입니다") 제약 추가
컨트롤러 및 API 계층 업데이트
src/main/java/com/gpt/geumpumtabackend/study/api/StudySessionApi.java, src/main/java/com/gpt/geumpumtabackend/study/controller/StudySessionController.java
startStudySession, endStudySession, processHeartBeat 등 공개 API/컨트롤러 메서드들에 HttpServletRequest 파라미터 추가
서비스 계층 업데이트
src/main/java/com/gpt/geumpumtabackend/study/service/StudySessionService.java
startStudySession(...)updateHeartBeat(...) 시그니처에 HttpServletRequest 추가; DTO의 IP 사용 대신 요청에서 IP 추출; Wi‑Fi 검증 실패 시 로깅 및 예외 매핑 처리 경로 추가
Wi‑Fi 검증 서비스 업데이트
src/main/java/com/gpt/geumpumtabackend/wifi/service/CampusWiFiValidationService.java
validateCampusWiFi(...), validateFromCache(...) 시그니처를 String ipHttpServletRequest로 변경; 내부에서 IpUtil.getClientIp()로 IP 추출, 캐시 키/로그에 추출한 IP 사용; 로깅 강화
설정 파일 변경
src/main/resources/application-local.yml
spring.jpa.hibernate.ddl-autocreate에서 update로 변경

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant Controller
    participant API
    participant Service
    participant CampusWiFiService
    participant IpUtil

    Client->>Controller: HTTP 요청 (start/process...)
    Controller->>API: 전달 (HttpServletRequest 포함)
    API->>Service: 호출 (HttpServletRequest 포함)

    Service->>IpUtil: getClientIp(HttpServletRequest)
    IpUtil-->>Service: clientIp

    Service->>CampusWiFiService: validateCampusWiFi(ssid,bssid,HttpServletRequest)
    CampusWiFiService->>IpUtil: getClientIp(HttpServletRequest)
    IpUtil-->>CampusWiFiService: clientIp

    alt 검증 성공
        CampusWiFiService-->>Service: valid
        Service-->>API: 성공 응답
    else 검증 실패
        CampusWiFiService-->>Service: invalid / 예외
        Service-->>API: 예외 전파
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • 추가로 주의해서 검토할 파일/영역:
    • IpUtil.getClientIp()의 헤더 파싱 및 콤마 처리/끝단 IP 선택 로직
    • CampusWiFiValidationService의 캐시 키 생성 및 캐시 미스/에러 처리 경로
    • 서비스/컨트롤러/API 전반에서 HttpServletRequest 전달의 일관성 및 호출 지점 누락 여부
    • DTO 변경에 따른 클라이언트 호환성(요청 스펙) 영향

Possibly related PRs

Suggested reviewers

  • kon28289

Poem

🐰 헤더 속 실마리 찾아 달려가네,
서버가 직접 읽어 진실을 전하네.
BSSID는 꼭 챙기고 IP는 헤더에서,
검증은 단단히, 로그는 반짝이네.
작은 토끼가 축하의 당근을 드려요 🥕✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed 제목은 PR의 주요 변경사항인 서버 측 IP 추출 및 Nginx 프록시 대응을 명확하게 요약하고 있습니다.
Description check ✅ Passed 설명은 리포지토리의 필수 템플릿 구조(개요, 주요 변경 사항)를 따르며 충분한 기술적 세부사항을 포함하고 있습니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch wifi

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7b9554a and f324c44.

📒 Files selected for processing (1)
  • src/main/java/com/gpt/geumpumtabackend/global/wifi/IpUtil.java (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/java/com/gpt/geumpumtabackend/global/wifi/IpUtil.java

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ef10ed4 and 7b9554a.

📒 Files selected for processing (8)
  • src/main/java/com/gpt/geumpumtabackend/global/wifi/IpUtil.java (1 hunks)
  • src/main/java/com/gpt/geumpumtabackend/study/api/StudySessionApi.java (3 hunks)
  • src/main/java/com/gpt/geumpumtabackend/study/controller/StudySessionController.java (3 hunks)
  • src/main/java/com/gpt/geumpumtabackend/study/dto/request/HeartBeatRequest.java (1 hunks)
  • src/main/java/com/gpt/geumpumtabackend/study/dto/request/StudyStartRequest.java (1 hunks)
  • src/main/java/com/gpt/geumpumtabackend/study/service/StudySessionService.java (4 hunks)
  • src/main/java/com/gpt/geumpumtabackend/wifi/service/CampusWiFiValidationService.java (3 hunks)
  • src/main/resources/application-local.yml (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
src/main/java/com/gpt/geumpumtabackend/study/service/StudySessionService.java (1)
src/main/java/com/gpt/geumpumtabackend/global/wifi/IpUtil.java (1)
  • IpUtil (5-27)
src/main/java/com/gpt/geumpumtabackend/wifi/service/CampusWiFiValidationService.java (1)
src/main/java/com/gpt/geumpumtabackend/global/wifi/IpUtil.java (1)
  • IpUtil (5-27)
🔇 Additional comments (1)
src/main/resources/application-local.yml (1)

30-30: PR 목표와의 관계 명확히 필요

Hibernate DDL 전략이 create에서 update로 변경되었습니다. 이 변경이 Wi-Fi 검증 및 IP 추출 개선(PR 목표)과 직접적인 관련이 있는지 확인이 필요합니다. 또한 이 변경 사항의 동기를 코드 주석이나 커밋 메시지에 명시하면 추후 유지보수에 도움이 될 것입니다.

개발 환경에서 update는 일반적으로 create보다 안전하지만, PR 범위에 포함된 이유를 명확히 해주시기 바랍니다.

Copy link
Copy Markdown
Contributor

@kon28289 kon28289 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다!

@Juhye0k Juhye0k merged commit ccca620 into dev Nov 12, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants