Notice
Recent Posts
Recent Comments
«   2024/12   »
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
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

게임을 만듭니다.

aws, api gateway, lambda, json, encoding, forbidden .... 본문

카테고리 없음

aws, api gateway, lambda, json, encoding, forbidden ....

인카고 2018. 2. 19. 09:31

기존에 플레이어이름과 유닛이름을 영문으로만 제한하다가(폰트 관련 문제 때문에)

이 제한을 풀고 관련작업을 진행하였다.


그리고 유닛을 생성해봤는데(한글이름)

포비든 에러가 딱 뜬다.


응? 영문이름으로 입력했더니 정상적으로 생성됨.


그래서 http 헤더에 캐릭터셋도 넣어봤다가

페이로드 인코딩 방식을 utf-8에서 unicode로 변경해봤다가 이것저것해도 동일하게 증상이 발생하였다.

lambda에는 콜이 발생하지 않았기때문에 api gateway단에서 에러가 발생한 것이니 cloudtrail로 로깅을 해봐야 하는데...(결국 하지 않았다)


이러는 와중에 일단 문제의 원인은 다음으로 가정(추정)하였다.


만약 EUC-KR, CP949, Shift-JS 같은 비 유니코드 문자열 인코딩이 포함되어 있다면 ECMA-404 표준에 의거 JSON 오브젝트로 변환하는 Parsing 과정에서 에러가 발생 됩니다.

출처 : http://www.bluehouselab.com/blog/article5


유닛이름이 무슨이유에서인가 비 유니코드 문자열로 인코딩되어 포함되는 것으로 보인다. 그리고 이 문자열이 포함된 json을 헤더에 넣는과정에서 무언가 잘못된 것이겠지


비슷하거나 같은 문제를 겪는 사람이 있는듯 하다( http://www.devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=57781 )


그래서 나의 해결방식은

클라이언트단(c#)에서는 유닛이름부분을 base64 string으로 디코딩한다


byte[] bytes = Encoding.UTF8.GetBytes(input_unitname.text); //세종대왕
string unitName = Convert.ToBase64String(bytes); //7IS47KKF64yA7JmV


서버단(javascript)에서는 이를 다시 utf-8로 인코딩한다


var utf8encoded = Buffer.from(unitItem.Name, 'base64').toString('utf8'); //7IS47KKF64yA7JmV
unitItem.Name = utf8encoded; //세종대왕


이렇게 하는게 최선은 아니겠지만 우선 닥친 문제를 해결하고 여기에다가 기록한다.

Comments