테스트 사이트 - 개발 중인 베타 버전입니다

로그인 CSRF Token 질문 있습니다. 채택완료

Big1 2년 전 조회 2,911

로그인은 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개

채택된 답변
+20 포인트

login_ok.php 파일에서 로그인을 처리하는 동시에, 로그인 결과와 함께 새로운 _csrf 토큰을 함께 반환되어야 하는 걸로 알고 있습니다.

아래 코드를 참고하셔서 원하시는 로직으로 구현 해 보시는 건 어떨까 합니다.

 

</p>

<p><?php

// login_ok.php 파일</p>

<p>// 로그인 처리 등의 작업 수행

$result = // ... 로그인 처리 결과를 얻는 로직</p>

<p>// 새로운 _csrf 토큰 생성

$newCsrfToken = get_token();</p>

<p>// 로그인 결과와 함께 새로운 _csrf 토큰을 JSON 형식으로 반환

echo json_encode(array('result' => $result, '_csrf' => $newCsrfToken));

?>

 

클라이언트 측의 JavaScript에서도 JSON 형식으로 응답 데이터를 처리하도록 합니다.

</p>

<p>// 클라이언트 측의 JavaScript

$('#bt').on('click', function() {

  $.ajax({

    // ...생략

    url: 'login_ok.php',

    success: function(data) {

      // 서버 응답 데이터를 JSON 형식으로 파싱

      var response = JSON.parse(data);</p>

<p>      // 로그인 실패 시 _csrf 갱신

      if (response.result !== 'success') {

        $('[name="_csrf"]').val(response._csrf);

      }

    }

  });

});

 

이렇게 하면 로그인 처리를 한 번의 요청으로 처리하고, 그 결과와 함께 새로운 _csrf 토큰을 JSON 형식으로 클라이언트에게 전달하게 되고, 불필요한 두 번째 요청을 줄일 수 있지 않을까 생각됩니다.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

Big1
2년 전

답변에 감사드립니다!

 

제 질문은...

응답값으로 계속해서 새로운 csrf 토큰을 발행해주면

응답된 새로운 토큰 이용하여 다시 요청을 할 경우 

csrf 토큰이 의미가 없지 않나 하는 것이었지요.

설명이 부족했네요...

 

 

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

W
2년 전

CSRF는 위, 변조가 가능해서 액션시마다 발행 해야합니다.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

s
2년 전

물론 csrf는 매번 요청할때마다 업데이트 되는게 디폴트 입니다.

그러나 상황에 따라 꼭 그렇게 작동해야 하는건 아닙니다.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

글쓴이는조선족
2년 전
답변은 똑바로해야지. CSRF는 당연히 바꿔줘야 맞단다.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인