회사에서 과금 영수증 모듈을 처리하던 도중 ... Signature값을 잘못 전달하는 오류가 발생햇다..
원인은 URL Encoding 처리를 하지 않아서 인데
URL 주소에는 특정 문자들만 포함 할 수 있습니다.( ASCII character-set )
하지만 간혹 ASCII 문자 외의 문자들이 포함이 될 수 있는데( 예를 들면 공백 )
이러한 금지 또는 제한된 문자들을 16진수로 변환하여 URL에 포함하는 것을 URL Encoding 라고 합니다.
쉽게 얘기하면 대소문자, 숫자, 그리고 기타 문자들을 제외한 문자를 16진수로 변환 하는 것 입니다.
기타 문자라고 했는데 정확히 저도 이해를 하지 못하고 있는 부분 입니다.
구글 크롬과 MS IE8 을 기준으로 테스트를 했는데 브라우저 별로 인코딩 되는 문자가 틀리더군요.
크롬에서 그대로 표시되는 문자 목록
~ ` ! $ ^ * ( ) - _ / < > , . | ; : " ' { } [ ]
★( ㅁ + 한자 + 8 ) 과 같은 특수 문자도 그대로 표현
MS IE8 에서 그대로 표시되는 문자 목록
@ * - _
인코딩 방식에 따라 틀린것 같은데, 아시는 분이 댓글을 달아 주시면 감사하겠습니다.
아무튼, 이러한 문제점 때문에 대소문자와 숫자를 제외하고
모두 % + 16진수로 변환하는 코드를 작성 합니다.
const char ConvertToHex( const char cSource )
{
return "0123456789abcdef"[ 0x0f & cSource ];
}
const std::string URLEncoding( const std::string& kInput )
{
std::string kOutput;
std::string::const_iterator string_iter = kInput.begin();
while( string_iter != kInput.end() )
{
const std::string::value_type element = (*string_iter);
if( isascii( element ) // ASCII 문자 이고
&& isalnum( element ) ) // 대소문자, 그리고 숫자
{
kOutput += element;
}
else // 그 외 문자는 모두 %16진수 형태로 변환
{
kOutput += "%";
kOutput += ConvertToHex( element >> 4 );
kOutput += ConvertToHex( element );
}
++string_iter;
}
return kOutput;
}
댓글 없음:
댓글 쓰기