강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
전자우편 개요,구조,주소,규약.
조회 : 9,852  


전자우편 시스템은 전자우편이나 e-mail이라는 이름으로 TCP/IP를 사용한 유닉스 어플리케이션으로 널리 알려져 있습니다. 전자우편 시스템을 이용하면 문장 등의 다양한 정보를 지정한 상대와 주고 받을 수 있는데, TCP/IP에서 사용되는 전자우편의 대표적인 송/수신 프로토콜은 SMTP(Simple Mail Transfer Protocol)입니다.

전화와 달리 전자우편 시스템을 이용하면 수취인의 부재와 관계없이 우편을 보낼 수가 있고 경우 에 따라 받는 상대뿐만 아니라 보내는 사람이 원할 때에 보낼 수 있어서 편리합니다. 물론 상대가 부재중일 경우를 가상한다면 팩스를 생각할 수도 있지만 보내는 사람이 파일이나 전문 을 프린터로 출력을 해서 보내야 하고 수취인이 그것을 다시 PC에 입력해야 하는 경우도 생기며 더 우기 수취인이 받은 우편을 편집할 수 있기 때문에 전자우편 시스템이 더 편리합니다. 이 외에도 같은 내용의 우편을 많은 사람에게 동시에 보내는 경우 수신처를 복수로 지정하거나 미 리 그룹화 시켜서 동시 송신이나 그룹 송신을 간단히 할 수 있다는 장점이 있습니다.

PC에서 TCP/IP를 이용한 전자우편 시스템으로는 가장 간단한 도스 베이스의 명령에서 부터 윈도우 즈 베이스의 그룹웨어등 여러 가지가 있습니다. 또, 기능적으로도 문장 파일밖에 보낼 수 없는 것 에서부터 음성 파일이나 영상 데이타를 보낼 수 있는 멀티미디어 대응의 것까지 여러 가지가 있습 니다.


사용자는 e-mail을 사용하기 위해 자신의 user agent를 이용하게 되는데 널리 보급된 user agent 로는 MH, Berkeley Mail, Elm, Pine, Mailx 그리고 Mush 등이 있습니다. 즉 UA는 메일을 보내기 위한 소프트웨어라고 생각할 수 있습니다.

메일 전송 소프트웨어는 RFC 821에서 정한 규칙을 따르고 있으며 이의 근본적인 목적은 ARPANET의 사용에 표준을 마련하는 것이었습니다. 여기에는 SMTP 프로토콜을 규정하고 있으며 두 MTA가 서로 어떻게 통신하는 지를 기술하고 있습니다. 또한 갈수록 늘어나는 표준(데이타 암호화, 국제 문자 집합 지원, MIME등)을 충족하도록 구성되어 있습니다.

TCP를 이용한 mail의 교환은 MTA(Message Transfer Agent)에 의해 수행이 되는데, 유닉스 환경에 서 가장 잘 알려진 MTA가 Sendmail입니다. 이 Sendmail은 client가 보내는 메일을 외부로 전송하 고, 또 외부에서 들어온 메일을 받아서 각 client에게 전달해 주는 역할을 합니다. MTA는 메일을 주고 받는 두 메일 서버 사이의 실질적인 메일 전송을 담당합니다. 그런데 Sendmail은 원래 7비트만 전송하도록 되어 있었기 때문에 한글로 메일을 작성해서 보내면 MSB가 모두 날아가서 이상한 영문으로 깨져서 보이게 됩니다. 이를 해결하기 위해서 과학기술원에 서 Sendmail을 수정하여 메세지 중에 한글 텍스트가 포함되어 있으면 이것을 ISO2022-KR이란 방식 으로 인코딩하여 7비트로 만들어서 전송하고, 들어온 메일이 ISO2022-KR로 인코딩이 되어 있으면 그것을 원래 메세지로 복원하는 기능을 갖춘 한글 Sendmail을 만들어서 보급하게 되었습니다.


이 방식은 보내는 쪽 서버와 받는 쪽 서버 모두 한글 Sendmail이 설치되어 있어야 하며 국내에서 메일을 주고 받을 때는 별문제가 없지만, 국내라도 한글 패치되지 않은 원래 영문 Sendmail을 사 용하는 곳이라든가 외국 사이트에 메일을 보내면 받는 쪽 Sendmail이 ISO2022-KR 인코딩을 해독 하지 못하기 때문에 인코딩된 메세지가 그대로 전달되어 한글 메세지가 깨져보이게 됩니다. 일반 적으로 사용자는 MTA를 다룰 필요가 없으며 로컬 MTA를 셋업하는 것은 시스템 관리자의 책임입니 다.

모든 컴퓨터 시스템의 전자 우편은 일정한 구조를 가지고 있습니다. 크게 구분하면 envelope, header 그리고 body로 구성되어 있는데 envelope는 전송을 위해 MTA에 의해 이용되고 실제 우 편의 봉투와 같은 역할을 하는데 SMTP 명령으로 구성됩니다.
header는 user agent에 의해 사 용되며 보낸 사람과 날짜, 받는 사람 및 제목 등으로 구성되어 있습니다. body는 보내는 메세 지의 내용을 나타냅니다.
UA는 body에 header를 덧붙여 이를 MTA에게 전달하고 MTA는 또다시 header와 envelope을 추가해 목적지의 MTA에게 전달합니다.

아래는 실제로 클라이언트에 의해 보내지는 393 바이트의 데이타를 나타냅니다.


여기에서 from 및 received는 전자 우편이 어디를 경유하여 목적지까지 도착하게 되었는지를 보여주며 date는 메세지가 보내진 날짜와 시간을 나타냅니다.
Message-ID는 전자우편이 어떠한 경로를 거쳐 왔는지를 조사하는데 사용되며 모든 우편의 이 내용은 다르게 되어 있습니다.
To는 메세지를 받는 이의 전자 우편 주소를 나타내고 Subject 는 메세지의 주제를 나타냅니다.

e-mail은 일반 우편과 마찬가지로 주소를 통하여 주고 받게 되고 인터넷 상에서의 주소는 세계 어느곳에서나 공통으로 사용할 수 있습니다.
전자 메일을 위한 주소는 적어도 개인의 메일을 다루는 장비의 이름으로 만들어 집니다. 그리고 사용자의 식별은 시스템에 의해 인지되고 이는 받는이의 login name이 될수도 있고 아닐 수도 있 습니다.
장비 이름이 번역되는 방법 즉, 메세지가 어디로 날아가서 어떻게 받는이의 이름과 이 이 름을 결합할 것인가는 사용하고 있는 네트웍에 크게 의존합니다.

인터넷 사이트는 RFC 822를 고수하고 있는데 이것은 user@host.domain의 표기를 요구하고 여기서 host.domain은 호스트의 전체 도메인 이름입니다. 가운데 있는 것은 "at" 기호라고 불리는데 이 표기는 목적지 호스트에의 라우팅을 포함하지 않고 대신에 유일한 호스트 이름을 주기 때문에 절 대 주소라고 합니다.


예를들어 아이네트의 abc라는 계정을 가진 사람에게 메일을 보내기 위해서 유닉스의 mail이라는 명령을 사용한다면 mail abc@nuri.net으로 보내면 됩니다. 여기서 nuri.net가 위에서 설명한 전 체 도메인 명이 되고 이 도메인 내의 메일 서버에 메세지가 전달된 후 목적지인 abc라는 계정을 가진 이에게로 최종 전달됩니다.

이외에 전자우편을 보내는 사람이 사용하는 호스트와 동일한 호스트에 계정을 가진 사람에게 메 일을 보낼 때는 단지 계정만 적어주면 됩니다. 즉 아이네트에 abc라는 계정을 가진 사람이 동일 한 호스트의 welcome이라는 사람에게 메일을 보낼 때는 mail welcome라고 하면 됩니다.

만약 전자우편을 받을 welcome이라는 사람이 같은 네트웍에 연결되어 있는 다른 호스트 inet에 계정을 가지고 있을 시는 @ 뒤에 호스트 명만 적어주면 됩니다. 즉 mail welcome@inet라고 하면 됩니다.

필요에 따라서는 여러 사람에게 동시에 메일을 보낼 수도 있는데 이때에는 메일의 주소를 나열하 면 됩니다. 즉 mail abc@nuri.net sun@inet.co.kr과 같이 하면 됩니다.


현재 각종 인터넷 어플리케이션의 핵심적인 위치를 차지하고 있는 e-mail은 RFC 822를 기반으로 정보 교환이 이루어지고 있습니다. 하지만 RFC 822는 정보 교환 매체를 7비트인 US-ASCII로 제 한하고 있어 우리나라와 일본, 중국등 8비트 문자 코드를 사용하는 나라에서는 각 언어별 문자 세트를 지정하고 8비트 문자들을 7비트로 인코딩하여 사용하고 있습니다.
국내에서는 인터넷 한 글 메일의 교환을 위하여 8비트 KSC5601 한글코드로 작성된 전자우편을 전송하기 위해 7비트로 인코드하며 정보 교환용 국제 표준인 ISO-2022 확장 규정을 준수하는 인코딩 방법을 사실상의 표 준으로 사용하고 있습니다.
이 방식으로 인코드한 것이 ISO-2022-KR이며 RFC 1557에서 한글 문자 인코딩 방법을 제시하고 있습니다.

전자 우편으로 정보를 교환시 전송 메세지의 형식과 전송 방법은 SMTP에 따라 이루어지게 됩니다.
호스트들 사이에 전자 우편 메세지를 전송하기 위해 사용되며 전송은 수신측의 포트 25에 있는 T CP를 통해 일어납니다.
메일서버 프로세서는 항상 수행되고 있으면서 메세지를 처리하기 위해 대 기하고 있는데 SMTP는 목적지에 대한 리스트와 함께 사용자로 부터 메세지를 받아들입니다.

그런 다음 사용자들이 같은 호스트에 존재하는 경우를 제외하고는 메세지 복사본을 각 목적지로 전송을 하게 됩니다. 사용자들이 같은 호스트에 존재하는 경우에는 메세지를 해당 호스트에 단 한 차례만 전송을 하고 이때 목적지에 대한 리스트도 같이 전송이 됩니다.
메세지를 성공적으로 전달 하지 못했을 경우에 SMTP는 몇일간 계속해서 여러차례 전송을 시도하며 실패할 경우에는 전송을 포기하고 보낸 사람에게 내용을 알리게 됩니다.

전자우편 시스템이 사용하는 규약으로 MIME(Multi-purpose Internet Mail Extention)이 있는데 이 는 7비트 ASCII 외에 여러 종류의 데이타를 전송하기 위한 규약입니다.
MIME에서 정하고 있는 데 이타 형식에는 text, multipart, application, message, image, audio, video와 같은 것들이 있습 니다.

그리고 전송 데이타에 대한 정보를 표시하기 위해 여러 Header Field를 가지는데 여기에는 MIME -Version Header Field, Content-Type Header Field, Content-Transfer-Encoding Header Field가 있고 이외에 Content-ID와 Content-Description Header Field라는 것을 선택적으로 이용할 수 있 습니다.

MIME에서 이용되는 인코딩방식도 여러 가지가 있는데 이에는 7bit, 8bit, binary, base64, Quoted -Printable, x-token 방식이 있습니다.
이중 주로 사용되는 것은 7bit, 8bit, base64, QP이고 나 머지 두 방식은 거의 쓰이지 않습니다.
이상에서 설명한 메일의 전송방식과 여러 규약, 인코딩 방식등에 대해서는 후에 좀더 기술적인 내 용으로 소개해 드리겠습니다.


메일 소프트웨어에는 자신의 우편함이 등록되어 있는 메일 서버에 수신 우편을 가지러 가는 기능 을 가진 것이 있습니다. 이 경우 사용되는 프로토콜이 "POP 3"입니다.
이 프로토콜은 메일 소프트웨어가 작동하고 있는 클라이언트측의 컴퓨터와 메일 서버사이에서 우 편을 관리하기 위해서 규정된 것입니다.
이 사양은 RFC 1725에 규정되어 있습니다.


클라이언트가 메일 서버로 부터 우편을 취득할 때에는 먼저 서버와의 사이에 통신 경로를 확립합 니다.
메일 서버내 POP 3 서버는 보통 클라이언트로 부터의 통신 경로 확립을 기다리는 상태로 되 어 있습니다.
아래의 과정들은 POP 3의 통신 순서를 나타냅니다.

  1. 클라이언트와의 접속이 완료되면 POP 3 서버는 'greeting'이라는 회신을 보냅니다.

  2. 서버로부터 회신을 받은 클라이언트는 먼저 APOP 명령으로 자기 앞으로 보내진 우편이 메일 서버에 수신되어 있는가를 문의합니다. 그러면 POP 3서버는 몇 통이 와 있는 지를 회신합니 다.

  3. 클라이언트의 LIST 명령에 대해 POP 3 서버는 수신하고 있는 모든 우편의 크기를 순서대로 보내줍니다.

  4. 그 다음 실제로 우편을 취득하게 되는데 LIST 명령으로 회신된 수신 우편 번호를 PETR 명령 으로 지정합니다. POP 3 서버는 이에 응해 지정된 우편 번호의 우편을 클라이언트에게 보냅니다.

  5. 여기서 클라이언트는 취득한 우편을 메일 서버상의 해당 수신 우편을 삭제할 수 있습니다.

  6. 수신 우편의 취득이 종료된 시점에서 클라이언트는 QUIT 명령으로 POP 3 서버에게 종료를 통지합니다.

  7. 통신에 사용한 커넥션을 끊음으로써 모든 과정이 끝나게 됩니다.

실제 메일을 주고 받는 과정에서 두 메일 서버사이에 메세지의 전달이 이루어지고 전달된 메세지 를 보고자하는 클라이언트에서는 POP 3를 이용해 메일을 끌고와서 확인하게 됩니다.
말그대로 우 체국의 역할을 하는 프로토콜이 POP 3입니다.

Sendmail의 역할과 기능에는 여러가지가 있는데 아래와 같은 것들이 있습니다.

  1. 메일을 라우팅합니다.
    사용자의 메일 프로그램으로부터 메일을 받고 그 메일 주소를 해석하여 전송 프로그램에 맞 는 적당한 형태로 그 주소를 재작성하고 정확한 전송 프로그램에 그 메일을 라우팅합니다. 이러한 사항들은 최종 사용자가 관여하지 않아도 되며 만약 메일에 적절한 주소가 부여되었 다면 Sendmail은 전송이 제대로 되는지를 확인합니다. 반면에 들어오는 메일에 관해서는 그 주소를 해석하여 사용자 프로그램에 메일을 전달하거나 다른 시스템에 메일을 포워드시킵니 다.

  2. SMTP 메일을 받거나 전송을 합니다.

  3. 메일링 리스트를 가능하게 하는 시스템 전반의 메일 aliase를 제공합니다.

즉, Sendmail은 메세지를 네트웍 전반에 걸쳐 라우팅하면서 한사람 또는 다른 많은 사람들에게 전송합니다. 정확한 장소에 메세지를 전달하기 위해 필요한 만큼 포워딩을 수행하며 사용자 인 터페이스를 위해 고려된 것이 아닌 단지 Pre-Format된 메세지를 전송하는 역할을 합니다. 메세 지의 복사본을 리스트화된 모든 주소에 전송하며 수신자의 홈디렉토리의 포워딩 파일에 기록된 곳으로 복사본을 전송하며 만약 그 글이 전송할 수 없는 것으로 인식되면 그 장소와 실패의 성 격을 송신자에게 되돌려 주거나 수신자의 홈 디렉토리에 있는 dead.letter 화일에 저장시킵니다.

네트웍으로부터 SMTP 메일을 받기 위해서는 시스템이 시작되는 동안 데몬으로서 Sendmail을 실 행시켜야 합니다. Sendmail 데몬은 TCP 포트 25를 계속 살피고 들어오는 메일을 처리하게 되는 데 대부분의 경우 Sendmail을 실행시키기 위한 코드는 boot script들 중의 하나로 들어 있으며 Sendmail이 실행되면 메일 queue 디렉토리는 아직 전송되지 않은 메일을 집어내게 됩니다. 물론 이 과정에서 lock file은 부트되는 동안 이동되어져야 합니다.

Sendmail시스템이 중앙 메일 서버로서 작동되려면 메일 aliases가 필수적입니다. 메일 aliases는 각각의 사용자들에 대한 이름들을 교체하고, 메일을 다른 호스트에 포워딩하며, 메일링 리스트를 제공하고 있습니다. Sendmail aliases는 /etc/aliases 파일에 정의되어 있으며 그 양식은 alias:recipient[,recipient,...]입니다.

여기서 alias는 메일에 붙여진 이름이며 recipient는 메일이 전송되어 지는 이름입니다. recipient는 사용자 이름이거나 혹은 다른 aliases의 이름 또는 전체 전자 메일 주소일 수도 있 습니다.

Sendmail은 개개의 사용자들이 그들 자신의 포워딩을 지정할 수 있도록 해줍니다. 사용자는 개인 들의 포워딩을 홈디렉토리의 .forward 화일에 정의해주면 됩니다. Sendmail은 alias 파일을 참조 한 후 사용자에게 메일을 최종적으로 전달하기 위해서 이 파일을 체크합니다. 만약 abc가 홈디렉 토리의 포워드 파일에 abc@inet.co.kr를 포함시키면 Sendmail은 local사용자 abc로 전송한 메일을 inet.co.kr로 포워드 시키게 됩니다.

결국 메일의 alias와 메일 포워딩은 alias 파일과 .forward 에 의해 이루어집니다.


Copyright(c) PSINet Korea Inc. All right reserved. inoc@kr.psi.net


[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=885


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
(주) 수퍼유저