자소(字素, grapheme)는 어떤 언어의 문자 체계에서 의미상 구별할 수 있는 가장 작은 단위를 가리킨다. '낱글자', '서기소(書記素)', '문자소'라고도 부른다.
자소는 음운론에서의 음소(phoneme) 개념에 대응하는 문자론적 개념이다. 음소가 말소리의 최소 변별 단위라면, 자소는 문자의 최소 변별 단위이다. 예를 들어 영어에서 문자 ⟨p⟩, ⟨P⟩, ⟨p.⟩, ⟨p!⟩ 등은 형태는 다르지만 모두 동일한 자소 /p/의 변이 형태(allograph)로 간주된다. 반면 ⟨p⟩와 ⟨b⟩는 서로 다른 자소로, 이 차이가 의미 변별 기능을 수행한다.
자소는 문자 체계의 유형에 따라 그 성격이 달라진다. 음소문자(알파벳) 체계에서는 개별 알파벳 문자가 자소에 해당하며, 음절문자에서는 하나의 음절을 나타내는 문자가 자소가 된다. 표의문자 체계에서는 하나의 형태소나 단어를 나타내는 문자가 자소로 기능한다.
한글의 경우, 초성·중성·종성의 자모(jamo) 각각이 자소에 해당한다. 예를 들어 '한'이라는 글자는 'ㅎ', 'ㅏ', 'ㄴ'이라는 세 개의 자소로 구성된다. 다만 한글은 자질문자(featural writing system)로서 각 자소가 다시 음성적 자질을 나타내는 하위 요소로 분석될 수 있다는 특징이 있다.
자소의 개념은 문자론(graphemics)과 철자법(orthography) 연구에서 핵심적인 역할을 하며, 컴퓨터에서의 문자 처리 및 유니코드(Unicode) 체계 설계의 이론적 기초가 되기도 한다.