드루팔 컨텐츠를 자동 생성할 때, 입력 필터(Filters)의 기본값

제목 : 드루팔 컨텐츠를 자동 생성할 때, 입력 필터(Filters)의 기본값은 무엇이 좋을까.

[현상]

특정 모듈을 이용한 컨텐츠의 자동 노드화를 시도하는 경우(예: FeedAPI 모듈을 이용해서 피이드 아이템들을 노드화할 때)의 단점은, 기본적인 입력 필터 형식이 Filtered HTML로, 혹은 기본 설정돼 있는 필터 형식으로 저장돼서 통제가 안된다는 것이다.(예:원격으로 불러오는 RSS 피이드 데이터가 엉망으로 보인다)

이를 해결하려고 Default Filter, Filter Default, Filter by Nodetype 등의 모듈이나 여러 PHP Snippets를 사용해 보았지만 모두 허사였다. 어떻게 하면 자동으로 생성하는 드루팔 컨텐츠들의 기본 입력 필터를 통제할 수 있을까 조사를 해 보았다.

[원인]

놀랍게도 Drupal 설계의 유일한 단점?일 것 같은데,
컨텐츠를 새로 생성할 때 기본적인 입력 필터 형식을 아예 설정하지 않는다! 라는 점이 근본적인 문제 이유다.

설마?! 하지만 실제로 그렇다.
드루팔 DB를 열어서 새로 생성된 컨텐츠가 들어갈 만 테이블(node table)을 조사해 보면 입력 필터에 관한 설정값은 없다.

필터 설정 관련해서는 filter_formats 테이블에 정의가 돼 있는데, 왜 기본적인 필터는 각 노드마다 정의가 없을까? 그 이유는 아직 모른다. 뭔가 설계자들의 의도가 있을지도, 어쩌면 실수일지도.

한참 조사한 바로는, 컨텐츠의 갱신이력을 담당하는 node_revisions 테이블에 format 이라는 필드값에 해당 컨텐츠 노드의 입력 필터(실제로 열람할 때에도 영향을 미침)값이 정의가 돼 있다.

즉, 드루팔 4 또는 5는 (6 이상은 아직 조사 중) 컨텐츠를 생성할 당시에는 기본적인 입력 필터가 아예 없다는 것! 하지만 컨텐츠를 한번 수정하거나 필터 갱신하게 되면 그때부터는 입력 필터(Input Filter)가 바뀐다는 점이다.

예를 들어 자동적으로 특정 노드를 생성하는 모듈들은, 첫 생성이므로 무조건 기본적으로 세팅돼 있는 입력 필터로 컨텐츠가 보이게 되는 것이다. 예를 들어 FeedAPI로 생성하는 자동 피이드 아이템들은 드루팔의 기본적인 입력 필터 세팅에 따라 Filtered HTML로도 혹은 Full HTML로도 혹은 특정 입력 필터가 반영된 상태로 보이게 된다는 것이다. 통제 불능인 셈이다.

[해결책]

이것을 해결하는데 엄청난 에너지를 쏟았다.
온갖 꽁수와 모듈들이 테스트 대상에 올랐는데...
최종 해결책은 SafeHTML과 같은 특정 입력 필터 모듈이다.
얼핏 보면 이 문제와 정말 관계없이 보이는 특정한 입력 필터 모듈이 어떤 역할을 하는지 기록해 둔다.

우선 아래 주소에서 Safe HTML 모듈을 다운로드 한다.
http://drupal.org/project/safehtml

이 모듈을 설치/활성화하고, 드루팔의 admin/settings/filters 메뉴로 가 보라.
그 곳에 있는 "입력 형식 추가" 링크를 누르고,
"안전한 입력 포맷"이라는 이름을 넣고,
Safe HTML과 URL 필터, 줄바꿈 변환기를 체크한다.
이때 주의!할 점은 HTML 필터는 체크하지 않는다는 점이다.
Safe HTML과 HTML 필터는 동시에 양립하지 않는 것이 좋다고 모듈 설명서에 나와 있다.

그런 다음 위 "입력 형식 추가"의 설정을 저장하고 나면,
admin/settings/filters 에는 "안전한 입력 포맷"이라는 항목이 추가돼 있을 것이다.
이를 기본형식으로 지정하라.

그러면 안전한 입력 포맷 옆에 "기본 형식은 모든 역할주체가 사용할 수 있습니다"라는 안내말이 나타날 것이다. 이 의미는 이 필터를 이용가능한 사용자 그룹을 지칭하는 것도 있지만, 더 엄밀한 의미는 바로 "이제부터 생성하는 모든 드루팔 노드는 유저에 관계없이 이 입력 필터의 영향을 받은 채로 열람될 것이다"라는 것이 정확할 것이다.

이렇게 설정한 후에는 FeedAPI 등의 모듈로 자동 생성되는 컨텐츠들(외부의 피이드 아이템들)도 무조건 Safe HTML 입력 필터의 영향하에 놓이게 된다. 이렇게 보면 심플했다.

그렇다면 외부의 피이드 아이템들을 자동으로 불러서 노드화하는 경우라면 Full HTML 입력 필터가 더 낫지 않을까 얼핏 생각할 수도 있다. 하지만 이 경우 심각한 문제가 남게 된다. 우선 외부의 피이드 아이템들 내의 태그 품질을 검증하지 못한다는 문제가 하나이고, 또 다른 큰 문제는 그 다음부터 자동이건 수동이건 해당 드루팔의 컨텐츠 생성시 기본 입력 필터는 무조건 Full HTML이 된다는 것이다.

결론 : 드루팔의 기본 입력 필터 설정은 결코 쉬운 문제가 아니며, 특히 자동으로 생성되는 노드들은 입력 필터가 통제 안된다는 것을 알아야 하겠다.
또한 굳이 Safe HTML일 필요는 없지만, 기본적인 입력 필터를 보다 안전하고 유연한 것으로 선택해서, 자동 생성되는 드루팔 컨텐츠들의 기본 입력 필터로 Full HTML이나 Filted HTML이 설정되지 않도록 하는 것이 더 편하다는 것을 알리고 싶었다.

- EOM

Your rating: None 평균 : 5 (1 vote)

댓글

참고로 Drupal 7.x 대는

참고로 Drupal 7.x 대는 이러한 기본 입력 필터 설정을, 노드 타입별로 혹은 유저그룹별로 자유자재 설정이 가능토록 설계 중이다.
http://drupal.org/node/11218
http://www.asitis.org/tmp/input_formats-per-role.png

또한 기본 입력 Filter와 관련된 아래의 "이 글과 관련이 있나요..." 항목의 기사들도 참고하기 바란다.

safehtml 모듈이 2008년

safehtml 모듈이 2008년 12월 기준 아직 5.x 버전대 뿐이므로,
6.x 드루팔에서는 그 대신 htmLawed 모듈을 추천한다.

htmLawed (X)HTML filter/purifier 모듈
http://drupal.org/project/htmLawed