인프런 커뮤니티 질문&답변

Myeong Seong Jeong님의 프로필 이미지

작성한 질문수

PHP 7+ 프로그래밍

input 값을 넣으면 CSRF_TOKEN 값이 달라지는 이유가 뭔가요?

작성

·

354

0

몇가지 궁금한 점 이 있습니다.

1. 회원가입 폼에서 input에 값을 넣고 submit을 하면

$token 값과 $_SESSION["CSRF_TOKEN"]값이 달라지는 이유가 뭔가요?

참고로 input에 값을 넣지 않으면 $token 과 $_SESSION["CSRF_TOKEN"]값이 같아집니다.

2. $_SESSION["CSRF_TOKEN"] 에 랜던한 32비트 값을 2진수에서 16진수로 바꿔준 값이 저장하고

그리고 $_SESSION["CSRF_TOKEN"]값을 "token"이라는 이름에 저장하는건가요?

3. output_add_rewrite_var()라는 함수는

www.aaaaa.com/aaaa.php?token=8cb6c897035b3a0e98f221f6a34d41f50a0d322172965c001d4d0526d88b9344

요렇게 해주는 역할을 하는건가요?

답변 3

0

정상우님의 프로필 이미지
정상우
지식공유자

1. 위에서 말씀드렸다시피 폼의 필드는 프론트엔드 상에서 표시되시므로 개발자도구를 사용하면 위조가 가능하다고 하였습니다. 악의적인 목적으로 토큰을 위조했고, 이 상태로 전송한다면 실패할 것입니다.

아래의 경우는 어떠한 것을 말하는 것인지 모르겠습니다. 세션에 담긴 토큰 값이 어떠한 이유에 의해 변화하거나 토큰 값이 위조(사용자에 의해, 또는 개발자에 의해)되지 않는 한 토큰이 서로 다를 수 없습니다.

2. 이 사항은 문서를 보는게 더 빠르겠습니다.
https://www.php.net/manual/en/function.filter-input.php#115086

0

답변감사합니다. 아직 이해가 가질 않습니다.
> register.php
$_SESSION["CSRF_TOKEN"] = bin2hex(random_bytes(32));
output_add_rewrite_var("token"$_SESSION["CSRF_TOKEN"]);
> register_process.php
$token = filter_input(INPUT_POST, "token");
hash_equals($token$_SESSION["CSRF_TOKEN"]) 여기서 return값이 false가 나올수가 있나요?
나온다면 어떠한 경우에 나오나요?
그리고
register.php 에서 회원정보를 입력한 후 register_process.php에서 로그를 찍어보면 토큰값이 서로 다르고
회원정보를 입력하지 않고 register_process.php에서 로그를 찍어보면 토큰값이 서로 같다고 나오는데
이유가 뭔지 아무리 찾아봐도 답을 모르겠습니다.
마지막으로
$userId = filter_input(INPUT_POST, "userID");
$userId = $_POST["userid"];
두개 다른점이 먼가요? 스택오버플로우를 찾아봐도 명확한 답이 안나오네요.
두서없이 질문해서 죄송해요

0

정상우님의 프로필 이미지
정상우
지식공유자

CSRF 의 과정을 말씀하시는 것인가 봅니다. 스탭을 생각해보도록 할게요.

1. token 이라는 키를 가진 세션에 랜덤으로 생성한 32바이트 값을 넣습니다. (토큰 값은 검증이외에는 사용하지 않으므로)

2. output_add_rewirte_var() 함수는 폼에 필드를 추가해주죠. 폼 필드의 namecsrf_token 이며 값은 이미 생성한 값 $_SESSION['token'] 을 넣습니다. 새로고침 할 때마다 토큰을 재생성하므로 토큰 값이 바뀜.

3. 처리 프로세스에서는 폼에 넣은 토큰으로 넘어온 값(폼 필드는 위조가 가능하므로)과 $_SESSION['token'] 값을 비교하여 검증합니다.

질문의 대답이 되었으리라 생각해봅니다.