ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PHP 버전에 따른 base64_encode 와 base64_decode 사용법 및 주의사항
    정보통신에너지/웹프로그래밍 2014. 7. 29. 22:50


     

     

     

     

     

     

    PHP 언어로 개발을 하다보면..

     

    서버 사이에 통신을 하는 경우가 생긴다.

     

    이 때 통신 프로세스는 비교적 간단하다.

     

    urlencoder 함수와 base64_encode 함수, 그리고 urldecoder 함수와 base64_decode 함수가 쓰인다.

     

    자세한 코딩은 인터넷 찾아보면 설명과 함께 많이 있으니 생략하고...

     

    오늘은 base64_encode() 함수와 base64_decode() 함수를 사용할 때 가장 크게 주의해야할 주의사항과 함께 그 사용법을 아주 간략히 적어볼까 한다.

     

    여기서 가장 맹점은...

     

    PHP 버전에 따라 약간 다른데 핵심은 base64_encode() 함수로 인코딩해서 서버간 통신을 할 때에..

     

    중간에 + 문자가 섞이는게 공백문자로 변경된다는 점이다.

     

    이게 무슨 말이냐...

     

    base64 인코딩은 기본적으로 모든 데이터를 알파벳 대문자 소문자 및 숫자 0부터 9, 그리고 문자 / + = 을 가지고 변환하여 표현한다.

     

    그래서 때에 따라 인코딩 결과가 알파벳 소문자 대문자 숫자 외에도 / + = 이렇게 세종류가 생길 때가 있다.

     

    그런데 웃긴게...

     

    GET 을 통해 전달하거나..

     

    아니면 웹서버 사이에 fopen 으로 파일 전송을 하면..

     

    PHP 버전에 따라 + 문자가 공백문자로 바뀐다.

     

    그리고 base64_decode 함수는 그 공백문자를 인식하지 못한다.

     

    그래서 결국 디코딩 결과는 도중에 짤린 문자열이 되거나 아니면 아예 아무것도 없는 상태가 되버린다.

     

    즉, 에러가 발생하는 것이다.

     

     

    이것을 해결하는 방법은?

     

    여러가지가 있다.

     

    그러나 가장 단순하면서도 본질적인 해결책은 다음과 같다.

     

     

     

     

     

     

     

     

     

    $data = strtr($data, '-_ ', '+/+');

     

     

     

     

     

    만약 전송받은 데이터를 $data 변수에 저장했다면..

     

    strtr() 함수를 써서 포함된 모든 공백을 + 문자로 변경한다음 base64_decode($data) 와 같이 처리를 하면 된다.

     

    즉 strtr()함수는 변수 $data 안의 모든 문자를 일일이 검열하여 그중에서 위와 같이 - _ 공백  이 3종류를 발견하면 각각 + / + 문자로 변경해준다.

     

    원리는 매우 단순하지만..

     

    실제로 구현해보려고 하면 생각해내기가 대단히 어렵고 쉽지 않다.

     

    어쨌든.. 이렇게 하면 말끔히 문제는 해결된다.

     

     

    이 외에도 몇가지 응용방법이 있지만..

     

    모든 것은 더 이상 단순해질래야 단순해질 수 없는 수준까지 단순해지는 것이 좋다.

     

    코드 1줄로, 함수 1개로 해결할 수 있는 것이라면 더더욱 그래야한다.

     

     

     

     

     

     

    댓글