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 윈도우가 작동하는 방식
- 컴퓨터를 켜면 Display Manager가 실행되어 로그인 창이 뜹니다.
- 로그인하면 X Server가 구동됩니다. 이때 :0 같은 Display 번호가 할당됩니다.
- X Session 스크립트가 실행되며, 바탕화면과 창 관리자(Window Manager)가 실행됩니다.
- 사용자가 firefox를 실행하면, 이 앱은 X 클라이언트가 되어 DISPLAY=:0을 기준으로 X 서버에 연결합니다.
- 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에 대한 인증 정보 확인
'CS > Linux' 카테고리의 다른 글
| [Linux] 파일 시스템의 ACL과 속성(Attributes) (2) | 2025.08.09 |
|---|---|
| [Linux] 네트워크 인터페이스와 Docker 네트워크 트래픽 구조 분석 (2) | 2025.07.30 |
| [Linux] systemd 기반 시스템 운영에 필요한 필수 명령어 (1) | 2025.07.27 |
| [Linux] 데몬의 실행 방식 (3) | 2025.07.25 |
| [Linux] 파이프와 리다이렉션에서 셸의 역할과 프로세스 생성 원리 (0) | 2025.07.23 |