본문 바로가기

Python

파이썬 f-string의 진화? 더 안전하고 유연한 t-string의 등장 (PEP 750 소개)

728x90
반응형

 

파이썬 개발자라면 누구나 f-string을 한 번쯤 써봤을 겁니다. 깔끔하고 직관적인 문법 덕분에 문자열 포매팅이 정말 쉬워졌죠. 그런데, 편리함 뒤에 숨어 있는 보안 문제는 생각보다 심각합니다. 사용자 입력이 그대로 삽입되는 경우 SQL Injection이나 XSS 공격에 쉽게 노출될 수 있거든요.

그래서 등장한 것이 바로 PEP 750, 그리고 새로운 문자열 리터럴인 **템플릿 문자열(t-string)**입니다. 이 블로그에서는 t-string이 정확히 무엇인지, 기존 f-string과 어떤 점이 다른지, 그리고 왜 이 기능이 필요했는지 쉽게 풀어 설명합니다. 실전 예제도 함께 보면서, 어떻게 더 안전하고 유연한 문자열 처리가 가능한지 확인해보세요.

반응형

🧩 템플릿 문자열(t-string)이란?

🔁 f-string의 문제점

f"Hello, {name}"처럼 간단하게 문자열에 값을 삽입할 수 있는 f-string은 매우 강력합니다. 하지만 보안 처리는 따로 해줘야 하죠. 예를 들어 사용자의 입력을 HTML에 넣는 경우, 적절한 escape 처리를 하지 않으면 XSS 공격에 쉽게 노출될 수 있습니다.

evil = "<script>alert('evil')</script>"
html = f"<p>{evil}</p>"  # 보안상 매우 위험

🧱 그래서 나온 것이 PEP 750의 t-string

PEP 750은 문자열과 값을 결합하기 전에 삽입 값을 사전 처리할 수 있는 Template 타입을 도입합니다. 문자열은 t"" 또는 T"" 형식으로 작성하며, f-string처럼 중괄호를 통해 값을 삽입할 수 있습니다.

template = t"<p>{evil}</p>"  # 삽입 전 가공 가능
assert html(template) == "<p>&lt;script&gt;alert('evil')&lt;/script&gt;</p>"

⚙️ 어떻게 동작하나요?

🧬 Template 객체 구조

t-string은 string.templatelib.Template 타입으로 평가됩니다. 이 객체는 문자열 조각과 삽입 값을 별도로 분리해서 관리할 수 있습니다.

  • strings: 문자열 조각 튜플
  • interpolations: 삽입값 객체들의 튜플
  • values: 실제 삽입값들
  • __iter__(): 문자열과 삽입값을 순차적으로 반환

🧩 Interpolation 객체 구조

각 삽입 표현식은 Interpolation 객체로 표현됩니다.

  • value: 평가된 값
  • expression: 표현식 문자열
  • conversion: 변환 방식 (r, s, a, 또는 None)
  • format_spec: 포맷 명세

예시:

name = "World"
template = t"Hello {name!r}"
assert template.interpolations[0].conversion == "r"

🔍 디버깅 지원 기능

t"{value=}" 형태는 자동으로 value={value!r}로 변환됩니다. 변수의 이름과 값을 함께 출력할 수 있어 디버깅에 매우 유용합니다.


🧪 사용 예시: 실전에서 이렇게 써요

1. HTML Escape 자동 처리

evil = "<script>alert('evil')</script>"
template = t"<p>{evil}</p>"
assert html(template) == "<p>&lt;script&gt;alert('evil')&lt;/script&gt;</p>"

2. 문자열 가공 처리

def lower_upper(template):
    parts = []
    for s in template:
        if isinstance(s, str):
            parts.append(s.lower())
        else:
            parts.append(str(s.value).upper())
    return "".join(parts)

name = "Python"
template = t"Welcome, {name}!"
print(lower_upper(template))  # welcome, PYTHON!

3. 구조화된 로깅

템플릿 문자열을 사용하면 로그 메시지구조화된 데이터를 동시에 처리할 수 있습니다. StructuredMessage나 logging.Formatter에 응용할 수 있습니다.


🔍 기존 방식과 무엇이 다를까요?

항목 f-string t-string
삽입값 처리 즉시 평가 사전 가공 가능
보안 처리 수동 처리 필요 자동 escape 등 가능
객체 구조 단일 문자열 Template 객체
중첩 지원 제한적 중첩 템플릿 지원
용도 일반 문자열 출력 DSL, HTML, SQL 등 다양한 도메인 템플릿

✅ t-string의 강점 한눈에 보기

  • 🔐 보안 강화: 삽입값 사전 처리로 XSS, SQL Injection 예방
  • 🧠 표현력 향상: 중첩, 디버깅, 연결 등 다양한 기능 지원
  • 🛠️ 개발자 친화적: 기존 f-string 문법을 그대로 사용 가능
  • 💬 템플릿 엔진 없이도 강력한 표현 가능: 개발자 손에서 직접 제어 가능

728x90

앞으로 무엇이 달라질까요?

Python은 점점 더 보안 중심적이고 표현력 있는 언어로 진화하고 있습니다. t-string은 단순한 문자열 포매팅 기능이 아니라, 개발자가 템플릿 처리의 주도권을 다시 갖게 해주는 기능입니다.

이제 문자열에 사용자 입력을 삽입할 때마다 “이거 안전한가?” 걱정하지 않아도 됩니다. 그리고 별도의 템플릿 엔진 없이도 복잡한 템플릿을 구성할 수 있죠.

앞으로 HTML, SQL, 로그 처리 등에서 t-string이 중요한 역할을 하게 될 것입니다. 보안이 필요한 작업이나 DSL을 직접 다뤄야 하는 상황이라면, PEP 750이 제안하는 새로운 접근을 적극 고려해보세요.


✨ f-string을 넘어선, 진짜 개발자를 위한 템플릿. 이제는 t-string으로 안전하고 유연하게 문자열을 다뤄보세요.

https://peps.python.org/pep-0750/

 

PEP 750 – Template Strings | peps.python.org

This PEP introduces template strings for custom string processing.

peps.python.org

728x90
반응형