배경
앱 화면 검토용 목업을 웹에 올려 두었는데, 링크만 알면 외부인도 볼 수 있어 보안 문제가 됨. 2026-07-07에 접근 제한 방식을 검토함.
| 검토한 방식 | 결론 |
|---|---|
| 필요할 때만 재배포 | 불가능. 매번 배포할 수 없음 |
| IP로 제한 | 불가능 |
| 관리자가 화면에서 on/off | 상태를 DB에 저장하거나 하드코딩 후 재배포해야 해서 과함 |
| 로그인한 사람만 접근 | 채택. 기존 계정 체계를 그대로 씀 |
변경 내용
목업을 상시 노출하되 로그인해야만 볼 수 있게 함. Vue 라우트로 올리면 기존 로그인 처리가 그대로 적용됨.
메뉴에 버튼은 두지 않고 링크로만 접근함.
로컬에서 403이 날 때
vue.config.js의 devServer 프록시에서 /api/v1이 중복돼 403이 났음.
VUE_APP_API_URL에 이미 /api/v1이 들어 있는데 프록시 경로에도 붙기 때문임.
proxy: {
"^/api/v1": {
// VUE_APP_API_URL 에 /api/v1이 포함돼 있어 중복됨
target: process.env.VUE_APP_API_URL.replace(/\/api\/v1\/?$/, ''),
changeOrigin: true,
},
}devServer는 로컬에서 띄울 때만 동작하는 옵션이라 배포에는 영향이 없음.
확인 방법
- 로그아웃 상태에서 목업 링크로 직접 들어감 → 로그인 화면으로 보내짐.
- 로그인 후 같은 링크로 들어감 → 목업이 보임.
- 로컬에서 목업 화면의 API 호출이 403이 아닌지 네트워크 탭에서 확인함.
로그인 후 원래 보던 목업 경로로 되돌리는 처리는 2026-07-15 기준 보류 상태임.
SMC 차단 IP 관리
위 목업 제한과 별개로, 시스템 관리자 웹(SMC)에는 IP 단위로 로그인을 막는 화면이 따로 있음(2026-09-16 코드 확인). LMC(관리자 웹)에는 IP 화이트리스트·차단 기능이 없고 X-Forwarded-For 헤더를 그대로 신뢰함(공개노트/개발/모듈/LMC 관리자 웹).
- 화면:
/sysSet/block-ip. 목록·상세 모두 이 경로 안의 컴포넌트(blockList.vue,blockDtl.vue)로 처리됨 - 입력 항목: 차단IP(
connShtoIpad, PK), 차단사유(shtoRsnCts) - 저장 테이블:
cmn.tb_conn_shto_ipad_m - API:
GET/POST/PUT/DELETE /api/v1/sysmngr/security/block-ip, 상세GET .../block-ip/{ip}
실제 차단 범위
- 로그인 API(
/api/v1/cert/login)에서만 차단 검사가 일어남. 다른 API는 검사하지 않음. 즉 로그인을 막을 뿐 이미 토큰을 가진 세션은 막지 못함 - 차단은 완전일치임. 부분 일치·대역(CIDR) 차단 불가
- 클라이언트 IP 판별은
IpUtil.getClientIP()가 담당함.X-Forwarded-For→HTTP_CLIENT_IP→HTTP_X_FORWARDED_FOR→HTTP_X_FORWARDED→HTTP_FORWARDED_FOR→HTTP_FORWARDED→Proxy-Client-IP→WL-Proxy-Client-IP→HTTP_VIA→IPV6_ADR순으로 헤더를 훑고, 값이 있으면 콤마로 잘라 첫 번째 IP만 씀. 헤더가 없으면request.getRemoteAddr() - 헤더 기반 판별이라 프록시·L4 뒤에서는 헤더 조작으로 우회 가능함. 실제 차단은 앞단 장비와 병행할 것
- 이미 등록된 IP를 또 넣으면
SQI0003(중복된 데이터가 존재합니다) - 차단된 IP로 로그인하면
SQI3001(해당 요청에 대한 권한이 없습니다)이 뜸. “권한이 없다”는 문구라 로그인 실패와 헷갈리기 쉬움 — 로그인 문의가 오면 차단IP 등록 여부도 확인할 것 - 커밋
a754fbcd에서X-Forwarded-For의 첫 IP만 취하도록 수정됨
화면 문구
차단IP를 입력해주세요., 차단사유를 입력해주세요., 삭제하시겠습니까?, 차단IP 등록, 차단IP 상세