320 likes | 1.34k Views
경희대학교 KHLUG 한국외국어대학교 GNUVILL. JABBER 를 이용한 메신저 개발. JABBER ?. XMPP 기반의 Protocol Instant Messenger 들이 가져야 할 모든 프로토콜 요소 를 포함 Jabber 를 지원하는 Client 는 모든 공개 Jabber 서버 에 접속 가 능. JABBER 의 구조. C1, C2, C3 = XMPP Client S1 , S2 = XMPP Server
E N D
경희대학교KHLUG 한국외국어대학교 GNUVILL JABBER를 이용한 메신저 개발
JABBER? • XMPP 기반의 Protocol • Instant Messenger들이 가져야 할 모든 프로토콜 요소를포함 • \Jabber를 지원하는 Client는 모든 공개 Jabber 서버에 접속 가능
JABBER의 구조 • C1, C2, C3 = XMPP Client • S1, S2 = XMPP Server • G1= XMPP와 외부 메시징 네트워크에서 사용되는 프로토콜들 사이의 Gateway • FN1= 외부 메시징 네트워크 • FC1= 외부 메시징 네트워크의 클라이언트
JABBER의 구조 어떠한 Jabber public server에 위치하고 있더라도 다른 server에 있는 사용자와 대화 가능
PROTOCOL의 예 Server advertises resource binding feature to client: <stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='c2s_345' from='example.com' version='1.0'> <stream:features> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'> </stream:features> Client asks server to bind a resource: <iq type='set' id='bind_1'> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/> </iq>
JABBER의 장점 • 전 세계 Jabber User와 대화 가능 • Google talk와 연동 가능(예정) • 인증 protocol로 messenger신뢰성 향상 • 기존 messenger와의 차별화 • Server및 ClientLibraries제공 • Protocol만 활용하는 것이 가능 • Protocol로 인한 문제를 미연에 방지 • XML 표준화로타 기능과 연동에 용이
향후 전망 • Google talk의 public server로 전환 예고 • 국제 인터넷 표준 기술 협회(IETF)의 인스턴트 메신저 표준 후보 중 하나 • 인텔, HP, AT&T 등의지원
JABBER의 특징 Open
JABBER의 특징 Extension
JABBER의 특징 Security
JABBER의 특징 Presence
JABBER의 특징 XML
JABBER의 구현 XMPP메시징프로토콜의 정의 - Messege교환 - Log-in 정보 교환 - User 초대 및 수락 - Budy List 관리 - 특정 User block
JABBER의 구현 스키마의 종류 • namespacejabber:client jabber:server • type chat, error, groupchat, headline, normal • <subject/> 언어 인코딩설정. xml:lang • <body/> 읽을 수 있는 메시지 • <thread/> 읽을 수 없는 메시지, 암호화된 코드
JABBER의 구현 Presence의 종류(type) • unavailable : 통신 불가 • subscribe : 수락요청 메시지 • subscribed : User의 친구요청 수락 메시지 • unsubscribe : User제거 • unsubscribed : User의 친구요청 거부 메시지 • probe :User간의 관계 정보 • error : 패킷 전송 중 일어날 수 있는 에러
JABBER의 구현 show의 종류(myStatus) • away: 자리비움 • chat : 채팅 중 • dnd: Busy • xa : 아주 멀리 갔을때(extended away) • status: User의 행동 상태 대한 설명 • priority: -128~127까지 int형 등급 변수 • Iq: 구조화된 요청/반응 메카니즘을증명
JABBER의 구현 1. Session 설정 • 보통 클라이언트와 서버가 연결되면 세션이 설정 • Stream증명: 클라이언트는 세션이 연결되거나, 메시지 전송전 에 인증 • ResourceBinding ex) user@192.168.0.5/resource
JABBER의 구현 1. Session 설정 서버가 클라이언트에게 세션설립을 위한 특징을 알린다. <stream:stream xmlns='jabber:client' // 클라이언트에게 xmlns:stream='http://etherx.jabber.org/streams' id='c2s_345' // 서버의 누군가의 아이디 from='example.com' // 서버 주소 version='1.0'> // 버전 <stream:features> // 즉 이 안에 있는게필요하다 <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/> <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/> </stream:features>
JABBER의 구현 1. Session 설정 Step 1: Client requests session with server: example.com 서버에게 sess_1 유저가 세션 연결 요청을 한다. <iq to='example.com' type='set' id='sess_1'> <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/> </iq>
JABBER의 구현 1. Session 설정 Step 2: Server informs client that session has been created: 서버가 sess_1 유저에게 세션이 생성되었다고 알린다. <iq from='example.com' type='result' id='sess_1'/>
JABBER의 구현 1. Session 설정 Step 3: 만약 세션연결이 실패하면 실패 메시지를 반드시 보내야 한다. <iq from='example.com' type='error' id='sess_1'> <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/> <error type='wait'> <internal-server-error xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> // 서버에러 </error> </iq>
JABBER의 구현 1. Session 설정 Step 4: 잘못된 아이디나 패스워드에 의해 세션연결이 안될 경우 <iq from='example.com' type='error' id='sess_1'> <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/> <error type='auth'> <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> // resource 란 패스워드같은 것 을 뜻함. // 즉 user@192.168.0.5/password
JABBER의 구현 2. 메세지 교환 <message to='romeo@example.net' // romeo에게 from='juliet@example.com/balcony' // juliet로부터 user_id@address/resource //ID 및 Password type='chat' // 유형은 채팅 xml:lang='en'> // 메시지 인코딩 유형 <body>Wherefore art thou, Romeo?</body> // 메시지 바디 </message>
JABBER의 구현 3. Presence에 대한 Client와 Server <presence xml:lang='en'> <show>dnd</show> <status>Wooing Juliet</status> <status xml:lang='cz'>Jadvořím Juliet</status> <priority>1</priority> //가중치 부여 </presence>
JABBER의 구현 4. Subscription - 다른 ClientUser에 친구 요청 <presence to='juliet@example.com' type='subscribe'/> - 친구요청 메시지 승낙 <presence to='romeo@example.net' type='subscribed'/> - 친구요청 메시지 거부 <presence to='romeo@example.net' type='unsubscribed'/> - 친구 삭제메시지 (클라이언트) <presence to='juliet@example.com' type='unsubscribe'/>
JABBER의 구현 5.Roster 관리 ( 친구관리) // 서버에 현재 친구리스트를 달라고 요청한다. <iq from='juliet@example.com/balcony' type='get' id='roster_1'> <query xmlns='jabber:iq:roster'/> </iq>
JABBER의 구현 5.Roster 관리 ( 친구관리) // 서버로부터 받은 친구 리스트 메시지 <iq to='juliet@example.com/balcony' type='result' id='roster_1'> <query xmlns='jabber:iq:roster'> <item jid='romeo@example.net‘ name='Romeo‘ subscription='both'> <group>Friends</group> </item> <item jid='mercutio@example.org‘ name='Mercutio‘ subscription='from'> <group>Friends</group></item> <item jid='benvolio@example.org‘ name='Benvolio‘ subscription='both'> <group>Friends</group> </item></query></iq>
JABBER의 구현 5.Roster 관리 ( 친구관리) //친구 추가하기 <iq from='juliet@example.com/balcony' type='set' id='roster_2'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' name='Nurse'> <group>Servants</group> </item> </query> </iq>
JABBER의 구현 5.Roster 관리 ( 친구관리) //이미 존재하는 친구 그룹 <iq from='juliet@example.com/balcony' type='set' id='roster_2'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com‘name='Nurse'> <group>Friends</group> <group>Lovers</group> </item> </query> </iq>
JABBER의 구현 5.Roster 관리 ( 친구관리) // 서버는 모든 이용가능한 리소스에게 이 수정된 정보를 전송한다. <iq to='juliet@example.com/balcony‘type='set‘id='a78b4q6ha463'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com‘name='Nurse’ subscription='none'> <group>Servants</group> </item></query></iq> <iq to='juliet@example.com/chamber‘type='set‘id='a78b4q6ha464'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com‘name='Nurse‘subscription='none'> <group>Servants</group> </item></query></iq> // 전송이 되면 결과 메시지를 클라이언트에게 전송한다. <iq to='juliet@example.com/balcony' type='result' id='roster_2'/>
JABBER의 구현 5.Roster 관리 ( 친구관리) //nurse@example.com 이란 친구 삭제하기 <iq from='juliet@example.com/balcony' type='set' id='roster_4'> <query xmlns='jabber:iq:roster'> <item jid='nurse@example.com' subscription='remove'/> </query> </iq>