배경

앱 화면 검토용 목업을 웹에 올려 두었는데, 링크만 알면 외부인도 볼 수 있어 보안 문제가 됨. 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는 로컬에서 띄울 때만 동작하는 옵션이라 배포에는 영향이 없음.

확인 방법

  1. 로그아웃 상태에서 목업 링크로 직접 들어감 → 로그인 화면으로 보내짐.
  2. 로그인 후 같은 링크로 들어감 → 목업이 보임.
  3. 로컬에서 목업 화면의 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-ForHTTP_CLIENT_IPHTTP_X_FORWARDED_FORHTTP_X_FORWARDEDHTTP_FORWARDED_FORHTTP_FORWARDEDProxy-Client-IPWL-Proxy-Client-IPHTTP_VIAIPV6_ADR 순으로 헤더를 훑고, 값이 있으면 콤마로 잘라 첫 번째 IP만 씀. 헤더가 없으면 request.getRemoteAddr()
  • 헤더 기반 판별이라 프록시·L4 뒤에서는 헤더 조작으로 우회 가능함. 실제 차단은 앞단 장비와 병행할 것
  • 이미 등록된 IP를 또 넣으면 SQI0003(중복된 데이터가 존재합니다)
  • 차단된 IP로 로그인하면 SQI3001(해당 요청에 대한 권한이 없습니다)이 뜸. “권한이 없다”는 문구라 로그인 실패와 헷갈리기 쉬움 — 로그인 문의가 오면 차단IP 등록 여부도 확인할 것
  • 커밋 a754fbcd에서 X-Forwarded-For의 첫 IP만 취하도록 수정됨

화면 문구

차단IP를 입력해주세요., 차단사유를 입력해주세요., 삭제하시겠습니까?, 차단IP 등록, 차단IP 상세

관련