로그인 CSRF Token 질문 있습니다.
본문
로그인은 ajax 로 처리를 하고 있습니다.
get_token() 함수에서 토큰 만들고 세션처리하고 있고요
<form>
<input type="hidden" name="_csrf" value="<?php echo get_token(); ?>">
<input type="text" name="id" value="">
<input type="password" name="pw" value="">
<button tpe="button" id="bt">로그인</button>
</form>
<script>
$('#bt').on('click', function() {
$.ajax({
// ...생략
url: 'login_ok.php',
success: function(data) {
// 로그인 실패시 _csrf 갱신 ( data._csrf )
if (data.result != 'success') {
$('[name="_csrf"]').val(data._csrf);
}
}
});
});
</script>
login_ok.php에서
로그인에 실패하면 _csrf 토큰을 다시 만들고 data._csrf 로 돌려주는데요.
이거... 미친짓인가요???
답변 4
login_ok.php 파일에서 로그인을 처리하는 동시에, 로그인 결과와 함께 새로운 _csrf 토큰을 함께 반환되어야 하는 걸로 알고 있습니다.
아래 코드를 참고하셔서 원하시는 로직으로 구현 해 보시는 건 어떨까 합니다.
<?php
// login_ok.php 파일
// 로그인 처리 등의 작업 수행
$result = // ... 로그인 처리 결과를 얻는 로직
// 새로운 _csrf 토큰 생성
$newCsrfToken = get_token();
// 로그인 결과와 함께 새로운 _csrf 토큰을 JSON 형식으로 반환
echo json_encode(array('result' => $result, '_csrf' => $newCsrfToken));
?>
클라이언트 측의 JavaScript에서도 JSON 형식으로 응답 데이터를 처리하도록 합니다.
// 클라이언트 측의 JavaScript
$('#bt').on('click', function() {
$.ajax({
// ...생략
url: 'login_ok.php',
success: function(data) {
// 서버 응답 데이터를 JSON 형식으로 파싱
var response = JSON.parse(data);
// 로그인 실패 시 _csrf 갱신
if (response.result !== 'success') {
$('[name="_csrf"]').val(response._csrf);
}
}
});
});
이렇게 하면 로그인 처리를 한 번의 요청으로 처리하고, 그 결과와 함께 새로운 _csrf 토큰을 JSON 형식으로 클라이언트에게 전달하게 되고, 불필요한 두 번째 요청을 줄일 수 있지 않을까 생각됩니다.
!-->!-->물론 csrf는 매번 요청할때마다 업데이트 되는게 디폴트 입니다.
그러나 상황에 따라 꼭 그렇게 작동해야 하는건 아닙니다.
CSRF는 위, 변조가 가능해서 액션시마다 발행 해야합니다.
답변에 감사드립니다!
제 질문은...
응답값으로 계속해서 새로운 csrf 토큰을 발행해주면
응답된 새로운 토큰 이용하여 다시 요청을 할 경우
csrf 토큰이 의미가 없지 않나 하는 것이었지요.
설명이 부족했네요...