2.3 인터넷 전자메일
- 인터넷 메일 시스템의 상위 요소에는 다음 3가지가 있다.
- 사용자 에이전트(user agent)
- 사용자의 메시지 읽기, 전달, 저장, 구성을 담당
- ex) 지메일, 마이크로소프트 아웃룩, 스파트몬용 지메일 앱
- 메일 서버(mail server)
- 각 수신자는 메일 서버 안에 메일박스(mailbox)를 갖고 있다.
- 메일박스는 수신한 메시지를 유지하고 관리한다.
- 송신자의 사용자 에이전트 → 송신자의 메일 서버 → 송신자의 메일 서버의 메시지 큐 → 수신자의 메일서버 → 수신자의 메일 서버 내 메일박스
- 수신자의 서버 고장으로 전달할 수 없으면 메시지를 메시지 큐(message queue)에 보관하고 나중에 전달을 재시도한다.
- SMTP(Simple Mail Transfer Protocol)
- 인터넷 전자메일을 위한 주요 애플리케이션 계층 프로토콜
- TCP의 신뢰적인 데이터 전송 서비스를 이용
- 송신자의 메일 서버에서 수행하는 클라이언트와 수신자 메일 서버에서 수행되는 서버를 갖고 있음.
- 메일 서버가 송신할 때 : SMTP의 클라이언트로 동작
- 메일 서버가 수신할 때 : SMTP의 서버로 동작
2.3.1 SMTP
- A가 B에게 메일을 보내는 과정
- A는 네이버의 전자메일 사용자 에이전트에게 B의 전자메일 주소(B@gmail.com)를 제공하고 메시지를 작성하여 메시지를 보내라고 명령한다.
- A의 사용자 에이전트(네이버)는 메시지를 A의 메일 서버에게 보내고 그 메시지는 서버에서 메시지 큐에 들어간다.
- A의 메일 서버에서 동작하는 SMTP의 클라이언트 측은 메시지 큐에서 메시지를 확인한다. 이후 B의 메일 서버에서 수행되는 SMTP 서버에게 TCP 연결을 설정한다. 이때 포트는 25.
- 초기 SMTP 핸드셰이킹 이후에 SMTP 클라이언트는 A의 메시지를 TCP 연결로 보낸다.
- B의 메일 서버 호스트에서 SMTP의 서버 측은 메시지를 수신한다. 이 메시지는 B의 메일 서버의 메일박스에 저장된다.
- B은 사용자 에이전트를 이용해 그 메시지를 읽는다.
- A와 B의 메일 서버가 물리적으로 거리가 멀더라도, 중간 메일 서버는 사용하지 않는다.
- 따라서 B의 서버가 죽어 있으면 전달하지 못한다. 이 떄, A 서버의 메시지 큐에 두고 지속적으로 재발송한다. 일정시간이 지나면, 폐기하고 A에게 발송이 실패했음을 알린다.
- 두 서버의 TCP 연결이 설정되면, SMTP의 서버와 클라이언트는 애플리케이션 계층 핸드셰이킹을 수행한다.
- 핸드셰이킹에서 서로에 대한 정보를 알게 되는 것처럼, 이때 클라이언트는 서버에게 두 사람(송신자와 수신자)의 전자메일 주소를 제공한다.
2.3.2 메일 메시지 포맷
- 우편을 보낼때, 편지 봉투에는 여러 정보가 담기게 된다(발신자, 수신자 등)
- 전자 메일에서는 메시지 몸체 앞에 있는 헤더에 담긴다.
2.3.3 메일 접속 프로토콜
- 메일 서버가 개인의 로컬호스트에 있다면, 항상 메일을 받기 위해 서버가 켜져있어야 한다.
- 따라서, 일반 사용자는 로컬 호스트에서 사용자 에이전트를 수행하고 늘 켜져 있는 공유 메일 서버에 저장된 메일박스에 접근한다.
- 즉, 메일 서버는 보통 사용자들과 공유한다.
- 송신자의 사용자 에이전트는 메일 서버를 통해 수신자의 메일 서버로 메시지를 전송한다.
- 왜 송신자의 사용자 에이전트가 직접 수신자의 메일 서버로 메시지를 전송하지 않을까?
- 송신자의 사용자 에이전트는 수신자의 메일 서버에 도달할 수 없기 때문
- 이유는 보안 문제, SMTP의 규약, 스팸 방지, 신뢰성 보장 등 다양하다.
- 수신자의 사용자 에이전트는 받은 메시지를 보기 위해 SMTP를 사용할 수 없다.
- SMTP는 push지만 메시지는 pull 해야 하기 때문
- 메시지를 받는 방법
- HTTP를 통해 요청
- 인터넷 메일 접근 프로토콜(Internet Mail Access Protocol, IMAP) 사용
- 이 둘 모두 메일 서버에 의해 유지되는 폴더를 관리하게 된다.