본문 바로가기

2008년 6월 이전의 기록/Development

레일즈 2.0에서 InPlaceEditor 사용시 InvalidAuthenticityToken 예외 발생시

우여곡절 끝에 InPlaceEditor를 플러그인으로 설치하고
script/generate scaffold로 생성한 내용 중 show.html.erb 뷰를 다음과 같이 수정,
<% for column in Contact.content_columns %>
<p>
    <b><%= column.human_name %>:</b> <%#h @contact.send(column.name) %>
    <%=in_place_editor_field :contact, column.name, {}, :rows => 1 %>
</p>
<% end %>


InPlaceEditor가 제대로 작동하는 것을 확인하고 컨트롤러에 다음의 코드를 추가하여 InPlaceEditor로부터의 요청을 처리할 수 있도록 하였다.

  in_place_edit_for :contact, :name
  in_place_edit_for :contact, :email
  ...

테스트 결과 아래와 같이 예외가 발생한다.
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
...
  

또다시 이리저리 문제 해결을 위해 검색의 세계로...

이리저리 찾아 헤메다 한국 루비 사용자 포럼에서 이런 내용을 보았다.

레일스 2.0에는 CSRF (Cross-Site Request Forgery) 공격을 막기 위한 기능이 포함되었습니다. CSRF를 위해 form에 안전한 키를 숨기고 서버사이드에서는 내가 발급한 키가 맞는지 확인해서 값을 비교합니다. 이 때 뭔가 문제가 있으면 InvalidAuthenticityToken 예외가 발생합니다.

출처 : http://forum.rubykr.org/viewtopic.php?p=6509

정확한 내용인지는 확인해 봐야겠고, 이 글에서 제시하는 두 가지 방법은
  • CSRF 기능을 끄는 방법
  • <FORM> 태그 대신 레일스의 폼 헬퍼 메서드 즉 form_tag 등의 기능을 사용하는 방법
이었다.

우선은 CSRF 기능을 꺼 보기로 결정, 컨트롤러에 아래의 코드를 추가했다.

skip_before_filter :verify_authenticity_token

정상 작동함을 확인.

레일즈를 다시 사용하면서 생각하지 못했던 많은 어려움을 겪었지만, 며칠동안 사용하면서 이제 서서히 익숙해져 간다.