CS/Linux

[Linux] X Window System

kyoulho 2025. 7. 27. 14:45

X 윈도우는 왜 "서버-클라이언트" 구조일까?

X 윈도우에서 서버는 내 컴퓨터입니다. 반대로, 내가 실행한 GUI 앱(firefox, gedit 등)은 클라이언트입니다.

  • X 서버: 화면, 마우스, 키보드 등 입력·출력 장치를 가진 쪽. 즉, 내 컴퓨터가 X 서버입니다.
  • X 클라이언트: 창을 띄우고 싶어하는 프로그램. X 서버에게 그려달라고 요청함

즉, 프로그램은 직접 화면에 그림을 그리는 것이 아니라, X 서버에게 요청합니다. 이 구조 덕분에 GUI 프로그램은 로컬에서도, 네트워크를 통해서도 화면을 띄울 수 있습니다.


X 윈도우의 구성 요소

구성 요소 역할 설명
X Server 화면에 실제로 그리는 주체. 마우스, 키보드 이벤트도 여기서 처리
X Client 창을 띄우고 싶어하는 프로그램. X 서버에게 그려달라고 요청함
X Protocol X 클라이언트 ↔ X 서버 간 통신 규칙. 요청/응답 구조로 동작함
Xlib / XCB 클라이언트 프로그램이 X 서버와 쉽게 통신할 수 있도록 도와주는 라이브러리
Window Manager 창 위치, 닫기 버튼, 포커스 이동 등을 처리. X 서버는 이걸 신경 쓰지 않음
X Session 로그인 후 어떤 프로그램들을 실행할지 결정하는 스크립트
Display Manager GUI 로그인 화면을 띄워주는 프로그램 (gdm, lightdm 등)


왜 이렇게 복잡하게 만들었을까?

X 윈도우는 1984년에 만들어졌습니다. 목표는 단순합니다. "서버에 프로그램을 실행해도, 내 로컬 컴퓨터 화면에서 사용할 수 있게 만들자". 그래서 다음과 같은 구조가 되었습니다:

  • 프로그램은 어디서든 실행할 수 있음
  • 입출력 장치는 사용자에게 있음
  • 서버와 클라이언트가 네트워크로 통신함


실제 흐름: 내 컴퓨터에서 X 윈도우가 작동하는 방식

  1. 컴퓨터를 켜면 Display Manager가 실행되어 로그인 창이 뜹니다.
  2. 로그인하면 X Server가 구동됩니다. 이때 :0 같은 Display 번호가 할당됩니다.
  3. X Session 스크립트가 실행되며, 바탕화면과 창 관리자(Window Manager)가 실행됩니다.
  4. 사용자가 firefox를 실행하면, 이 앱은 X 클라이언트가 되어 DISPLAY=:0을 기준으로 X 서버에 연결합니다.
  5. X 서버는 요청을 받아 실제 창을 띄우고, 마우스나 키보드 입력도 해당 클라이언트에게 전달합니다.

📌 여기서 중요한 건: 모든 GUI 앱은 서버에 요청만 하고, 그리기는 X 서버가 담당한다는 점입니다.


다중 사용자 환경에서는 어떻게 동작할까?

X 윈도우는 여러 사용자가 동시에 각각의 X 세션을 사용할 수 있도록 설계되어 있습니다. 예를 들어, 한 리눅스 시스템에 두 명의 사용자가 로그인한다고 가정해 봅시다.

  • 첫 번째 사용자는 :0 디스플레이에서 GUI 세션을 실행합니다.
  • 두 번째 사용자는 :1 디스플레이로 실행하거나, 원격 데스크탑 또는 Xnest, Xephyr 같은 도구로 별도 X 서버를 실행합니다.

각 사용자는 자신만의 X 서버 인스턴스와 DISPLAY 번호를 가지며, 서로 독립된 환경에서 GUI를 사용할 수 있습니다.

startx -- :1  # 두 번째 사용자가 독립된 X 서버(:1)로 GUI 실행

이런 구조 덕분에

  • 각 사용자는 자신의 창, 키보드/마우스 입력을 독립적으로 가짐
  • 서로의 세션에 영향을 주지 않음
  • 보안적으로도 격리된 환경이 됨

📌 주의할 점:

  • 두 명 이상의 사용자가 동시에 GUI를 쓰려면, 각각의 X 서버 인스턴스를 실행해야 하며, 그래픽 하드웨어가 이를 지원해야 합니다.
  • 일반적으로는 VNC, X2Go, RDP 등 원격 데스크탑 방식과 함께 사용합니다.


원격 환경에서 X 윈도우는 어떻게 동작할까?

ssh -X user@server
xclock  # 서버에서 실행했지만, 내 화면에 창이 뜸

이 상황에서 구성은 다음과 같습니다:

  • X 서버: 내 컴퓨터 (출력 장치를 가진 쪽)
  • X 클라이언트: 원격 서버에서 실행된 xclock
  • X 프로토콜: SSH를 통해 암호화된 채널로 통신됨

DISPLAY=localhost:10.0 같이 자동으로 설정되며, 원격 프로그램은 내 화면에 창을 그릴 수 있게 됩니다. 이게 가능한 이유는, X 윈도우 구조가 원래 네트워크 기반으로 설계되었기 때문입니다.


창 안에 창? 중첩 X 환경 (Xnest, Xephyr)

X 윈도우는 자기 안에 또 하나의 X 서버를 실행할 수 있습니다. 이것을 중첩 X 환경이라 부릅니다. 예를 들어:

Xnest :1 &
DISPLAY=:1 xterm
  • Xnest는 :1이라는 가상 X 서버를 실행합니다.
  • 그 안에 xterm이 뜨면, 내 바탕화면 위에 또 하나의 가상 데스크탑처럼 보입니다.

이 방식은 다중 사용자 세션 테스트, 윈도우 매니저 비교, 격리된 GUI 환경 구성 등에 쓰입니다.


xhost: 접근 제어를 단순하게 설정

xhost는 X 서버에 접근할 수 있는 클라이언트를 허용하거나 거부하는 명령어입니다. 이 방식은 단순하지만, IP 기반으로만 제어하기 때문에 암호화도 없고 보안에 약함. 테스트 환경에서만 사용 추천.

  • xhost + : 누구든지 접근 허용 (보안에 매우 취약함)
  • xhost +hostname : 특정 호스트에서 오는 접근만 허용
  • xhost - : 접근 제어를 다시 활성화
xhost +192.168.0.100

 


xauth: 인증 기반으로 보안 강화

xauth는 X 서버 접근 시 필요한 인증 토큰(cookie)을 관리하는 도구입니다. SSH -X 연결 시에도 내부적으로 사용됩니다. xauth 기반은 인증 키로 접근을 제어하므로 보안성이 높고 실무에 적합합니다.

  • .Xauthority 파일에 저장된 쿠키를 통해 접근 여부를 판단함
  • 사용자는 xauth list, xauth add, xauth merge 등을 통해 제어 가능
xauth list  # 현재 DISPLAY에 대한 인증 정보 확인