코딩/flask

[flask+jinja2] 서버에서 받은 html 요소가 html 문서에서 제대로 표현되게 하려면?

비스카이비전 2022. 2. 6. 10:40

@app.route("/index")
def index():
	data = "<p>안녕하세요.</p><p>반갑습니다.</p>"
	return render_template('index.html', data=data)

 

위와 같이 서버에서 html 요소를 전달한 것을 jinja2를 통해 html 문서에서 표현해야 하는 상황인 경우에는 다음과 같이 safe라는 필터를 걸어줘야 한다.

 

{{data|safe}}

 

안녕하세요.

반갑습니다.

 

safe 필터를 걸어주면 autoescape가 비활성된다. 그렇지 않고 {{data}}로 사용하면 p 태그를 인식하지 못하고 그냥 문자열로 받아들인다. 

 

{{data}}

 

<p>안녕하세요.</p><p>반갑습니다.</p>

 

주의할 것은 safe 필터는 개발자가 신뢰할 수 있는 데이터가 표출되는 곳에 대해서만 사용해야 한다는 점이다. 그렇지 않으면 XSS(cross-site scripting) 공격을 받을 수도 있다. 참고로 XSS란 웹 사이트의 입력 폼에 악성 스크립트를 삽입하여 공격하는 기법이다.

 

참고자료

[1] https://stackoverflow.com/questions/3206344/passing-html-to-template-using-flask-jinja2