티스토리 뷰

RFC2617 문서에 보면 좀더 자세히 기술되어 있습니다. 참고하시기 바랍니다.





SIP 는 register 를 하는데 인증절차가 필요합니다.

아래 그림은 제일 간단한 인증절차입니다.


1. 클라이언트는 인증을 하기위해 sip 메시지를 서버쪽으로 register 를 날립니다.
2. 서버측에서는 인증을 위한 401 (or 407) unauthorized 를 클라이언트에게 보냅니다. 이때 nonce 값을 보냅니다.
3. 클라이언트는 서버에게 받은 nonce 값과 자신이 가지고 있는 값을 아래공식을 토대로 변형하여 서버측에 response 값을 전송합니다.
4. 서버가 요구한 값이 올바르면 클라이언트에게 200 OK 를 날려줍니다.



1. [클라이언트 -> 서버] REGISTER

REGISTER sip:10.0.1.69:5060 SIP/2.0
Via: SIP/2.0/UDP 10.0.1.71:5060;rport;branch=z9hG4bKPj38fda51ac03743ba8b2f2670d61eb801
Route: <sip:10.0.1.69:5060;lr>
Max-Forwards: 70
From: <sip:6001@10.0.1.69>;tag=3317d784046a4143a17c1b65d41decfe
To: <sip:6001@10.0.1.69>
Call-ID: 654c63806a7d49ab99f4b049a812e59b
CSeq: 47419 REGISTER
User-Agent: SipPhone
Contact: <sip:6001@10.0.1.71:5060>
Expires: 0
Content-Length:  0



2. [서버-> 클라이언트] 401 Unauthorized
서버는 클라이언트에게 nonce 값을 발행하여줍니다. 이걸 줄테니 다시 만들어와라~ 라는 식으로.

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 10.0.1.71:5060;branch=z9hG4bKPj38fda51ac03743ba8b2f2670d61eb801;received=10.0.1.71;rport=5060
From: <sip:6001@10.0.1.69>;tag=3317d784046a4143a17c1b65d41decfe
To: <sip:6001@10.0.1.69>;tag=as0fa2307d
Call-ID: 654c63806a7d49ab99f4b049a812e59b
CSeq: 47419 REGISTER
Server: Asterisk PBX 1.6.2.8
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm="asterisk", nonce="2b63f306"
Content-Length: 0



3. [클라이언트->서버] REGISTER 재전송

REGISTER sip:10.0.1.69:5060 SIP/2.0
Via: SIP/2.0/UDP 10.0.1.71:5060;rport;branch=z9hG4bKPj1eed24fd0ef64f66b93da67536588297
Route: <sip:10.0.1.69:5060;lr>
Max-Forwards: 70
From: <sip:6001@10.0.1.69>;tag=3317d784046a4143a17c1b65d41decfe
To: <sip:6001@10.0.1.69>
Call-ID: 654c63806a7d49ab99f4b049a812e59b
CSeq: 47420 REGISTER
User-Agent: SipPhone
Contact: <sip:6001@10.0.1.71:5060>
Expires: 0
Authorization: Digest username="6001", realm="asterisk", nonce="2b63f306", uri="sip:10.0.1.69:5060", response="e024d482fccae723027e2152d0f6f47a", algorithm=MD5
Content-Length:  0

A1       = unq(username-value) ":" unq(realm-value) ":" passwd
A2       = Method ":" digest-uri-value

MD5를 사용하며 좀더 쉽게 풀이하면 아래와 같습니다.

A1 = md5(username : realm : password)
A2 = md5(methom : url)

Response = md(A1 : nonce : A2)


4. [서버-> 클라이언트] 200 OK

SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.0.1.71:5060;branch=z9hG4bKPj1eed24fd0ef64f66b93da67536588297;received=10.0.1.71;rport=5060
From: <sip:6001@10.0.1.69>;tag=3317d784046a4143a17c1b65d41decfe
To: <sip:6001@10.0.1.69>;tag=as0fa2307d
Call-ID: 654c63806a7d49ab99f4b049a812e59b
CSeq: 47420 REGISTER
Server: Asterisk PBX 1.6.2.8
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO
Supported: replaces, timer
Expires: 0
Date: Mon, 28 Jun 2010 08:09:26 GMT
Content-Length: 0

이렇게 일련의 과정을 통해 인증을 마치게 됩니다.





도움이 되셨나요?

댓글