[SPRING] IP접근 제어

 

해당 기능의 경우에는 관리자 페이지 등

허가된 IP만 접근 할 수 있게 하거나, 특정 IP를 차단 할 경우 사용했습니다.

 

DATABASE

 

우선, 접근 제어 할 IP 를 저장할 DB 테이블 생성.

SEQ        NOT NULL NUMBER         
RANGE    NOT NULL VARCHAR2(30)  // 범위 지정(SOLO or BETWEEN)
ADDRESS NOT NULL VARCHAR2(30)  // IP주소(범위의 경우 ~로 구분)
REG_DT   NOT NULL DATE               // 등록일

데이터 예시

 

JAVA

 

1
2
3
4
5
6
7
8
9
10
/**
      * IP를 long타입으로 변환
      * @param ipAddress
      * @return
      */
     public static long ipToLong(String ipAddress) {
         String[] ipAddressTemp = ipAddress.split("\\.");
         long ipAddressLong = (Long.parseLong(ipAddressTemp[0]) << 24+ 
(Long.parseLong(ipAddressTemp[1]) << 16+ 
(Long.parseLong(ipAddressTemp[2]) << 8) + (Long.parseLong(ipAddressTemp[3]));
         return ipAddressLong;
     }
cs

이렇게 메소드를 대충 만들어 주신 후

해당 IP가 저장된 DB에서 제어할 IP리스트를 뽑아 request.setAttribute 해주시면 됩니다.

JSP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<%
    String ipAddress = (String) request.getRemoteAddr();
    long ipLong = CommonUtil.ipToLong(ipAddress);
    
    List ipAuthList = (List) request.getAttribute( "ipAuthList" );
    
    if(ipAuthList != null && !ipAuthList.isEmpty() ) {
        for(int i = 0; i < ipAuthList.size(); i++) {
            Map rsMap = (Map) ipAuthList.get(i);
            if(CommonUtil.nvl(rsMap.get("RANGE")).equals("BETWEEN")) {
                String[] ipRange = CommonUtil.nvl(rsMap.get("ADDRESS")).split("~");
                if(ipLong >= CommonUtil.ipToLong(ipRange[0]) && ipLong <= CommonUtil.ipToLong(ipRange[1])) {
                    auth ++;
                }
            } else {
                if(ipLong == CommonUtil.ipToLong( CommonUtil.nvl(rsMap.get("ADDRESS") ) ) ) {
                    auth ++;
                }
            }
        }
    }
    
    if( auth == 0) {%>
        <script type="text/javascript">
            alert("접근 허용된 IP가 아닙니다.");
            location.href = "https://www.yourDomain.com";
           </script>
<%    }%>
cs

 

이건 해당 IP만 접근 가능하게 하는 부분이므로 IP차단의 경우 auth의 값을 1이상일때 적용시키면 됩니다.

해당소스의 적용 위치는 include_header입니다.

 

반응형