본문 바로가기
TYLER SONGBlog
← Blog index
CS8 min read

MAC Address: 같은 네트워크에서 장치를 식별하는 링크 계층 주소

MAC 주소(Media Access Control Address)는 이더넷과 와이파이에서 네트워크 인터페이스를 식별하는 링크 계층 주소다. 스위치는 MAC 주소를 학습해 프레임을 전달하고, 호스트는 주소 결정 프로토콜(ARP)로 IPv4 주소에 대응하는 MAC 주소를 찾는다. MAC 주소는 같은 브로드캐스트 도메인 안에서 사용되며 라우터를 통과할 때 프레임

By 송민성

1. 개념

MAC 주소(Media Access Control Address)는 이더넷 프레임(Ethernet Frame)의 출발지와 목적지를 나타내는 링크 계층(Link Layer) 주소다.

일반적인 MAC 주소는 48비트이며, 8비트씩 6개로 나누어 16진수로 표현한다.

text
00:1A:2B:3C:4D:5E

앞쪽 24비트는 일반적으로 제조사에 할당된 조직 고유 식별자(OUI, Organizationally Unique Identifier), 뒤쪽 24비트는 제조사가 관리하는 인터페이스 식별자로 구성된다. 다만 운영체제의 MAC 주소 무작위화(MAC Randomization), 가상 머신, 컨테이너 환경에서는 소프트웨어가 생성한 주소를 사용할 수 있다.

MAC 주소의 첫 번째 바이트에는 주소 성격을 나타내는 비트가 있다.

  • 최하위 비트: 개별 주소(Unicast)인지 그룹 주소(Multicast)인지 구분
  • 두 번째 최하위 비트: 전역 관리 주소(Universally Administered Address)인지 로컬 관리 주소(Locally Administered Address)인지 구분

모든 비트가 1인 FF:FF:FF:FF:FF:FF는 브로드캐스트 주소(Broadcast Address)다. 같은 브로드캐스트 도메인의 모든 장치가 해당 프레임을 수신한다.

2. 왜 사용하는가

IP 주소는 네트워크 사이의 경로를 찾는 논리 주소다. MAC 주소는 현재 연결된 링크에서 실제 프레임을 어느 인터페이스로 전달할지 결정하는 주소다.

호스트가 같은 로컬 네트워크의 다른 호스트로 IPv4 패킷을 보낼 때 다음 정보가 필요하다.

  1. 목적지 IPv4 주소가 같은 서브넷인지 판단한다.
  2. 주소 결정 프로토콜(ARP, Address Resolution Protocol)로 목적지 IPv4 주소의 MAC 주소를 찾는다.
  3. 해당 MAC 주소를 목적지로 지정한 이더넷 프레임을 만든다.
  4. 스위치가 MAC 주소 테이블을 조회해 프레임을 전달한다.

목적지가 다른 네트워크에 있다면 원격 호스트의 MAC 주소를 찾지 않는다. 기본 게이트웨이(Default Gateway)의 MAC 주소를 찾아 프레임을 보낸다.

3. 동작 원리

이더넷 프레임 전달

이더넷 프레임에는 목적지 MAC 주소와 출발지 MAC 주소가 포함된다.

text
[목적지 MAC][출발지 MAC][EtherType][데이터][FCS]

스위치는 프레임을 받을 때 출발지 MAC 주소와 수신 포트를 MAC 주소 테이블에 기록한다. 이후 목적지 MAC 주소를 조회해 다음처럼 처리한다.

  • 주소와 포트를 알고 있음: 해당 포트로만 전달
  • 주소를 모름: 수신 포트를 제외한 같은 가상 LAN(VLAN)의 포트로 플러딩(Flooding)
  • 브로드캐스트 주소: 같은 가상 LAN의 모든 관련 포트로 전달
  • 목적지가 수신 포트와 같음: 다른 포트로 전달하지 않음

MAC 주소 테이블 항목은 일정 시간 사용되지 않으면 제거될 수 있다. 구체적인 유지 시간은 장비 설정에 따라 다르다.

주소 결정 프로토콜

호스트 A가 같은 서브넷의 호스트 B에게 IPv4 패킷을 보내려 하지만 B의 MAC 주소를 모르는 상황을 생각해 보자.

text
호스트 A
IPv4: 192.168.0.10
MAC:  00:11:22:33:44:55

호스트 B
IPv4: 192.168.0.20
MAC:  AA:BB:CC:DD:EE:FF

호스트 A는 브로드캐스트로 ARP 요청을 보낸다.

text
192.168.0.20을 사용하는 장치는 MAC 주소를 알려 달라.

호스트 B는 자신의 MAC 주소를 담은 ARP 응답을 보낸다. 호스트 A는 이 대응 관계를 ARP 캐시에 저장하고 이후 프레임 전송에 사용한다.

text
192.168.0.20 → AA:BB:CC:DD:EE:FF

IPv6에서는 ARP 대신 이웃 탐색 프로토콜(NDP, Neighbor Discovery Protocol)을 사용한다.

라우터를 지날 때

MAC 주소는 종단 간 주소가 아니다. 라우터가 패킷을 다음 네트워크로 전달할 때 기존 이더넷 프레임을 제거하고 다음 링크에 맞는 새 프레임을 만든다.

text
클라이언트 → 라우터
출발지 MAC: 클라이언트 MAC
목적지 MAC: 라우터 MAC

라우터 → 다음 장치
출발지 MAC: 라우터의 송신 인터페이스 MAC
목적지 MAC: 다음 홉의 MAC

IP 패킷의 출발지와 목적지 IP 주소는 일반적인 라우팅 과정에서 유지되지만, 각 링크의 MAC 주소는 홉마다 바뀐다. 네트워크 주소 변환(NAT)이 적용되면 IP 주소도 변경될 수 있다.

4. 코드 예제

다음 파이썬 코드는 MAC 주소를 정규화하고 주소 종류를 판별한다.

python
import re def parse_mac(value: str) -> bytes: normalized = re.sub(r"[:-]", "", value.strip()) if not re.fullmatch(r"[0-9a-fA-F]{12}", normalized): raise ValueError("MAC 주소는 12개의 16진수 문자여야 합니다.") return bytes.fromhex(normalized) def format_mac(address: bytes) -> str: if len(address) != 6: raise ValueError("MAC 주소는 6바이트여야 합니다.") return ":".join(f"{byte:02X}" for byte in address) def classify_mac(address: bytes) -> dict[str, bool]: if len(address) != 6: raise ValueError("MAC 주소는 6바이트여야 합니다.") first_octet = address[0] return { "브로드캐스트": address == b"\xff\xff\xff\xff\xff\xff", "멀티캐스트": bool(first_octet & 0b00000001), "로컬_관리": bool(first_octet & 0b00000010), } def main() -> None: samples = [ "00:1a:2b:3c:4d:5e", "02-42-ac-11-00-02", "ff:ff:ff:ff:ff:ff", "01:00:5e:00:00:fb", ] for sample in samples: address = parse_mac(sample) properties = classify_mac(address) print(format_mac(address)) print(f" 브로드캐스트: {properties['브로드캐스트']}") print(f" 멀티캐스트: {properties['멀티캐스트']}") print(f" 로컬 관리: {properties['로컬_관리']}") if __name__ == "__main__": main()

리눅스에서는 다음 명령으로 네트워크 인터페이스와 이웃 캐시를 확인할 수 있다.

shell
ip link show ip neighbor show

ip link show는 인터페이스의 MAC 주소를 보여 준다. ip neighbor show는 IPv4의 ARP 캐시와 IPv6의 이웃 캐시를 함께 보여 준다.

5. 시간 복잡도 또는 성능 특성

MAC 주소 자체는 고정 길이 48비트이므로 주소 비교 비용은 입력 크기에 관계없이 O(1)이다.

스위치의 MAC 주소 테이블은 일반적으로 콘텐츠 주소화 메모리(CAM, Content Addressable Memory) 기반 하드웨어로 조회한다. 소프트웨어 관점에서는 일정한 시간에 가까운 조회가 가능하지만, 실제 지연 시간과 처리량은 장비 구조와 테이블 크기에 따라 달라진다.

목적지 MAC 주소가 테이블에 없으면 스위치는 플러딩을 수행한다. 이때 복제되는 프레임 수는 같은 가상 LAN에 속한 전달 가능 포트 수에 비례한다.

ARP 캐시는 매번 브로드캐스트 요청을 보내는 비용을 줄인다. 캐시 항목의 유지 시간과 갱신 정책은 운영체제에 따라 다르다.

6. 실무 사용 사례

장애 분석

같은 서브넷의 서버에 연결할 수 없을 때 다음 순서로 확인한다.

shell
ip address show ip route show ip neighbor show

이웃 캐시가 FAILED 또는 INCOMPLETE 상태라면 ARP 응답을 받지 못한 상태일 수 있다. 잘못된 가상 LAN 설정, 링크 장애, 방화벽, 중복 IP 주소를 함께 점검한다.

가상화와 컨테이너

가상 머신의 가상 네트워크 인터페이스도 MAC 주소를 가진다. 컨테이너 네트워크는 가상 이더넷 장치(Veth), 브리지(Bridge), 네트워크 이름공간(Network Namespace)을 조합해 별도 링크 환경을 구성할 수 있다.

네트워크 접근 제어

일부 네트워크는 등록된 MAC 주소만 연결하도록 제한한다. 하지만 MAC 주소는 소프트웨어로 변경하거나 위조할 수 있으므로 강한 인증 수단이 아니다. 접근 제어가 필요하면 IEEE 802.1X 같은 인증 방식과 함께 사용해야 한다.

트래픽 분석

패킷 캡처 도구에서 이더넷 헤더를 확인하면 프레임의 출발지와 목적지, 브로드캐스트 여부, ARP 요청 흐름을 분석할 수 있다.

shell
sudo tcpdump -e -n arp

-e는 링크 계층 헤더를 표시하고, -n은 주소를 이름으로 변환하지 않는다.

7. 주의할 점

MAC 주소는 인터넷 전체에서 사용되는 목적지 주소가 아니다

MAC 주소는 현재 링크의 프레임 전달에 사용된다. 다른 네트워크의 서버에 접속할 때 필요한 목적지 MAC 주소는 서버 MAC이 아니라 기본 게이트웨이 MAC이다.

MAC 주소만으로 사용자를 식별할 수 없다

운영체제는 개인정보 추적을 줄이기 위해 와이파이 검색이나 네트워크 연결에서 임의 MAC 주소를 사용할 수 있다. 장치의 MAC 주소도 변경하거나 복제할 수 있다.

중복 주소는 통신 장애를 만든다

같은 브로드캐스트 도메인에서 두 인터페이스가 같은 MAC 주소를 사용하면 스위치의 MAC 주소 테이블 항목이 포트 사이에서 반복적으로 이동할 수 있다. 프레임이 잘못된 포트로 전달되거나 연결이 불안정해진다.

ARP 응답은 신뢰할 수 있는 인증 정보가 아니다

ARP에는 응답자의 신원을 검증하는 기능이 없다. 공격자는 거짓 IP-MAC 대응 관계를 알려 주는 ARP 스푸핑(ARP Spoofing)을 시도할 수 있다. 네트워크 분리, 동적 ARP 검사(DAI, Dynamic ARP Inspection), 암호화된 상위 계층 프로토콜로 위험을 줄인다.

제조사 정보가 항상 정확하지 않다

조직 고유 식별자로 제조사를 추정할 수 있지만, 로컬 관리 주소와 무작위 주소에는 적용할 수 없다. 제조사 식별 결과를 인증이나 보안 판단의 근거로 사용하면 안 된다.

8. 핵심 정리

  • MAC 주소는 이더넷과 와이파이 링크에서 인터페이스를 식별하는 주소다.
  • 일반적인 MAC 주소는 48비트이며 6개의 16진수 바이트로 표현한다.
  • 스위치는 출발지 MAC 주소를 학습하고 목적지 MAC 주소에 맞는 포트로 프레임을 전달한다.
  • IPv4 호스트는 ARP로 IP 주소에 대응하는 MAC 주소를 찾는다.
  • 라우터를 통과할 때 링크가 바뀌므로 프레임의 출발지와 목적지 MAC 주소도 바뀐다.
  • MAC 주소는 변경하거나 위조할 수 있으므로 사용자 인증 수단으로 사용하면 안 된다.