본문 바로가기
UX 개발/CSS

CSS `user-select` 완전 이해하기: 텍스트 선택을 어디까지 막을 수 있을까?

반응형

 

웹사이트를 보다 보면 어떤 텍스트는 드래그로 선택이 되고, 어떤 요소는 아무리 마우스로 긁어도 선택되지 않는 경우가 있습니다. 이 동작을 제어할 때 사용하는 CSS 속성이 바로 user-select입니다.

처음 보면 아주 단순한 속성처럼 보이지만, 실제로는 꽤 자주 쓰입니다. 버튼처럼 굳이 드래그 선택될 필요가 없는 요소에 적용하기도 하고, 복사 경험을 정리하거나, 반대로 본문 텍스트는 선택 가능하게 유지하는 식으로 사용자 경험을 조절할 때도 사용합니다.

이번 글에서는 user-select가 정확히 무엇인지, 왜 사용하는지, 어떤 값들이 있는지, 그리고 실무에서 언제 쓰고 언제 피해야 하는지 정리해보겠습니다.


user-select란?

user-select는 사용자가 텍스트나 요소의 내용을 선택할 수 있는지 여부를 제어하는 CSS 속성입니다.

쉽게 말하면 다음과 같습니다.

  • 사용자가 마우스로 드래그해서 텍스트를 선택할 수 있게 할지
  • 선택되지 않도록 막을지
  • 특정 방식으로만 선택되게 할지

예를 들어 아래 코드는 텍스트 선택을 막는 가장 기본적인 형태입니다.

.button-like {
  user-select: none;
}

이렇게 설정하면 사용자가 해당 요소의 텍스트를 드래그해도 선택되지 않습니다.


왜 필요한가?

기본적으로 웹의 텍스트는 선택할 수 있는 것이 자연스럽습니다. 그런데 모든 요소가 반드시 선택 가능해야 하는 것은 아닙니다.

예를 들어 다음과 같은 경우를 생각해볼 수 있습니다.

  • 버튼을 여러 번 클릭하다가 텍스트가 파랗게 선택되어 보기 불편한 경우
  • 드래그 기반 UI에서 글자가 같이 선택되어 인터랙션이 어색해지는 경우
  • 복사할 필요가 없는 장식용 텍스트에서 불필요한 선택 효과를 막고 싶은 경우

이런 상황에서 user-select를 적절히 사용하면 인터페이스가 더 깔끔하게 느껴질 수 있습니다.

다만 중요한 점이 있습니다. user-select는 보안 기능이 아닙니다. 텍스트 복사를 완전히 막는 기술이라고 생각하면 틀립니다. 단지 브라우저의 일반적인 선택 동작을 제어하는 속성일 뿐입니다.


자주 사용하는 값

1. auto

기본값입니다. 브라우저의 기본 선택 동작을 그대로 따릅니다.

.text {
  user-select: auto;
}

대부분의 본문 텍스트는 별도 설정 없이 사실상 이 상태로 동작합니다.


2. none

사용자가 텍스트를 선택하지 못하게 합니다.

.no-select {
  user-select: none;
}

버튼, 아이콘 라벨, 드래그 핸들 같은 요소에서 자주 사용됩니다.


3. text

선택 가능하도록 명시합니다.

.copy-area {
  user-select: text;
}

상위 요소에서 user-select: none이 적용된 상황에서도, 특정 자식 요소만 다시 선택 가능하게 만들고 싶을 때 쓸 수 있습니다.


4. all

요소의 일부를 선택하려고 해도 전체 내용이 한 번에 선택되도록 유도합니다.

.code-snippet {
  user-select: all;
}

코드 조각, URL, 쿠폰 코드처럼 “부분 복사”보다 “전체 복사”가 더 자연스러운 콘텐츠에서 유용합니다.


실제 사용 예제 1: 버튼 텍스트 선택 방지

가장 흔한 예시는 버튼이나 버튼처럼 동작하는 UI입니다.

HTML

<button class="action-btn">Submit</button>

CSS

.action-btn {
  padding: 12px 20px;
  border: none;
  background: #111;
  color: #fff;
  border-radius: 8px;
  cursor: pointer;
  user-select: none;
}

이 예제는 왜 필요한가?

버튼을 빠르게 여러 번 클릭하거나 드래그하듯 눌렀을 때, 버튼 텍스트가 선택되어 파랗게 표시되는 경우가 있습니다. 기능적으로 큰 문제는 아니지만, 시각적으로 지저분하고 사용감도 좋지 않습니다.

이럴 때 user-select: none을 적용하면 버튼은 더 버튼답게 동작합니다. 즉, 클릭을 위한 요소이지 텍스트 선택을 위한 영역이 아니라는 점을 분명히 해줍니다.


실제 사용 예제 2: 드래그 UI에서 불필요한 텍스트 선택 방지

드래그 가능한 카드나 리스트에서는 user-select가 더 중요해집니다.

HTML

<div class="card">
  <h3>Project Alpha</h3>
  <p>Drag this card to change its order.</p>
</div>

CSS

.card {
  width: 280px;
  padding: 20px;
  border: 1px solid #ddd;
  border-radius: 12px;
  background: #fff;
  cursor: grab;
  user-select: none;
}

카드를 드래그할 때 텍스트가 함께 선택되면 인터랙션이 매우 어색해집니다. 이런 상황에서는 user-select: none이 사실상 UX 정리용 속성처럼 작동합니다.


실제 사용 예제 3: 코드나 링크 전체 선택 유도

이번에는 반대로 선택을 더 편하게 만드는 예시입니다.

HTML

<p class="coupon-code">WELCOME2026</p>

CSS

.coupon-code {
  display: inline-block;
  padding: 10px 14px;
  background: #f4f4f4;
  border-radius: 8px;
  font-family: monospace;
  user-select: all;
}

이 경우 사용자가 코드 일부만 긁으려고 해도 전체 문자열이 한 번에 선택될 수 있습니다. 쿠폰 코드나 초대 코드, 짧은 명령어처럼 통째로 복사하는 게 자연스러운 콘텐츠에 잘 맞습니다.


user-select: all은 언제 유용할까?

이 값은 일반 텍스트 본문에는 거의 맞지 않습니다. 하지만 아래 같은 콘텐츠에는 꽤 실용적입니다.

  • 쿠폰 코드
  • 계좌번호처럼 통째로 복사해야 하는 짧은 문자열
  • API 키 안내용 예시 문자열
  • 설치 명령어
  • 공유 링크

예를 들어 블로그 글에서 설치 명령어를 보여줄 때도 활용할 수 있습니다.

.command {
  user-select: all;
}

다만 긴 텍스트에는 불편할 수 있습니다. 사용자가 일부만 선택하고 싶어도 전체가 선택되기 때문입니다.


실무에서 자주 쓰는 패턴

실무에서는 보통 다음처럼 씁니다.

버튼, 탭, 배지, 아이콘 라벨

.ui-control {
  user-select: none;
}

본문, 입력 예시, 설명 텍스트

.article-text {
  user-select: text;
}

복사용 코드 영역

.copy-target {
  user-select: all;
}

결국 핵심은 간단합니다.
그 요소가 “읽고 복사해야 하는 콘텐츠”인지, 아니면 “조작을 위한 UI”인지를 구분하는 것입니다.


언제 사용하면 좋을까?

user-select는 다음 같은 상황에서 유용합니다.

사용하기 좋은 경우

  • 버튼이나 탭처럼 텍스트 선택이 필요 없는 UI
  • 드래그 앤 드롭 인터페이스
  • 빠르게 클릭하는 상호작용 요소
  • 쿠폰 코드, 짧은 명령어, 링크처럼 한 번에 복사하게 만들고 싶은 콘텐츠

이런 경우에는 사용자가 의도하지 않은 선택을 줄이거나, 반대로 복사를 더 쉽게 만들 수 있습니다.


언제 사용하면 안 될까?

이 속성도 남용하면 좋지 않습니다.

피해야 하는 경우

  • 본문 전체에 무조건 user-select: none을 거는 경우
  • 사용자가 복사할 가능성이 있는 설명 텍스트를 막는 경우
  • 접근성과 사용성을 고려하지 않고 일괄 적용하는 경우

예를 들어 아래 코드는 대체로 좋지 않습니다.

body {
  user-select: none;
}

이렇게 하면 페이지 전체의 텍스트를 사용자가 복사할 수 없게 되고, 일반적인 웹 사용 경험을 해치게 됩니다. 사용자는 문장을 복사하거나 검색하려고 할 수 있고, 중요한 내용을 일부 선택해서 참고하려고 할 수도 있습니다.

즉, 선택 방지는 일부 UI에 제한적으로 적용해야 합니다. 사이트 전체에 거는 방식은 대체로 과합니다.


user-select에 대한 흔한 오해

많은 경우 user-select: none을 “복사 방지” 용도로 이해하는데, 정확히 말하면 그건 과장된 해석입니다.

user-select는 다음 정도만 할 수 있습니다.

  • 마우스 드래그나 일반적인 텍스트 선택 동작을 제한
  • 선택 하이라이트를 줄여서 UI를 정리
  • 복사 UX를 일부 조정

하지만 다음은 할 수 없습니다.

  • 텍스트 보호를 완전히 보장
  • 개발자 도구나 다른 방식의 접근 차단
  • 보안 기능 대체

즉, user-select는 콘텐츠 보호 수단이 아니라 선택 경험을 제어하는 UI 속성입니다.


모바일에서도 생각해야 할 점

모바일 환경에서는 길게 눌러 텍스트를 선택하거나 복사 메뉴를 띄우는 경우가 있습니다. 여기서도 user-select는 어느 정도 영향을 줄 수 있지만, 브라우저별 동작 차이가 있을 수 있습니다.

특히 모바일 사파리나 일부 브라우저에서는 선택 관련 동작이 완전히 동일하지 않을 수 있으므로, 중요한 인터랙션에서는 실제 기기 테스트가 필요합니다.

즉, 데스크톱에서 원하는 대로 보였다고 해서 모바일까지 완전히 같을 거라고 가정하면 안 됩니다.


실무 기준으로 정리하면

실무에서는 아래 기준으로 보면 됩니다.

써도 되는 경우

  • 텍스트 선택이 UX를 방해하는 UI 요소
  • 드래그 인터랙션이 핵심인 컴포넌트
  • 전체 복사가 더 자연스러운 짧은 콘텐츠

피해야 하는 경우

  • 문서 본문, 설명 문단, 사용자에게 읽히고 복사될 수 있는 내용
  • 사이트 전체에 습관적으로 일괄 적용하는 경우
  • 복사 방지를 보안처럼 착각하고 사용하는 경우

결론

user-select는 텍스트 선택 동작을 제어하는 CSS 속성입니다. 성격 자체는 단순하지만, 실제 사용자 경험에 꽤 직접적인 영향을 줍니다.

핵심은 이렇습니다.

  • 조작용 UI에는 user-select: none
  • 일반 텍스트는 기본 선택 유지
  • 짧은 복사용 콘텐츠에는 user-select: all

즉, 선택을 무조건 막는 것이 목적이 아니라, 요소의 성격에 맞게 선택 경험을 조절하는 것이 핵심입니다.

한 줄로 정리하면 이렇습니다.

user-select는 복사 방지용 속성이 아니라, 텍스트 선택 UX를 다듬는 도구입니다.

반응형
🖥️ 클라우드 메뉴판 : 디지털팝