
때로는 사이트에서 회원이 로그인하지 않고도 데이터베이스를 업데이트할 수 있도록 하곤 한다. 이것은 보통 링크(ex. 비밀번호 재설정 링크)가 포함된 이메일을 보내는 경우다. 이러한 링크는 해당 사용자를 식별하기 위한 토큰을 사용한다.
이 링크는 사용자를 식별하기 위해 회원의 이메일 주소나 member 테이블의 id 열에 있는 아이디를 사용해서는 안 된다. 회원의 이메일이나 아이디를 사용하는 대신, 사용자를 식별할 수 있는 토큰token이 생성된다. 토큰은 고유하며 쉽게 예측할 수 없는 임의의 문자다.
이 토큰은 다음과 같다.
token이라는 새로운 테이블의 데이터베이스에 저장됨
사용자를 식별하기 위해 사용됨
사용자가 토큰이 포함된 링크를 클릭하면, 사이트는 데이터베이스에 있는 token 테이블에서 토큰이 생성된 회원을 찾는다.
Token이라는 새로운 클래스는 토큰을 생성하고, 데이터베이스에 있는 새로운 token 테이블에 저장하며, 생성된 토큰에 대한 회원의 아이디를 반환하는 Token 객체를 생성하는 데 사용한다.
최소한 새로운 token 테이블은 토큰과 토큰을 생성한 회원의 아이디를 저장해야 한다. 추가적인 보안을 위해 각 토큰은 다음 항목도 저장한다.
만료 시간: 토큰이 사용되도록 의도한 시간 이후에도 유효한 상태로 유지되는 것을 방지한다.
목적: 사이트는 여러 작업에 토큰을 사용할 수 있다. 목적을 저장하면 토큰이 의도한 목적으로 사용되고 있는지 확인할 수 있게 해준다.
토큰을 사용하는 또 다른 상황은 사용자가 사이트에 등록할 때다. 사이트 등록 후, 최초 로그인하기 전에 사용자가 클릭해야 하는 링크를 이메일로 보낼 수 있다. 이것은 사용자의 이메일이 정확하다는 것을 확인해준다.
Token이라는 클래스는 다음의 두 개 메서드를 가진 Token 객체를 생성하는 데 사용한다.
create()는 새로운 토큰을 생성하고 데이터베이스에 저장한다.
getMemberId()는 토큰이 만료되지 않았으며 토큰이 올바른 용도로 사용되고 있는지를 확인한다. 만약에 그러하다면, 토큰을 생성한 회원의 아이디를 반환한다.
토큰은 64개의 임의의 문자로 구성되며, 두 개의 PHP 내장 메서드를 사용하여 생성한다.
random_bytes()는 임의의 바이트 문자열을 생성한다. 이 메서드의 매개변수는 반환할 바이트 수다.
bin2hex()는 이진 데이터를 16진수로 변환한다.
bin2hex(random_bytes(64));
출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022