[App 개발] MSN 메신저 프로토콜 해부 1/3
본문
----------------------------------------------------------------------------------------------------------------
MSN 메신저 프로토콜 해부 1/3
여러분만의 MSN 메신저를 만들고 싶습니까? 필자는 이 글에서 메신저 프로토콜을 알기 쉽게 분석해 보겠습니다. 이 글은 모든 개발자들을 위한 것입니다. 어느날 밤 저는 책상에 앉아서 “이노무 메신저는 어떤 원리로 움직이는 걸까?” 생각해 보았습니다. 저는 만약 제가 야후나 MSN 메신저 클라이언트를 만들거나, 혹은 어떻게 메신저 프로그램이 동작하는지 이해할 수 없을까 상상했습니다. 그 첫 번째 단계로 포트 모니터를 이용하여 MSN 메신저를 동작시키면서 패킷 전송 과정을 기록하였습니다. 그리고 제가 동작했던 데이터 전송 기록을 살펴보기 위하여 로그파일을 열어보았습니다.
당연히 처음 그 파일을 보면서 아주 황당함을 느꼈습니다. 그리고 저는 죽치고 앉아서 각각의 패킷이 어떤 동작을 뜻하는지를 파해쳐 나가는 방법 대신, 온라인에서 뭔가 정보가 없는지 찾아보기 시작했습니다. 온라인에는 제가 기대하는 이상의 정보들이 담겨 있었습니다.
제가 말씀드렸던 프로그램은 포트 모니터이지 포트 스캐너가 아닙니다. 그 두 가지 차이를 아시겠지요. 포트 스캐너는 어떤 호스트에 어떤 포트가 열려있는지를 알려주는 프로그램입니다. (아무 호스트나 마구 스캔하지 마십시오. 상대편에서 그 사실을 알게 되면 곤경에 처할 수 있습니다.) 포트 모니터는 호스트의 어떤 특정한 포트의 활동 상황을 모니터하는 프로그램입니다. 이것이 제 컴퓨터의 MSN 메신저를 모니터할 때 쓰던 프로그램입니다.
다른 메신저도 아니고 왜 하필 MSN 메신저를 택하였는가? 첫째, 다른 메신저보다 MSN 메신저를 제가 많이 사용하기 때문입니다. 둘째, 인터넷을 검색해보니 놀랍게도 마이크로소프트가 유용한 MSN 메신저의 공식 프로토콜 요약본을 공개했기 때문입니다. 그리고 인터넷에서 MSN 메신저 프로토콜에 대해서 간략하게 설명하고 있는 유용한 예제들을 살펴보았습니다.
저는 어떤 패킷이 어떤 역할을 하고, 두 개의 소스에서 어떻게 데이터가 전송되는지를 풀어 설명하려는 것이 아닙니다. 네트웍 강좌가 아니니까요. 이 강좌를 읽으시려면 기본적인 네트워킹 관련 지식이 있어야 합니다. 이 글에서는 패킷이라든지 소켓, 포트, 포트 스캐너, 포트 모니터 등의 네트웍 용어들이 등장합니다.
진행하는 동안 최대한 자세히 설명하겠습니다만, 그저 MSN 메신저를 만들어보겠다는 일념에 사로잡힌 왕초보 분들은 사양하겠습니다. 이 글은 초심자를 위한 글은 아닙니다.
MSN 메신저는 TCP/IP 통신규약을 사용합니다. 클라이언트에서 서버로 전송되는 모든 데이터는 완전히 텍스트입니다. 따라서 컴퓨터에서 전송되는 메세지를 모니터해보면 실제로 전송되는 데이터를 읽을 수 있습니다.
시작하기 전에, MSN 메신저 프로토콜의 기본 개념을 소개하겠습니다. 모두 세 개의 서버가 전체 과정에 사용됩니다.
디스패치 서버
맨 먼저 연결해야 하는 서버입니다. 이 서버는 클라이언트의 기본 인증을 담당합니다. 64.4.13.17 (FQDN 으로 하면 messenger.hotmail.com) 에 포트번호 1863 으로 디스패치 서버에 접속합니다.
통지 서버
디스패치 서버로부터 기본 인증을 끝낸 후 디스패치 서버는 통지 서버의 주소를 클라이언트에 전송합니다. 클라이언트는 프로그램이 종료할 때까지 통지 서버에 연결되어 있어야 합니다. 통지 서버의 기본 기능은 클라이언트 세션의 상세한 내용을 저장하는 것입니다. 컨택 리스트 관리, 상태 변환, 이메일 수신 등의 기능이 통지 서버로부터 전송됩니다.
스위치보드 서버
스위치보드 서버는 클라이언트와 상대방의 챗 세션을 연결할 때 사용됩니다. 예를 들어 “Fred” 가 “Tom” 에게 메세지를 보낸다고 하면, 다음과 같은 과정이 발생하게 됩니다.
• 프레드는 통지 서버에게 톰과 대화하고 싶다는 요청을 보냅니다.
• 통지 서버는 프레드(송신인)에게 스위치보드 서버의 주소를 보냅니다.
• 곧바로 톰(수신인)은 통지 서버로부터 프레드(송신인)이 접속해있는 같은 스위치보드 서버의 주소를 통지합니다.
• 같은 서버에 접속하였으면 인스턴트 메세징을 시작합니다.
이러한 내용은 네트웍에서 주고받는 패킷 데이터를 보는 것만으로 해독해 내기에는 어려운 것입니다. 지금 당장 포트 모니터를 가지고 어떤 데이터가 전송되는지를 가지고 전체 MSN 메신저 프로토콜을 분석해 나간다고 해 보십시오. 쉽지 않은 일입니다. 한 번 전체 글을 다 읽고 시도해 보십시오. 내용을 모두 이해하고 난 다음 여러분 컴퓨터에서 전송되는 패킷을 관찰해 보면 지금 당장 해 보는 것보다 훨씬 이해가 빠를 것입니다.
성능 좋은 포트 모니터도 하나 구비하십시오. 제가 사용하고 있는 Uasoft 의 sniffer 를 추천합니다. 패킷 중에서 어떤 것만 골라서 모니터하는 기능도 있습니다. 반드시 MSN 메신저가 실제로 동작하고 있는 TCP 와 IP 패킷만 관찰하십시오.
명령어
클라이언트와 서버가 서로 통신을 하려면 그에 필요한 명령어를 전송해야 합니다. 모든 명령어는 3글자의 예약어로 구분됩니다. 이 예약어로 수신측은 이 명령이 무엇인지를 구분할 수 있습니다. 명령어 문자열의 맨 마지막은 줄바꿈 글자가 포함되어 수신측으로 하여금 명령이 끝났음을 알려줍니다. 여기에는 몇 가지 예외가 있는데, 이것에 대해서는 나중에 설명하겠습니다. 명령어의 기본 문법은 다음과 같습니다.
(명령 예약어)(트랜젝션 ID)(값)(줄바꿈)
트랜젝션 ID
클라이언트가 서버로 보내는 어떤 명령어들은 서버측의 응답이 필요한 경우가 있습니다. 간단히 예를 들어 보겠습니다. 서포트 티켓 시스템을 인터넷에서 사용해보신 적 있으신지요? 동작 원리가 어떻던가요? 시스템에 질의문을 넣게 되면 티켓 아이디가 발급됩니다. 입력한 질문의 답변이 돌아올 때 어떤 질문이 답변되었다는 것을 알려주기 위하여 서포트 티켓 아이디가 같이 전송되어 옵니다.
MSN 메신저의 경우에도 유사합니다. 클라이언트가 서버로 명령을 전송할 때 트랜젝션 아이디를 명령과 함께 보냅니다. 숫자 0 부터 4294967295 사이의 어떤 값도 상관 없습니다. 서버는 입력된 명령에 대한 응답과 함께 명령에 붙였던 트랜젝션 아이디를 같이 보냅니다. 대부분의 경우 서버는 한 번의 명령에 여러 번 응답할 수 있습니다.
서버가 클라이언트로 명령을 보내는 경우는 어떤가? 대부분 명령들은 서버에서 클라이언트로 전송됩니다. 이런 경우 서버는 트랜젝션 아이디 0 을 보냅니다. 이런 경우 서버는 클라이언트로부터의 응답을 필요로 하지 않습니다. 그 반대의 경우가 챌린지 커맨드입니다. (잠시 후에 설명하겠습니다.)
에러
에러가 발생했을 때 서버는 에러 명령을 전송합니다. 에러 명령은 에러가 발생된 명령의 트랜젝션 아이디와 함께 세 자리 숫자가 전송됩니다. 모든 에러 명령에는 발생된 에러에 대한 간략한 설명이 첨가됩니다. 서버에서 클라이언트로 전송되는 기본적인 에러 명령의 형식은 다음과 같습니다.
(에러 코드)(트랜젝션 아이디)(에러 설명)
마이크로소프트 공식 요약문서에 에러 코드와 설명이 수록되어 있습니다. 저는 맨 마지막 페이지에 부록으로 수록해 놓았습니다.
붉은색으로 표시한 메세지들이 클라이언트에서 서버로 전송되는 메세지들입니다. 초록색으로 표시된 명령들은 서버로부터 클라이언트로 전송되는 메세지들입니다. (여기서는 클라이언트=>서버, 클라이언트<=서버 로 표시하겠습니다. 역자주)
프로토콜 버젼 선택
메신저 프로토콜의 첫 번째 단계는 접속입니다. 클라이언트는 디스패치 서버로부터 인증을 받아야 합니다. 먼저 디스패치 서버 64.4.13.17 (messenger.hotmail.com), 포트번호 1863 으로 접속을 시도합니다. 접속이 완료되면 첫 번째로 VER 명령을 서버로 전송합니다. 이 명령은 다음과 같습니다.
클라이언트=>서버:
VER 0 MSNP7 MSNP6 MSNP5 MSNP5 CVR0
이 명령은 클라이언트와 서버간의 통신 규약 버젼을 결정하는 것입니다. 클라이언트가 사용 가능한 버젼을 서버로 보냅니다. 명령 예약어는 VER, 트랜젝션 아이디는 0 입니다.
서버는 다음과 같은 메세지를 전송합니다.
클라이언트<=서버:
VER 0 MSNP7
이 명령을 접수함으로써 서버와 클라이언트 간에 어떤 통신 규약을 사용할지를 결정합니다.
인증 프로토콜의 결정
통신 규약 버젼이 결정되었으면 이제 인증 프로토콜을 결정합니다. INF 명령을 서버로 다음과 같이 전송합니다.
클라이언트=>서버:
INF 1
이 명령은 어떤 인증 방법을 사용할 것인지를 서버에 물어보는 것입니다. 이 명령에는 특정한 트랜젝션 아이디 1 을 첨가합니다.
서버는 다음과 같이 응답합니다.
클라이언트<=서버:
INF 1 MD5
이제 서버와 클라이언트는 MD5 인증 방식을 사용하기로 결정하였습니다.
MD5 는 암호화 알고리듬입니다. 이 알고리듬은 텍스트를 “메세지 다이제스트” 기법으로 암호화된 문자열을 생성합니다. 이 알고리듬을 따로 구현할 필요는 없습니다만, 사용하고자 하는 언어에 해당되는 API 를 구비하여 텍스트를 MD5 알고리듬으로 암호화된 텍스트로 바꾸어 줍니다. MD5 에 대해서 당장은 이 정도만 알고 계셔도 됩니다.
통지 서버의 주소
이제 USR 명령을 디스패치 서버에 다음과 같이 전송합니다.
클라이언트=>서버:
USR 2 MD5 I you@hotmail.com
이제 서버로부터 통지 서버의 주소와 포트 번호를 부여받게 됩니다. 고유한 트랜젝션 아이디 2, 인증 프로토콜, 접속하려는 사람의 이메일 주소가 같이 전송됩니다. ‘I’ 는 USR 명령의 인증 과정을 흉내낸다는 뜻입니다. 메세지를 주고 받기 위해서는 전체 인증 과정을 거쳐야 합니다.
디스패치 서버에서는 인증 과정의 일부분만 수행됩니다. 실제 로그인과 패스워드 대조는 통지 서버에서 수행됩니다.
서버는 다음과 같이 응답합니다.
클라이언트<=서버:
XFR 2 NS 2.3.4.5:1234
서버는 USR 명령의 응답으로 XFR 명령을 전송합니다. XFR 명령은 서버 변경 명령입니다. ‘NS’ 는 통지 서버라는 뜻입니다. IP 주소와 포트 번호가 뒤따라 옵니다. 이 명령은 접속해야 할 통지 서버의 주소를 알려주는 명령입니다.
유저와 패스워드 인증
통지 서버의 정보를 획득한 다음에는 디스패치 서버에서 수행한 것과 비슷한 인증 과정을 다음과 같이 수행합니다.
클라이언트=>서버:
VER 3 MSNP7 MSNP6 MSNP5 MSNP5 CVR0
클라이언트<=서버:
VER 3 MSNP7
클라이언트=>서버:
INF 5
클라이언트<=서버:
INF 4 MD5
클라이언트=>서버:
USR 5 MD5 I you@hotmail.com
위 명령들이 무슨 뜻인지 다 기억하실 것입니다. 지금 우리는 통지 서버에 메세지를 전송하고 있습니다. 각각의 트랜젝션 아이디를 보십시오. 앞에서 사용한 것과 다른 아이디를 쓰고 있습니다. 간단한 업 카운터 변수를 마련하여 클라이언트에서 전송하는 트랜젝션 아이디를 하나씩 증가시키면 됩니다.
기본 인증 메세지를 통지 서버에 보내고 나면 다음과 같은 메세지를 전송받게 될 것입니다.
클라이언트<=서버:
USR 5 MD5 S 0987654321.123456789
서버 쪽에서 USR 명령을 전송하였습니다. 우리가 USR 명령을 사용할 때 썼던 트랜젝션 아이디, 인증 프로토콜, 그리고 챌린지 스트링이 전송되었습니다. ‘S’ 는 subsequent 의 약자입니다. 이 말은 이미 인증 과정이 진행중이며, 이 명령은 뒤따라오는 인증 명령 중의 하나라는 뜻입니다. 이 명령에는 챌린지 스트링이라고 불리는 MD5 해쉬가 따라붙습니다.
이제 이 챌린지 스트링과 패스워드를 묶어서 MD5 알고리듬을 이용하여 소문자 16진수 해쉬를 생성합니다. 앞서 말씀드린 대로 MD5 암호화 기법이 구현된 API 를 사용하실 수 있습니다. 생성된 해쉬를 이제 서버로 전송합니다.
클라이언트=>서버:
USR 6 MD5 S 45tc56cd52aq6fcdsw3cdkl3ds3dddsc
명령 예약어 USR 로 시작하는 명령과 새로운 트랜젝션 아이디를 보냅니다. ‘S’ 키워드는 뒤따라오는 인증 메세지라는 것을 뜻합니다. 마지막으로 서버로부터 전송된 챌린지 스트링과 패스워드를 결합한 MD5 해쉬를 전송합니다.
이 과정이 실패하면 서버는 인증 실패 에러를 전송해 옵니다. 그렇지 않고 인증이 성공적으로 이루어졌으면 다음과 같은 메세지가 전달됩니다.
클라이언트<=서버:
USR 6 OK you@hotmail.com NevilleMehta
서버는 마지막 USR 명령어와 함께 트랜젝션 아이디, 이메일 주소, 그리고 로그인 한 사람의 대화명이 전달됩니다. 키워드 ‘OK’ 는 유저가 인증되었음을 뜻합니다.
인증이 종료된 후에는 현재 상태를 변경해야 합니다. 여기에 사용하는 명령 예약어는 CHG 입니다. 이 명령어로 우리 현재 상태를 변경합니다. 다음은 초기 상태를 변경하는 명령을 서버로 보내는 것입니다.
클라이언트=>서버:
CHG 7 NLN
먼저 명령 예약어 CHG 를 쓰고 그 다음 고유한 트랜젝션 아이디, 그리고 전달인수 ‘NLN’ 을 보냅니다. NLN 은 서버에게 현재 상태를 온라인으로 바꾸라는 명령입니다. NLN 같은 종류의 명령어는 여러 가지가 있습니다. 예를 들어 우리 상태를 보이지 않는 상태로 만들도록 서버에게 보내는 명령은 다음과 같습니다.
클라이언트=>서버:
CHG 7 HDN
HDN 은 우리 상태를 Hidden/Invisible 로 바꾸라는 전달 명령입니다. 마이크로소프트 공식 프로토콜 문서에는 어떤 파라미터가 어떤 역할을 하는지 자세히 설명되어 있습니다. 이 글 마지막에 문서를 첨부하였습니다.
서버는 클라이언트에게 사용자 상태가 바뀐 것을 확인하는 메세지를 보냅니다.
클라이언트<=서버:
CHG 7 HDN
서버가 보낸 회신에는 명령 예약어, 트랜젝션 아이디, 그리고 유저의 현재 상태 값이 들어있습니다.
중요한 서버 메세지 수신
지금까지 클라이언트는 서버로부터 몇 가지 메세지들을 수신할 차례입니다. 지금까지는 서버가 보내는 명령어들을 취급하였습니다만, 메세지들은 다른 포맷으로 되어 있습니다. 살펴보았던 대로 명령어 포맷은 다음과 같습니다.
<COMMAND IDENTIFIER> <TRANSACTION ID> <PARAMETERS>
서버가 보내는 메세지는 위와 같은 형식을 취하고 있지 않습니다. 서버로부터 기본 상태에 대한 값을 통지받고 난 다음 서버는 다음과 같은 메세지 명령을 전송합니다.
MSG Hotmail Hotmail 450
MIME-Version: 1.0
Content-Type: text/x-msmsgsprofile; charset=UTF-8
LoginTime: 1034601891
EmailEnabled: 1
MemberIdHigh: 93760
MemberIdLow: -52562410
lang_preference: 1033
preferredEmail: neville2150895@hotmail.com
country: IN
PostalCode:
Gender: m
Kid: 0
Age: 19
BDayPre: 2
Birthday: 30245
Wallet: 0
Flags: 1031
sid: 507
kv: 4
MSPAuth: 4voZp65RUDJlf6KzMhWAgJKts*N3Wn8OVQB6AW
JfFNos3D0een95XDaOLIFTt3q6!L7M*cdoHvKQ6*2NrYOaMG7Q$$
이것이 메세지 명령어의 모습입니다. 처음 줄에 보시면 MSG 가 있는데, 이것은 명령 예약어입니다. 그 다음 두 개의 인수, Hotmail Hotmail 그리고 마지막으로 숫자 450이 있습니다. 450은 현재 명령어 줄(MSG 줄)을 뺀 나머지 메세지의 길이를 바이트 수로 표시한 것입니다.
그 다음에는 MIME-Version 과 Content-Type 이 있습니다. MIME-Version 은 언제나 동일한 값입니다만, Content-Type 은 여기서는 “text/x-msmsgsprofile” 이라고 되어 있습니다. 메세지의 문자 세트는 바로 뒤에 붙어있습니다. 그 밑으로 따라오는 모든 문자행은 마임 본문입니다.
서버가 보낸 메세지에는 로그인한 유저의 .NET 패스포트 정보가 담겨 있습니다. 따라서 메세지 본문에는 로그인한 유저의 나이, 성별, 생일, 우편번호 등이 포함됩니다.
그 외에도 다음과 같은 메세지를 수신하게 됩니다.
MSG Hotmail Hotmail 221
MIME-Version: 1.0
Content-Type: text/x-msmsgsinitialemailnotification; charset=UTF-8
Inbox-Unread: 0
Folders-Unread: 2
Inbox-URL: /cgi-bin/HoTMaiL
Folders-URL: /cgi-bin/folders
Post-URL: http://www.hotmail.com
이 메세지에도 다른 메세지 명령과 마찬가지로 명령 예약어, Hotmail Hotmail 인수, 그리고 첫 번째 줄을 뺀 나머지 본문의 바이트 수가 전송됩니다. 그 다음 항상 동일한 마임 버젼, 그리고 Content-Type 이 여기서는 “text/x-mmsmsgsinitialemailnotification” 이라고 전송되었습니다. 그 다음 문자 세트가 표시됩니다.
이 메세지에는 사용자의 받은 편지함에 대한 정보가 담겨 있습니다. 메신저에 로그인하게 되면 아직 읽지않은 이메일이 있다는 것을 통지받게 되는데, 이 메세지가 바로 그 역할을 하는 것입니다. 위에 보시면 “Inbox-Unread: 0” 이 마임 본문에 들어있는데, 받은 편지함에 안 읽은 이메일이 0 개 있다는 뜻입니다. 그 외에도 받은 편지함에 대한 몇 가지 사항이 수록되어 있습니다.
어떤 메세지들은 여러분이 만드는 클라이언트에서 취급하고 싶지 않은 것일수도 있습니다. 저는 일단 전체 과정이 어떻게 흘러가는지를 설명하기 위하여 이 내용을 삽입했습니다. 여러분이 만드는 메신저에서 새 이메일이 도착했음을 사용자에게 알리도록 만드는 것은 여러분 마음입니다. 그런 경우에는 이 메세지들은 무시해 버리면 됩니다. 서버에서 첫 번째로 전달되는 사용자의 .NET 패스포트 정보에 대한 메세지는 사실 쓸모가 없습니다.
리스트 요청
이제 친구 목록을 요청할 차례입니다. 그 전에 먼저 네 가지 종류의 리스트에 대해서 말씀드리겠습니다. 첫째, 포워드 리스트 ‘FL’ 이 있습니다. 이것은 여러분의 컨택 리스트에 있는 유저들입니다. 둘째, 리버스 리스트 ‘RL’ 입니다. 이것은 현재 당신을 컨택 리스트에 담고 있는 사람들의 리스트입니다. 셋째, 얼라우 리스트 ‘AL’ 입니다. 이것은 당신의 온라인 상태를 볼 수 있도록 허용한 사람들의 리스트입니다. 마지막, 블럭 리스트 ‘BL’ 입니다. 이것은 당신이 막아 놓은 사람들의 리스트입니다. 요약해 보면 다음과 같습니다.
• FL – 포워드 리스트 (나의 컨택 리스트에 있는 사람들 목록)
• RL – 리버스 리스트 (나를 컨택 리스트에 갖고 있는 사람들 목록)
• AL – 얼라우 리스트 (내 상태를 보도록 허용된 사람들 목록)
• BL – 블럭 리스트 (내 상태를 볼 수 없는 사람들 목록)
LST 라는 명령은 위에서 설명한 리스트를 얻는 명령입니다. 유저의 포워드 리스트를 서버에 요청한다면 다음과 같이 명령을 내립니다.
클라이언트=>서버:
LST 8 FL
먼저 명령 예약어 LST 를 써 넣고, 그 다음 명령의 트랜젝션 아이디를 넣습니다. 마지막에 서버에서 얻고자 하는 리스트의 코드 두 글자를 넣습니다. 위의 명령에서 FL 대신 서버에서 얻고 싶은대로 RL, AL, BL 을 넣어도 됩니다.
클라이언트<=서버:
LST 8 FL 35 1 4 yourpal1@hotmail.com Pal1 0
LST 8 FL 35 2 4 yourpal2@hotmail.com Pal2 1
LST 8 FL 35 3 4 yourpal3@hotmail.com Pal3 2
LST 8 FL 35 4 4 yourpal4@hotmail.com Pal4 1
서버는 목록에 있는 모든 사용자를 전송해 줍니다. 현재 리스트에 네 명이 있으므로 네 줄이 전송되었습니다. 이제 전달 인수가 어떤 의미인지를 보겠습니다.
먼저 명령 예약어 LST 가 있고, 트랜젝션 아이디 (우리가 서버로 보낸 아이디와 동일. 이것은 우리가 서버로 보낸 LST 명령에 대한 응답으로서 보내어지는 전송이라는 것을 표시함) 가 있습니다. 그 다음에 있는 35 라는 숫자는 리스트 버젼 아이디라고 하는 것입니다.
그 다음 사용자의 일련 번호인데, 단순한 카운터입니다. 그 다음에 있는 숫자는 리스트에 담겨 있는 유저의 총 수입니다. 여기서는 네 명이므로 4 입니다. 계속해서 리스트에 있는 유저의 이메일 아이디, 그 다음은 유저의 대화명, 마지막으로 그룹 아이디가 따라옵니다.
아직 그룹에 대해서 설명드리지 않았으므로 일단 그대로 두겠습니다. 마지막 인수는 해당 유저의 그룹 아이디입니다.
유저의 상태
메신저에 접속을 하고 나면 서버는 리스트에 있는 유저들의 상태를 전송합니다. 일단 유저의 초기 상태를 변경하는 CHG 명령을 사용합니다. 명령은 다음과 같습니다.
클라이언트=>서버:
CHG 7 HDN
명령과 함께 사용된 트랜젝션 아이디는 7입니다.
서버가 컨택 리스트에 있는 사용자의 상태 변경을 통지할 때에는 우리가 서버에 CHG 명령을 전송할 때 사용되었던 트랜젝션 아이디와 함께 필요한 정보를 전송합니다. 여기서는 7이 되겠지요. 살펴보겠습니다.
클라이언트<=서버:
ILN 7 BSY yourpal1@hotmail.com Pal1
ILN 7 AWY yourpal2@hotmail.com Pal2
이것은 우리가 메신저에 접속했을 때 서버로부터 전송되어오는 명령어들입니다. 일단 두 명의 유저가 컨택 리스트에 있다고 가정해 봅시다. 각 줄마다 유저의 상태를 표시하고 있습니다. 먼저 명령 예약어 ILN 으로 시작합니다. 이것은 포워드 리스트에 있는 유저의 초기 상태를 통지하는 데 사용되는 명령입니다. 그 다음 트랜젝션 아이디 7 (왜 7인지는 위에서 설명했습니다.), 그리고 유저의 현재 상태가 전송됩니다. 첫 번째 줄에 있는 BSY 는 Busy 를 뜻합니다. 두 번째 줄에 있는 AWY 는 Away 입니다. 유저의 현재 상태를 뜻하는 인수에는 여러 종류가 있습니다. 예를 들어 NLN 은 온라인, AWY 는 어웨이, PHN 은 전화받는 중 등입니다.
인수의 종류와 의미에 대해서는 문서 뒤에 첨부한 마이크로소프트의 공식 프로토콜 문서에 수록되어 있습니다. 그리고 그 뒤에 유저의 이메일 아이디와 대화명이 전달됩니다.
메신저는 그 외에도 서버로부터 전송되는 수많은 명령들을 처리할 준비가 되어 있어야 합니다. 클라이언트는 서버에서 전송되는 명령어를 인식, 분석, 행동하여 어떠한 오류도 범하지 않도록 해야 합니다.
유저의 상태
유저가 온라인 상태가 되면 MSN 메신저는 상대방이 온라인이 되었음을 통지합니다. 왜냐하면 서버가 언제 유저가 온라인이 되었는지 알려주기 때문이고, 클라이언트는 그 메세지를 처리할 준비가 되어 있기 때문입니다. 서버는 NLN 과 FLN 명령을 가지고 유저의 실시간 상태를 통지합니다.
클라이언트<=서버:
NLN AWY yourpal1@hotmail.com Pal1
FLN yourpal2@hotmail.com
첫 번째 명령어를 보시면 NLN 이라는 예약어로 시작합니다. 이것은 유저가 온라인이 되었거나 온라인 상태가 변경되었음을 알려주는 명령입니다. NLN 명령에는 트랜젝션 아이디가 없는데 왜냐하면 이 메세지는 응답(이 명령에 대한 응답으로 서버에게 명령을 전송)이 필요하지 않기 때문입니다. 이것은 단지 유저의 상태가 변했다는 것을 통지하는 것 뿐입니다. 이제 유저의 현재 상태를 알게 되었습니다. 여기서 ‘AWY’ 는 유저의 상태가 away 로 변경되었다는 뜻입니다. 그 다음 해당 유저의 이메일 아이디와 대화명이 출력됩니다.
두 번째 명령을 보시면 FLN 이라는 예약어로 시작됩니다. 이것은 유저가 오프라인이 되었다는 것을 클라이언트에게 알려주는 것입니다. 여기서도 명령어에 트랜젝션 아이디는 없습니다. 그 외에 전달되는 인수는 오프라인이 된 유저의 이메일 아이디입니다.
챌린지
MSN 메신저가 동작하고 있는지를 확인하기 위해서 서버는 주기적으로 챌린지 신호를 전송합니다. 이 명령어는 무작위 횟수로 전송됩니다. 전달되는 명령어가 어떻게 생겼는지, 그리고 클라이언트에서는 어떻게 반응하여야 하는지 보여드리겠습니다. 서버에서 전송되는 챌린지 메세지는 다음과 같습니다.
CHL 0 90938290383838737622
여기서 명령 예약어 CHL 이 쓰입니다. 그리고 트랜젝션 아이디 0 이 전송됩니다. 서버가 클라이언트에게 메세지를 전송할 때 보통 트랜젝션 아이디 0 을 사용합니다. 마지막 인수는 챌린지 문자열입니다.
이제 챌린지 문자열과 문자열 ‘Q1P7W2E4J9R8U3S5’ 를 조합하여 MD 5 알고리듬으로 암호화한 문자열을 만듭니다. 위의 경우 MD 5 알고리듬을 이용하여 문자열 '90938290383838737622Q1P7W2E4J9R8U3S5' 을 암호화한 다음 서버에 전송합니다. 응답하는 명령은 다음과 같습니다.
QRY 9 msmsgs@msnmsgr.com 32
1293ft670983hydr5423yhdv67f6f4f5
챌린지 명령에 대한 응답은 QRY 명령을 씁니다. 그리고 한 번도 사용하지 않았던 트랜젝션 아이디를 붙이고 문자열'msmsgs@msnmsgr.com' 과 숫자 32를 보냅니다. 32는 QRY 명령 예약어가 있는 현재 줄을 제외한 나머지 글자의 바이트 수입니다. 줄바꿈 글자를 전송한 다음 MD 5 로 암호화된 문자열을 전송합니다.
서버는 다음과 같이 응답할 것입니다.
QRY 10
서버는 QRY 명령과 함께 챌린지 메세지를 응답할 때 사용했던 트랜젝션 아이디 10 을 전송합니다. 이 명령은 챌린지를 무사히 통과했다는 것을 알려주는 메세지입니다. 챌린지를 실패했을 경우 서버는 끊어지고 에러 명령을 전송하게 됩니다.
서버 메세지
서버에서 종종 전송되는 몇 가지 다른 메세지들이 있습니다. 이 메세지들은 응답하지 않아도 상관없습니다.
유저가 새 이메일을 받았을 때 서버로부터 전송되는 메세지입니다.
MSG Hotmail Hotmail 340
MIME-Version: 1.0
Content-Type: text/x-msmsgsemailnotification; charset=UTF-8
From: Mehta
Message-URL: /cgi-bin/getmsg?msg=MSG1029401739.3&start=1610592&
len=402&curmbox=ACTIVE
Post-URL: https://lc1.law13.hotmail.passport.com
/ppsecure/domessengerlogin/EN
Subject: Hi
Dest-Folder: ACTIVE
From-Addr: example@passport.com
id: 2
처음 세 줄은 앞에서 설명한 것과 동일합니다. Content-Type 은 ‘text/x-msmsgsemailnotfication’ 입니다. 마임 본문에는 방금 도착한 새 이메일 메세지에 대한 정보가 담겨 있습니다. 여기에는 제목, 발송인 등이 있습니다.
메일함에서 이메일을 지웠을 때 서버가 전송하는 메세지입니다.
MSG Hotmail Hotmail 145
MIME-Version: 1.0
Content-Type: text/x-msmsgsactivemailnotification; charset=UTF-8
Src-Folder: ACTIVE
Dest-Folder: trash
Message-Delta: 1
앞의 세 줄은 위에 설명과 동일합니다. Content-Type 은 'text/x-msmsgsactivemailnotification' 입니다. 마임 본체에는 편지함에서 삭제된 이메일의 정보가 담겨 있습니다.
최신글이 없습니다.
최신글이 없습니다.
댓글목록 0