2026, 새로운 도약을 시작합니다.

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

채택된 답변
+20 포인트

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

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

Copy

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

Copy


// 클라이언트 측의 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는 매번 요청할때마다 업데이트 되는게 디폴트 입니다.

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

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

답변에 대한 댓글 1개

답변은 똑바로해야지. CSRF는 당연히 바꿔줘야 맞단다.

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

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

로그인
🐛 버그신고