본문 바로가기
Develop/PHP

코드이그나이터 formdata csrf토큰 사용 Ajax통신, The action you have requested is not allowed.

by bellsilver7 2020. 2. 27.
728x90

안녕하세요. 은은한 개발자입니다.
 
코드이그나이터(Codeigniter) 에서 보안을 위해 CSRF 토큰을 사용하다가 아래와 같은 에러를 경험하셨다면 잘 들어오셨습니다.
 

Codeigniter csrf error

1.Forbidden
2.error
3.Forbidden
4.403
 

An Error Was Encountered
The action you have requested is not allowed.

위와 같은 상황은 form 전송시 'post'를 사용할 경우에 해당합니다.
 
 

1. FORM 전송시

<input type="hidden" id="csrf_token" name="<?= $this->security->get_csrf_token_name() ?>" value="<?= $this->security->get_csrf_hash() ?>">

위 코드를 <form></form> 태그 안에 넣으면 끝!
 
 

2. AJAX 전송시

- HTML

<meta name="_csrf" content="<?= $this->security->get_csrf_hash() ?>">
<meta name="_csrf_header" content="<?= $this->security->get_csrf_token_name() ?>">

- Javascript

var header = $("meta[name='_csrf_header']").attr("content");
var token = $("meta[name='_csrf']").attr("content");
var formData[header] = token;

$.ajax({
	url: '',
	type: "POST",
 	data: formData,
 	dataType: "json",
 	success: function (res) {
    	...
	},
 	error: function (xhr, status, errorThrown) {
 		console.log("1." + errorThrown + "\n2." + status + "\n3." + xhr.statusText + '\n4.' + xhr.status);
 	}
});

먼저 <head></head> 태그 사이에 meta 태그로 추가했습니다.
 
그리고 javascript에서 추가한 meta 태그의 content 속성값을 불러와 formData를 만들어 Ajax로 데이터를 전송하는 방법을 사용했습니다.
 
더 좋은 방법 있으시면 공유 부탁드립니다.
 

728x90

댓글