이 블로그의 글 주소는 /blog/2026-07-23-url-slug 같은 모양이다. 뒤쪽의 url-slug처럼 URL 끝에 붙어 그 페이지가 무엇인지 사람이 읽을 수 있게 해주는 짧은 식별자를 slug이라고 부른다.
이름의 유래
slug은 원래 신문사 은어다. 기사가 완성되기 전, 편집국에서 그 기사를 부르는 짧은 별칭을 slug이라 했다. “어제 그 화재 기사” 대신 apt-fire 같은 한 단어로 가리키는 식이다. 웹이 이 개념을 그대로 가져왔다. 긴 제목을 대신하는, URL 안에서 그 글을 부르는 짧은 이름이다.
왜 slug을 쓰나
주소를 /blog/post?id=8213처럼 숫자 ID로 만들 수도 있다. 그런데도 slug을 쓰는 이유가 있다.
- 읽힌다:
/blog/url-slug는 링크만 봐도 내용이 짐작된다.?id=8213은 열어봐야 안다. - 검색에 유리하다(SEO): 검색 엔진과 사용자 모두 URL 속 단어를 단서로 삼는다. 주제어가 담긴 주소가 클릭을 더 받는다.
- 안정적이다: 좋은 slug은 글의 영구 주소(퍼머링크)가 된다. 제목을
"TCP와 UDP"에서"TCP vs UDP"로 다듬어도 slugtcp-vs-udp만 그대로 두면 기존 링크가 살아 있다. slug을 제목과 분리해 관리하는 이유가 이것이다.
좋은 slug의 규칙
관례는 단순하고, 대부분의 블로그 엔진이 이걸 따른다.
- 소문자: 대소문자를 섞으면
/Slug와/slug가 다른 주소로 취급될 수 있다. 전부 소문자로 통일한다. - kebab-case: 단어 사이는 하이픈(
-)으로 잇는다.url_slug(스네이크)보다url-slug가 URL 관례다. 공백은 절대 쓰지 않는다. - ASCII 영문·숫자만: 공백·특수문자·비영문은 피한다.
- 짧고 핵심만:
the-complete-guide-to-...처럼 길게 늘이지 않는다. 조사·관사는 빼고 주제어만 남긴다.
한글 slug은 왜 URL을 깨뜨리나
URL에는 쓸 수 있는 문자가 정해져 있다. 여기에 없는 문자(한글·공백 등)는 브라우저가 퍼센트 인코딩으로 바꿔버린다. 그래서 slug을 대칭키-비대칭키로 두면 실제 주소는 이렇게 된다.
/blog/%EB%8C%80%EC%B9%AD%ED%82%A4-%EB%B9%84%EB%8C%80%EC%B9%AD%ED%82%A4
한글 한 글자가 %XX 세 덩어리로 부풀어 링크가 지저분해지고, 복사해 붙일 때 깨지기 쉽다. slug을 영문 kebab-case로 강제하는 건 취향이 아니라 URL이 안전하게 실려 다니게 하는 실용적 이유다.
이 블로그가 slug을 다루는 방식
그래서 이 블로그의 발행 도구(publish_post)는 slug을 글쓴이가 영문으로 직접 지정하게 한다. 비워두면 제목에서 자동 생성되는데, 한글 제목이면 위처럼 깨진 slug이 나오기 때문이다.
파일명도 2026-07-23-url-slug.md처럼 날짜-slug 규칙을 따른다. slug이 곧 파일 이름이자 URL이 되는 셈이다. 파일 + git으로 글을 관리하는 구조에서는, slug 하나가 저장 위치와 주소를 동시에 결정하는 안정적인 키 역할을 한다.
정리
- slug은 URL 끝에 붙는, 사람이 읽는 짧은 식별자다. 신문 은어에서 왔다.
- 읽히고, 검색에 유리하고, 제목과 분리해 두면 영구 주소가 된다.
- 규칙: 소문자 · 하이픈 · 영문 · 짧게.
- 한글 slug은 퍼센트 인코딩으로 깨지니, URL에 실릴 slug은 영문 kebab-case로 짓는다.
이 글에 대한 의견은 아래 댓글로 남겨주세요 (GitHub 계정 필요). 로그인 없이 남기고 싶다면