reference..2015. 2. 4. 20:10

SMTP 인증에 대해 알아보죠~ (PLAINLOGIN 방식) : http://cafe.naver.com/hermeneus/16

아래 내용입니다.

 

출처 : 헤르메네우스 카페(http://cafe.naver.com/hermenus)

게시글 : SMTP 인증에 대해 알아보죠~ (PLAINLOGIN 방식) : http://cafe.naver.com/hermeneus/16

문제가 된다면 삭제하겠습니다.

 

 

사실 요즘과 같은 웹메일이 일반화되어 있는 세상에 살고 있는 우리로서는 SMTP 인증에 대해 알지 못해도 메일을 사용하는데 전혀 문제가 없습니다.

그런데 웹메일을 사용하지 않고 아웃룩, 아웃룩 익스프레스, 선더버드와 같은 전형적인 이메일 클라이언트를 이용해 메일을 발송하는 사람들은 SMTP 인증에 대해 어느 정도의 이해는 가지고 있어야 합니다.

그래야 메일 시스템 관리자를 덜 귀찮게 할 수 있거든요~ㅋㅋ

그럼 SMTP 인증에 대해 간단히 살펴보도록 하죠. (위에서 말씀드렸지만 웹메일만 사용하는 분들은 여기서 빠빠이 하셔도 됩니다~ㅋ)

초창기 SMTP는 단순히 로컬 네트워크 상에서만 사용했고, 이 때문에 스팸, 바이러스, 피싱 메일과 같은 머리를 아프게 하는 메일들에 대해 큰 신경을 쓸 필요가 없었습니다.

그런데 뭔가 부족함을 느겼는지 SMTP 프로토콜을 보완할 필요가 생겼나 봅니다.

그래서 보완을 한 녀석이 ESMTP란 녀석인데요. 이 ESMTP에 SMTP 인증이란 개념이 추가된 것입니다.

그럼 SMTP 인증이란 무엇일까요?

간단합니다. 우리가 FTP와 같은 인터넷 서비스를 이용할 때, 가장 먼저 하는게 무엇일까요? FTP 클라이언트를 이용해 FTP 서버주소 입력하고 사용자 아이디 / 패스워드 입력하는 것이죠~

그럼 FTP 서버에서 아이디와 패스워드를 가지고 인증을 수행하게 되죠. 그리고 인증에 성공하게 되면 우리는 FTP 클라이언트를 이용해 파일을 업/다운로드하게 되는 것입니다.

SMTP 인증 역시 마찬가지입니다. 이메일 클라이언트 상에서 SMTP 서버 지정하고 아이디/패스워드 입력해서 인증에 성공하면 SMTP 서버에서는 이메일 클라이언트로 부터 받은 메일을 발송해 주는 것입니다.

만약 인증에 실패하면 SMTP 서버에서는 당연히 메일을 발송 안해 주는 것이죠~

이런 SMTP 인증이란 기능이 SMTP에는 없었고, ESMTP에는 있다는 것이죠~ FTP는 처음부터 FTP 인증이란게 있었는데 말이죠~


그럼 내부적으로 SMTP 인증이 어떻게 수행되는지에 대해 좀 더 자세히 살펴보도록 하죠.

일반적으로 이메일 클라이언트에서 SMTP 인증 설정을 하지 않은 상태에서 서버로 전송되는 SMTP 명령의 순서는 EHLO, MAIL, RCPT, DATA, QUIT가 됩니다.

그럼 이메일 클라이언트에서 SMTP 인증 설정을 했을 때, 서버로 전송되는 SMTP 명령의 순서는 어떻게 될까요?

바로 EHLO, AUTH, MAIL, RCPT, DATA, QUIT가 됩니다. EHLO 다음에 AUTH라는 놈이 하나 끼어 들었네요~ㅋ

그럼 이메일 클라이언트에서는 AUTH라는 프로토콜에다가 사용자 아이디 / 패스워드를 어떻게 입력해서 인증을 요청하게 될까요?

이건 워낙 다양한 방법들이 존재해서 쉽게 설명하기가 애매한데요. 오늘은 제일 간단한 PLAIN 방식과 LOGIN 방식에 대해서만 살펴보도록 하겠습니다.

그럼 만만해 보이지만, 까면 깔수록 머리 아프게 하는 sendmail이란 녀석과 테스트를 해 보도록 하죠.

먼제 sendmail에 접속해 볼까요?

[root@sendmail mail]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 sendmail.daou.com ESMTP Sendmail 8.13.8/8.13.8; Wed, 25 May 2011 10:15:59 +0900
EHLO daou.com
250-sendmail.daou.com Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH GSSAPI LOGIN PLAIN
250-DELIVERBY
250 HELP


1. 접속을 하고 (telnet localhost 25)
2. EHLO를 치니 (EHLO daou.com)
3. 250-AUTH GSSAPI LOGIN PLAIN 란 녀석이 보이네요

즉, sendmail에서는 SMTP 인증 방식으로 GSSAPI 방식, LOGIN 방식, PLAIN 방식을 제공해 주고 있다고 얘기해 주네요.

GSSAPI 방식은 저도 잘 모르겠고, 아까 말씀드렸던 것 처럼 PLAIN 방식과 LOGIN 방식에 대해서만 살펴보도록 하겠습니다.

먼저 PLAIN 방식입니다.

[root@sendmail mail]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 sendmail.daou.com ESMTP Sendmail 8.13.8/8.13.8; Wed, 25 May 2011 11:38:38 +0900
EHLO daou.com
250-sendmail.daou.com Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH GSSAPI LOGIN PLAIN
250-DELIVERBY
250 HELP
AUTH PLAIN
334
AHRlc3QAdGVzdA==
235 2.0.0 OK Authenticated

1. 접속을 하고 (telnet localhost 25)
2. EHLO를 치고 (EHLO daou.com)
3. AUTH PLAIN 방식으로 인증하겠다고 얘기해 주고
4. AHRlc3QAdGVzdA== 라는 뭔지는 모르겠는 문자를 치니
5. 235 2.0.0 OK Authenticated 라고 인증되었다고 하네요. 인증이 되었으니, MAIL, RCPT, DATA, QUIT 순으로 메일을 발송하면 되겠네요.

그럼 AHRlc3QAdGVzdA==는 무엇일까요? 바로 아이디와 패스워드가 되겠죠? 생긴거 보니 BASE64로 인코딩되어 있는것 같고요.

그럼 여기서 또, 아이디하고 패스워드를 어떻게 인코딩한지 살펴봐야 겠네요.

저 같은 경우에는 perl 명령어 한 줄을 이용했습니다. 명령어는 아래와 같고요~

perl -MMIME::Base64 -e 'print encode_base64("\000test\000test")'

위 perl 명령어에서 앞에 있는 test는 아이디, 뒤에있는 test는 암호입니다.

아이디 및 암호가 test인 사용자의 인증 정보를 위와 같이 BASE64로 인코딩하니깐 AHRlc3QAdGVzdA== 라는 문자열이 생성된 것이죠~

그리고 AHRlc3QAdGVzdA==라는 문자열을 이용해 sendmail 서버에게 인증해 달라고 요청한 것이고요.

지금까지 설명드린게 SMTP 인증에서 PLAIN 인증 방식입니다.


그럼 LOGIN 방식을 설명드리겠습니다.

[root@sendmail mail]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 sendmail.daou.com ESMTP Sendmail 8.13.8/8.13.8; Wed, 25 May 2011 11:48:28 +0900
EHLO daou.com
250-sendmail.daou.com Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH GSSAPI LOGIN PLAIN
250-DELIVERBY
250 HELP
AUTH LOGIN
334 VXNlcm5hbWU6
dGVzdA==
334 UGFzc3dvcmQ6
dGVzdA==
235 2.0.0 OK Authenticated


1. 접속을 하고 (telnet localhost 25)
2. EHLO를 치고 (EHLO daou.com)
3. AUTH LOGIN 방식으로 인증하겠다고 얘기해 주고
4. dGVzdA== 라는 뭔지는 모르겠는 문자를 치고
5. dGVzdA== 라는 문자를 한 번 더 치니
6. 235 2.0.0 OK Authenticated 라고 인증되었다고 하네요. 인증이 되었으니, MAIL, RCPT, DATA, QUIT 순으로 메일을 발송하면 되겠네요.

그럼 첫번째 입력한 dGVzdA==는 무엇일까요? 이미 짐작하셨겠지만 test라는 아이디를 BASE64로 인코딩한 값이 되겠죠?

당연히 두번째 입력한 dGVzdA==는 test라는 암호를 BASE64로 인코딩한 값이고요.

PLAIN 방식은 아이디와 암호를 한 줄에 입력해서 한 방에 인증을 해달라고 요청한 것에 반해, LOGIN 방식은 아이디 따로 암호 따로 전송하는 방식을 취하네요~ㅋ

하지만 PLAIN 방식이나 LOGIN 방식 모두 보안에는 상당히 취약한 방법이란 생각이 드네요~

뭐 제 생각에는 해도 그만, 안 해도 그만인 인증 방식인데요.

다음 시간에는 좀 더 강력한 인증 방식인 CRAM-MD5라는 것에 대해 설명을 드려볼께요~

 

그리고,

메일 테스트 하기...

 

telnet 접속 후

> helo

> mail from : 보내는 메일 주소

> rcpt to: 받는 메일 주소

> data                            //데이터를 입력하겠다는 명령어

> subject: 메일 제목

> 메일본문

> .                                //본문이 끝났다는것을 알림.

> quit

 

'reference..' 카테고리의 다른 글

oralce dblink 생성  (0) 2015.10.31
Tomcat 과 java 튜닝, 메모리 등  (0) 2013.01.30
android 개발 환경  (0) 2012.09.07
리눅스 하드웨어 정보.  (0) 2012.05.26
오라클 expdp / impdp  (0) 2012.05.24
Posted by kinosox