제2의 비엔지니어 인생관을 꿈꾸며

Posted
Filed under Network
사용자 삽입 이미지
이번에 설명할 기능은 바로 압축기능입니다. 요즘은 x86 서버가 고성능이 때문에 서버단에서 DB데이터나 패킷까지 압축하는 방법으로 최소한의 트래픽으로 병목현상을 줄이고 시간을 단축시키는것 즉 이것을 튜닝이라고 합니다. 웹사이트도 서버단에서 압축과 캐쉬 기능으로 성능을 극대화 하는거와 비슷하게 보면 되겠습니다.
대부분 말만 자기네 솔루션 및 제품 기술 서비스가 제일 빠르고 좋다고 합니다. 그러나 막상 분석해보면 그냥 영업용 멘트일뿐 현실을 전혀 그렇지 않은게 전부라고 보면 되겠습니다.
전 직접 확인하지 않으면 몸이 근질근질 해서 테스트 해봤습니다.

사용자 삽입 이미지

압축률이 어마어마 합니다. 실제 VPN이 사용한 패킷은 너무 적습니다.
이거 레알? 할사람들 많을거고 자빠질 사람 많을겁니다. 하지만 사실입니다.
DB튜닝 잘하는 사람 몸값 높습니다. 이유는 서비스의 두뇌이고 핵심이기 때문에 기업에서 대우가 좋습니다. 물론 당사자들도 책임부담과 역할비중이 높은것도 있기도 합니다.

VPN 튜닝도 앞으로 엄청난 변화를 불러올것입니다.

KORNET1
2018/12/07 02:05 2018/12/07 02:05
Posted
Filed under Network
사용자 삽입 이미지



KORNET1 
수개월 연구끝에 서비스 오픈을 준비하였습니다. 이건 마약입니다. 속도 및 안정성 그리고 그 숨막히고 답답했던 모든 스트레스를 해소 할수 있는 유일한 탈출구를 연구끝에 완료하였습니다.

유투브, 구글, 넷플릭스, 페북, 포탈 동영상, 게임, 뉴스, 카카오톡 음성통화, 라인...

모든 서비스 업체 VPN을 다 분석했지만 글로벌 및 국내 단독 서비스입니다.

사이트 바로가기
2018/12/05 23:28 2018/12/05 23:28
Posted
Filed under Study

웹 문서 인코딩의 시련
웹 개발에  있어 인코딩의 문제는, 아직도  헛갈리거나,  그때그때? 구글링을 통해서 해결 하곤 한다.
(그리고 또 다시 문제에 봉착하면, 또 다시 구글링을 통해 해결한다.  본인이 그렇타 ㅠ)

웹은 '페이지' 이고 '문서' 이다.  문서 한 페이지 한 페이지 마다,  페이지 속성에서 언어설정이 가능하다. 유니코드가 표준화(?) 되면서, 기존에 euc-kr 을 고수하던 페이지들은 유니코드로 많이 변경되었다. 나름  유니코드로 자리잡아가는 과도기가 끝을 지나고 있기는 하다. 하지만,  아직도 업무적으로 또는 기존 솔루션의 유지,  PG사 리턴값 , 서드파티 업체에서는 제공되는 API 나 서브밋 페이지들에서 넘어오는  정보들이 인코딩(특히 한글)이
 맞지 않아  깨진 문자들때문에 고생했던 경험들이 한 두번씩 있으리라 생각된다.

그래서 이번기회에 완전히 이해하고 넘어 가고자 정리했다. (찾아보고, 정리하면서 본인도 공부가 되어 좋다.)


웹에서 전달되는 인코딩의 종류
웹 페이지는 특성한 클라이언트 페이지에서 서버로 전달하는 구조를 가지고있다. 그게 아작스건 일반 웹폼이던 뭐든  기본구조이다. 그래서 인코딩은 크게 클라이언트 인코딩 / 서버인코딩으로 나눌 수 있다.  이미 알고있는 이야기이지만, 클라이언트 단은 javascript  , 서버단은 asp , asp.net jsp , php 기타 등의 서버 페이지들 이다. 클라이언트에서 전달된 text 정보들이 서버단으로 넘어가면서 서로 다른 인코딩 페이지로 구성되어 있다면 깨지기 마련이다. 그래서 항상 그렇게 이야기를  많이한다. "Url 인코딩" 또는 "인코딩" 해너 넘겨주세요.

ㆍJavascript(클라이언트) Encode/Decoding


javascript 에서의 3가지 인코딩 함수가 있다.

(아래설명에 있지만 escape는 더 이상  사용하지 않는 함수로 구분되어있다.)

- escape (
unescape)
- encodeURI(decodeURI)
- encodeURIComponent(≠decodeURIComponent)

참고로 테스트 문자열은 영/숫/한글 혼영 + 특수문자 + URL 문자열로 일부 넣어봤다. (아래참조)
테스트 문자열 "test__@__$__#__&__/__?__;__=__\__1234_한글"

뒤에서 따로 디인코딩을 해보겟지만 (≠unescape) 이런식으로 디코딩 함수를 표기해 두었었으니 참고하자. 복잡한건없다. 아래코드를 작성하여 실행해보자.

<!DOCTYPE Html>
<html>
<body>
 
<script language="javascript">
 
      var str = "test__@__$__#__&__\__/__1234_한글";
  
      document.write("<B>원본 : </B>" + str );
      document.write("<BR><BR><BR>");
      document.write("<B>escape :</B> " + escape(str)); 
      document.write("<BR><BR><BR>");
      document.write("<B>encodeURI :</B> " +encodeURI(str));
      document.write("<BR><BR><BR>");
      document.write("<B>encodeURIComponent : </B>" + encodeURIComponent(str));
 
 </script>
</body>
</html>


[결과]
사용자 삽입 이미지

먼저 "__" 언더바 2개로 문자를 각각 구분하였다.(언더바는 영문자와 같이, 인코딩이 따로 되지않아서, 데이터를 육안으로 구분하기 쉽게 하게 위해넣었다.


● escape 와 encdoeURI (encodeURIComponent) 

크게보면 두 가지의 경우  인코딩 방식이 다르다. 
첨언하자면, escape는 더 이상 표준(?)함수가 아닌, 하위호환성을 위해 유지되고있는 함수일뿐이므로, 사라질 수도있으니 encodeURI 관련 함수를 이용하도록 하자

escape는 유니코드 인코딩 방식이고 , 
encodeURI (encodeURIComponent) URI 인코딩 방식이다.

1234 숫자뒤에 한글이인코딩된것을 보면 알수있다. escape 의경우  한글과 일부 특수문자들을 인코딩 하는것을  알 수 있다. 영문, 일부특수문자 , 숫자등 모두 인코딩 하지않는다. 그대로 전송한다. 자세히 히보면  $ 나 # 의 1byte 문자의경우 %23 한글처럼 2byte의 경우 한 %uD55C 로 인코딩되는 것을 알수있다.
(ASCII 코드를 유니코드로 인코딩 한다.)


encdoeURI 와 encodeURIComponent 경우 한글을 인코딩하는 방식은 같으나. encdoeURI 는 URL 에 사용되는 몇가지 특수문자(아래참조) 를 제외하고 인코딩 되며, encodeURIComponent 는 그것을 포함한 문자들을
인코딩 한다.
구분 인코딩 안되는 문자
encodeURI
      ; , / ? : @ & = + $ – _ . ! ~ * ‘ ( ) # a-z 0-9
encodeURIComponet

 – _ . ! ~ * ‘ ( ) a-z 0-9

솔직히 저런거 외우는사람 몇이나 될까? 그냥 URL 쿼리 전송시 사용되는 
.aspx?a=1&b=c&#aaa  에서 ?,&,# 등이 인코딩 안되는건 encodeURI 모두 인코딩되는건 encodeURIComponent 라고 생각하면 간편하다. :)

여담으로,  회원가입/로그인시  Ajax(UTF-8) 처리로 인해 서브밋(EUC-KR) 페이지 인코딩이 맞지 않는다면 encodeURIComponent 로 인코딩하는것이 좋다. 패스워드에는 특수문자를 이용할 확률이 높기때문이다.
encodeURI를 사용 할 경우 몇몇의 특수문자들은  웹서버가 인코딩하기때문에 원하지 않는 문자열이 저장된다.


 ㆍAsp , Asp.net (서버) Encode/Decoding


ASP 와 ASP.Net 은 또다른 인코딩 방식으로 출력값을 리턴한다.
ASP 의 경우 javascript 인코딩된 (위의 3가지) 값들을 디코딩하는 함수가(내장함수) 사실없다. 만들어써야한다. 대신 runat="server" 로 javascript 함수를 그대로 쓸수있다.


ㆍ먼저 ASP.Net을 살펴보자.
(화면이 깨지는관계로 이미지로 대체했고, 소스는 다운받게해두었다.)
사용자 삽입 이미지
asp.net 인코디/디코딩 소스

 

(일단 주석은 무시하고 인코딩만 해보자)


[ Asp.net 결과 ]
사용자 삽입 이미지







javascript 결과와 다른방식으로 인코딩한다.


ㆍ ASP(classic ASP) 방식을 살펴
<% Response.Write(server.urlencode("test__@__$__#__&__/__?__;__=__\__1234_한글")) %>



[ classic ASP 결과]
사용자 삽입 이미지




 

서버측에서 인코딩된 문자열을 클라이언트측에서 디코딩할수 있는 함수는없다(내장함수로는안된다)
단 클라이언트 측에서 인코딩된 문자열을 서버측에서는 가능한다.
ASP.Net 의 경우 HttpUtility.UrlDecode 함수 하나면 unescape  / decodeURI / decodeURIComponent 를 모두 대체가 가능하다. classic ASP 의 경우 ruat=server 속성을 이용해
자바스크립함수를 서버함수로 따로 각각 3개다 모두 만들어줘야한다.

ㆍ마지막으로 classic ASP 와 ASP.Net 의 디코딩 화면을 확인하면서 마치기로 하자

 Asp.net 에서 HttpUtility.UrlDecode함수의 활용

사용자 삽입 이미지
(위에 asp.net 소스를 다운받아 주석을 풀면 디코딩이 된다.)

[ 결과 ]
사용자 삽입 이미지










javascript 으로 인코딩된 3가지 값들이 함수 1가지로 모두 디코딩 되는것을 볼 수 있다.




ㆍ ASP(classic ASP) 방식을 살펴보자 
    Classic ASP 에서는 Runat=server 를 활용하여 javascript  함수를 서버용으로 만들어줘야한다.
 <%
      <script language="javascript" runat="server">
             function  asp_unescape(s) {    return unescape(s);  }
             function  asp_decodeURI(s) {    return decodeURI(s);  }
             function  asp_decodeURIComponent(s) {    return decodeURIComponent(s);  }
      </script>
      <%
         Response.write("asp_unescape" & _
                                    asp_unescape("test__@__%24__%23__%26__/__%3F__%3B__%3D____1234_%uD55C%uAE00") &  _
                                    "<BR><BR>")
         Response.write("asp_decodeURI" & _
                                    asp_decodeURI("test__@__$__#__&__/__?__;__=____1234_%ED%95%9C%EA%B8%80") & _
                                    "<BR>
 <BR>")
        Response.write("asp_decodeURIComponent" & _
                                       asp_decodeURIComponent("test__%40__%24__%23__%26__%2F__%3F__%3B__%3D____" & _      
                                      "1234_%ED%95%9C%EA%B8%80")& "<BR><BR>")

%>

<결과>
사용자 삽입 이미지
  runat 서버로 추가된 javascript 함수들이 asp 내에서 정상적으로 작동하는것을 볼수있다

2018/11/30 10:47 2018/11/30 10:47
Posted
Filed under MSSQL
● 데이터의 암호화  vs  난독화 

사용자로 부터 입력된 데이터는 DB 에 저장되고, 입력된 데이터는  누구나 볼 수 있는 문자(영문,한글포함) 숫자 형태로 저장되는게 일반적이고, 당연하다.

업무적인 처리(보안)을 위해 간혹 개인정보 또는 누구도 알수없는 정보로 저장되기위해서 암호화를 강행 하곤한다, (사실 암호환 한다는자체가 '정보' 로서의 의미 '상실' 이다 ) 

단지, 입력받은 변수의 값을 pwdcompare 함수로, 이미 암호화된 원본값과  비교하여 같은지에대한 구분이 , 최대한 우리가 얻을수 있는 정보(?) 인 셈이다.

비밀번호를  한발 양보 하여  암호화 처리된다고 하자, 우리도 어차피 관심밖의 데이터이다, 하지만  전화번호 , 주소  그 이상의 통계 또는 마케팅용등의 활용 가치가있는데이터라면, 이야기는 달라진다.

해킹을 안당하거나 데이터가 유출되지 말아야하는게 최선의 방법이지만, 적은 내부에도 있다. 나만보고 남은 못보는 방법 이라면 , 그나마 여러가지 방법중 난독화가 최선의 방법중 하나 아닐까 생각한다.

난독화란 말그대로 , 읽기 어렵게 할 뿐  암호화처럼 못읽게하는게 아니기때문에 완벽한 보안이 될수는 없다.
아래  장점과 단점에대해서 고민해보자,

 장점은 ①나만 보고, 다른사람은 보기 힘드게 한다는것이고(못보는것이 아니다) ② 난독화의 알고리즘을 내가 마음대로 만들어내어 적용할수있다. 단점은, 해독이 가능하기때문에, 누구든 그 패턴을 알면  해독이 가능해진다.(나도 볼 수 있다면 남도 볼 수 있다.) 단, 나는 봐야하는데이터 이기때문에 그만큼 복잡하게 해둘필요는있다 예를들면 전화번호 12자리 12byte의 난독화를 위해 아래 예제는 50byte를 소진했으나, 더 랜덤하고 더 복잡하게하여 100byte 200byte 를 사용한다면 그만큼 더 복잡해질수 있는 잇점이있다.



난독화 시나리오

'알고리즘' 이라고 이름 붙이기엔 너무 '단순해서' 시나리오로 붙여봤다, 포스팅을위해 심플하게 만들었으니 이해하자.

난독화 데이터길이는 총 50byte,  입력된 전화번호 신 11자리 (구 10자리) 를... 각각  랜덤위치로 위치시키되,전화번호는 자릿수는 1자리 즉, 1byte로 표기한다. 010이면 왔으면 '0' , '1' ,'0'  각각 1byte 씩 3byte 가 되겟다,  랜덤 자릿수는 2자리로 표기한다. 랜덤자리수 5가 나왔으면,  05로 기록한다. 다시 전화번호로 돌아와서, 10자리일경우 11자리로 만들고 마지막데이터를 더미로 채워 총 11자리로 만든다. 이때 전화번호 10자리의 경우 마지막숫자는없으므로, 자릿수를 '00' 으로 기록하기로 했다. 만약  난독화를 해독중 00 의 자릿수가나오면 그건 10자리 전화번호가 되겟다.

아래는 총 데이터 길이 구조이다. 


총 데이터 길이 : 50byte
---------------------------------------------------------
전화번호 11자리 :  11자리  = 11byte* 1byte = 11byte
위치정보 index  22자리 : 11개 * 2byte = 22byte
더미(가짜)전화번호 17자리 : 17개 * 1byte  = 17byte
------------------------------------------------------------
11byte + 22byte + 17byte = 50Byte


Create  function fn_EncTelTest(@gTel varchar(20))
        returns varchar(50)
as  Begin

-- 함수에 필요한 각종 변수 선언
declare @tel varchar(20) -- 전화번호 변수
declare @tel_len tinyint   -- 전화번호 길이변수
declare @tel_tmp tinyint -- 전화번호 1자 1자 자를때 @tel_len 만큼 잘랐는지 사용할 임시변수
declare @rnd_num tinyint -- 전화번호가 들어갈 자리 번째 랜덤수
declare @telNo char(1) -- 전화번호를 1자 1자 잘라서 가지고있을 변수
declare @telOrd varchar(50) -- 전화번호 1자 1자가 위치정보를 가지고있는 index 번호
declare @telInfo varchar(50) -- 전화번호 + 위치번호 + 더미데이터를 포함한 총 난독화된 정보 보유 
declare @dummyOrd varchar(50) -- 전화번호 + 위치번호를 제외한 더미데이터 위치 정보순서
declare @dummyNo tinyint -- 더미위치에 들어갈 가짜 숫자 
declare @chkOK tinyint -- 번호검증및 중복난수 체크
declare @chkOrd varchar(50) -- @telOrd를 @chkOrd 에 넣고 중복된 자리 index 가 없는지 조사할 임시 체크 index
declare @chkNum varchar(2)  -- @chkOrd 를 1개자리 잘라서 가지고있을 변수
-- 벨리데이션된 핸드폰 번호가 넘어왔따는 가정하에 공백과 하이픈 제거  숫자로만 10 or 11 로정리
set @tel = @gTel
set @tel = replace(replace(@tel , ' ' , '' ) , '-' , '')
set @telOrd = ''

-- 번호 검증 및 중복된 난수없이 모든게 완료되었다면 @chkOK 는 1 이다.
-- 50byte 로 전화번호와 전화번호가 있는 자리수를 
set @chkOK = 1  -- 1:OK 0:NO
set @tel_tmp = 1
set @tel_len = len(@tel)
set @telInfo = ''
-- 핸드폰번호라 10자리  또는 11자리 이어야 난독문자열생성
-- 단 ,10자리 이건 11자리이건 11자리 취급하여 자릿수를 만들고 10자리일겨웅 마지막 숫자를 더미로 생성
-- 010-000-0000 10자리 / 또는 010-0000-0000 11자리  '-' 제외한 자릿수
-- 정상적인 핸드폰 번호가 넘어왔는지 자릿수로 비교한다.
-- 참고로 function 안에서 mssql 에 random 함수를 사용할수 없다. v_rand_view 테이블 생성 
/*
       CREATE VIEW dbo.v_rand_view
       As
              Select Rand() as random_num
*/
IF len(@tel) = 10 or len(@tel) = 11 Begin

     -- 전화번호 자릿수만큼 돌면서 필요한 랜덤 위치를 생성한다.     
       while @tel_tmp <= @tel_len
       Begin

              SELECT  @rnd_num = convert(tinyint , (random_num*28) + 1)  FROM dbo.v_rand_view

           -- 총 50byte 에서 전화번호  22byte 를 빼면 28이니 난수가 28보다 크면안된다.
           -- 나머지는 전화번호 자릿수를 위해 index 로 사용된다.
       
      IF @rnd_num > 28   
                     set @rnd_num = 28
             IF @rnd_num  <=  0
                      set @rnd_num = 1

 
            Set @chkOrd = @telOrd

             -- 1개라도 만든 자릿수가 @chkOrd 에 있다면 지금 만들어진 index 자릿수가 기존에 있는 숫자아 
             --  같은지 비교해서 같은 자릿수에 중복으로 들어가면 전화번호가 사라지니,
             -- 1번이라도 쓴적이없는 index 가 돌도록 무한루프 중복된 index 가 없어야 종료
       
       While rtrim(ltrim((@chkOrd))) <> ''
               Begin
                     IF rtrim(ltrim((@chkOrd))) <> '' Begin
                            set @chkNum = replace(left(@chkOrd , 3) , ':' , '')
        
                     IF convert(tinyint , @chkNum) = @rnd_num  begin
                                      set @chkOk = 0
                                      break
                               End 
                               Else 
                               Begin
                                      set @chkOk = 1 
                                      set @chkOrd = substring(@chkOrd ,4,100)
                               End  
                    End  
               End  -- 안쪽 While 끝
          -- 중복된 검증된 수가 없다면, 랜덤수 멤버자격완료 2자리수로 만들어준다.
          -- 중복체크시 편하게하기위해 구분값을 : 로 임시로 활용한다.(차후에 모두제거)
        
               IF @chkOk =1 begin
                       Set @telOrd = @telOrd + 
                               Case when @tel_tmp > 1
                                      then ':'
                                      else ''
                                End
                                      +
                               Case when len(@rnd_num) = 1 
                                      then '0' + convert(char(1),@rnd_num)
                                      else convert(char(2) , @rnd_num)
                                End
                               Set @tel_tmp = @tel_tmp + 1   
                 End -- IF 끝
           End -- 최상 While 끝
   -- @telOrd 22자리 + : 10자리 = 32자리
  --  @telOrd 에 전화번호가 들어갈 자리 index 를 가지고있다.
   
    Set @telOrd = replace(@telOrd , ':' , '')

       IF len(@telOrd) < 22
              Set @telOrd = @telOrd + replicate( '0' , 22 - len(@telOrd) )

   
    Set @dummyOrd = @telOrd
       -- 랜덤생성된 자릿수에 전화번호를 채워 넣는다.
       -- 실제 DB에저장 데이터를 생성한다. 
       -- 0 이 아닌 숫자로 채워넣을것
       -- 전화번호 22byte 를 넣을 가짜위치 더미 28byte 생성
       Set @tel_len = 0

       while @tel_len < 28
       begin
              SELECT  @rnd_num = convert(tinyint , (random_num * 9) + 0)  FROM dbo.v_rand_view
              set @telInfo = @telInfo + convert(char(1) , @rnd_num)
              set @tel_len = @tel_len + 1
       End


     -- 실제 입력받은 전화번호를 하나하나 자르면서 length 가 0이될때까지 
     --  현재 실제위치가 들어갈 index 는 Set @dummyOrd = @telOrd 에  있다. (변수명이 좀 혼동된다.ㅠ)
       While len(@tel) > 0
       Begin
              Set @dummyNo = convert(tinyint , left(@dummyOrd , 2))
              Set @dummyOrd = substring(@dummyOrd ,3 , 100) -- 앞단 2byte 는 썼으니 버리고 나머지를 취한다.
              Set @telNo = left(@tel,1)  -- 전화번호를 1개씩 가져온다
              Set @tel = substring(@tel , 2, 100)

             --  @dummyOrd 위치에 전화번호 1개씩 위치 시킨다. 랜덤위치
              Set @telInfo = substring(@telInfo , 0 , @dummyNo ) + @telNo+substring(@telInfo , @dummyNo+1 , 200)
       End

     -- 최종적으로 앞단 28byte의 index 와 뒷단에 전화번호 22byte 를 위치시킨다.
       set @telInfo = @telOrd  +  @telInfo
End -- 최상위 IF 문 끝 
return @telInfo -- 50byte 짜리 난독화된 데이터 리턴
End -- 함수끝

간단하게 난독화 해보았다. 앞에 22자리는 전화번호가 위치한 각각 의 index 번호이고, 나머지 22 byte ~ 50byte 까지는 진자 전화번호와 더미 데이터가 섞여있다. 누군가가 유출된 난독화된 데이터를 보고 앞에 숫자가 왠지 전화번호의 위치일꺼라는것은 충분히 유추가능하다. 그러므로 전화번호의 위치를 앞에 나란히 11자리 넣기보다.

위치 index가 위치할 위치를 변경하거나 50byte 가아닌 100byte 200byte 로 늘려 위치정보 + 전화번호 + 더미데이터로 범벅해 놓는방법으로 활용해보자 위는 샘플이어서 간단하게 해보았다.
아래는 해독 시나리오 이다.


해독화 시나리오

해독화는 간단하다 위에서 앞 22자리가 전화번호의 위치데이터 이다, 앞에 22자리를 자른후 while 문을 돌면서 위치의 숫자만 가져오면간단하다. 23 ~ 50 번째까지는 전화번호와 dummy 번호가 섞여잇다. 

 
Alter function fn_DecTest (@telCode char(50))
 
returns varchar(15)
 
as Begin
 
-- 난독화 시킨 번호를 입력 받는다.
set @telCode = rtrim(ltrim(@telCode)) 
 
declare @gTel varchar(50)
declare @sTel_Info varchar(28)
declare @sTel_Number varchar(13)
declare @sDec  char(2)
declare @sDecPosition tinyint
declare @sDecOrd  char(22)
 
set @sTel_Number = ''
if len(@telCode) = 50 Begin
 
set @gTel = @telCode

-- 데이터의 앞 22byte 가 위치 정보를 가지고있다.
set @sDecOrd = left(@gTel,22)

               -- 나머지 23 ~ 50byte 까지는 실제 전화번호와 dummy 데이터라 섞여있다.
set @sTel_Info = substring(@gTel , 23, 28)
 
-- 위치정보를 가지고있는 @sDecOrd 를 앞에서 2개씩 잘라가면서 위치에 있는 번호를
-- 리턴할 전화번호 @sTel_Number 변수에 넣는다.

while len(@sDecOrd) > 0 
Begin
set @sDec = left(@sDecOrd , 2)
set @sDecOrd = substring(@sDecOrd , 3 , 50)
 
if @sDec > 0 Begin
set @sDecPosition = convert(tinyint , @sDec)
set @sTel_Number = @sTel_Number + substring(@sTel_Info, @sDecPosition,1)
End
 
End
              
               -- 추출된 전화번호를 자릿수에 맞게 '-' 하이픈 으로 구분하여 보기 좋게 리턴해준다.
set @sTel_Number = rtrim(ltrim(@sTel_Number))
 
IF len(@sTel_Number) = 10
set @sTel_Number = left(@sTel_Number ,3) + '-' +
                                                           substring(@sTel_Number , 4 , 3) + '-' + 
                                                            right(@sTel_Number,4)
 
IF len(@sTel_Number) = 11
set @sTel_Number = left(@sTel_Number ,3) + '-' +
                                                           substring(@sTel_Number , 4 , 4) + '-' +
                                                           right(@sTel_Number,4)
 
End
 
 
return @sTel_Number
 
End

단순해보이지만, 나름 보안으로 적용하기에는 가성비 효과가 좋다.
포스팅을 위해 작성된 쿼리 원문과 결과를  첨부하는것으로 이번 포스팅을 마치겟다.
사용자 삽입 이미지



























fn_EncTelTest.sql <다운로드>


fn_DecTelTest.sql <다운로드>
2018/11/29 17:40 2018/11/29 17:40
Posted
Filed under HW&SW
리눅스 우분투 기반으로 LDAP , 윈도우 서버의 Active Directory를 대신할수 있는 서버가 예전 버젼부터 제공이 되긴 하였습니다.
그런데 5.0 들어서면서 Openchange 가 망해버렸고 그 이후로 익스체인지와 동일한 기능을 사용하지 못하는 아쉬움에 관심을 갖지 못한 서버였습니다. 삼바 프로토콜 버젼이 올라가도 포리스트와 도메인 기능수준은 여전히 2003까지만 지원하고 있습니다.(윈도우10, 서버2016 도메인가입은 지원)
5.1 버젼에는 IDS/IPS 기능과 IM 메신저 서버 기능이 추가되었습니다. 그래도 별반 관심이 없었던 이유중 하나가 가장 치명적인게 아래 그림과 같이 전화접속 권한 부여 기능이 없어서입니다.
VPN계정용으로 사용할려고 했는데 그게 안되서 단순하게 파일서버 및 클러스터 기능밖에 사용할수 없는 한계에 차기 6 버젼때 해결해 줄려나? 했는데 역시나 지원불가였습니다.
사용자 삽입 이미지
그런데 반전이 일어났습니다. 누가 필자대신 피드백 메일을 보냈는지 이걸 대신할수 있는 서비스가 추가되었습니다. RADIUS 서버 기능이 아래 그림과 같이 떡 추가가 되어버렸습니다.
사용자 삽입 이미지
가상화 KVM도 추가가 되었더군요. OS지원이 너무 한정적이여서 그냥 에뮬레이션 용도로 쓰는것만 추천합니다. Hyper-V에 KVM 서비스가 구동이 되는거 보니 에뮬레이션 방식이 아닌가 싶습니다.
아래 그림과 같이 RADIUS 인증으로 바꾸고 접속해보니 아주 접속이 잘됩니다.
리눅스 Free RADIUS 서버가 생기면서 VPN 서버 이중화 구성이 용이하고 사용자 라이센스의 부담이 덜하게 되었습니다.
사용자 삽입 이미지



2018/11/24 00:28 2018/11/24 00:28