PHP로 로그인 검증하다가 소름 돋는 걸 발견했습니다. 값 비교를 == 로 했더니 이상하게 통과가 되길래 테스트해 봤는데요.

var_dump(0 == "abc"); // 옛날 버전에서 true
var_dump("1" == "01"); // true
var_dump("10" == "1e1"); // true


아니 문자열이랑 숫자를 비교하는데 왜 true가 나오는 거죠? 알아보니 == 가 타입을 알아서 맞춰서 형변환한 다음에 비교한다는데, 이러면 인증 로직에서 의도치 않게 뚫릴 수도 있는 거 아닌가요? 실제로 이런 걸로 우회당한 사례도 있다고 하더라고요.


제가 쓰는 환경은 PHP 8.0 이전인데, 8.0부터는 규칙이 좀 바뀌었다는 얘기도 봤습니다. 버전마다 동작이 다르면 더 헷갈리네요.


앞으로는 그냥 === 만 쓰면 안전한 건지, 아니면 다른 주의할 점도 있는지 정리해 주시면 감사하겠습니다.