멤버십(1)

minah moon·2023년 9월 22일

PHP

목록 보기
56/58
post-thumbnail

사용자 등록하기

register.php 페이지는 방문자가 사이트의 회원으로 등록할 수 있도록 폼을 사용한다.

폼이 제출되면, 데이터의 유효성 검사가 진행되고 create()라는 Member 클래스의 새로운 메서드가 member 테이블에 데이터를 추가한다.

등록에는 두 가지 새로운 개념이 도입된다.

  • 역할: 사이트의 사용자가 수행할 권한이 있는 작업을 제어한다.

  • 비밀번호 해시: 사이트에 회원 등록할 때, 회원이 입력한 실제 비밀번호 대신 사이트가 저장하는 값이다.


비밀번호 해시

보안상의 이유로 웹사이트는 회원의 비밀번호를 저장하면 안 된다. 대신 해시라는 암호화된 비밀번호를 저장한다. 해시를 원본 텍스트로 해독하는 것은 불가능하다.

회원이 가입할 때, 알고리즘이 비밀번호를 임의의 영숫자로 된 문자의 집합처럼 보이도록 해시로 암호화한다. 데이터베이스는 비밀번호가 아닌 해시를 저장한다. 누군가 데이터베이스에 접근했다고 하더라도 회원의 비밀번호를 알 수 없다.

비밀번호의 문자 수와는 관계없이 해시는 동일한 문자 수가 될 것이므로, 해시는 원래 비밀번호의 길이에 대한 힌트를 제공하지 않는다.

PHP에는 해시를 생성하기 위한 내장 함수가 있다. 이 함수를 사용하여 비밀번호를 해시로 변환할 때마다, 동일한 문자 세트가 생성된다.

등록된 회원이 사이트에 로그인하면 입력한 비밀번호가 다시 해싱 알고리즘을 통해 실행된다. 만약에 처리된 값이 데이터베이스에 저장된 해시와 일치한다면, 사용자는 올바른 비밀번호를 입력한 것이다.

해시를 더욱 안전하게 만들기 위해 PHP는 솔트salt라는 임의의 문자 집합을 비밀번호에 추가한다. 사용자가 다시 로그인을 하면, PHP는 다음 작업을 한다.

  • 사용자의 저장된 해시에서 솔트를 감지한다.

  • 로그인에 사용한 비밀번호의 해시를 생성한다.

  • 새로운 비밀번호 해시에 솔트를 추가한다.

  • 저장된 값을 새로운 값과 비교한다.

만약에 모두 일치하면 사용자는 올바른 비밀번호를 입력한 것이다.


해시된 비밀번호 생성하고 확인하기

password_hash()

PHP의 내장 함수인 password_hash()는 비밀번호를 받아서 해시를 반환한다. 이 함수는 세 가지 매개변수를 갖는다.

  • 해시가 될 비밀번호

  • 사용할 해싱 알고리즘의 이름

  • 선택사항으로, 해당 알고리즘에 대한 설정 배열

password_hash($password, $algorithm[, $options]);

password_verify()

PHP의 내장 함수인 password_verify()는 사용자가 입력한 비밀번호를 받아서 해시를 생성한다. 그런 다음 그 값과 이미 저장된 해시를 비교한다. 만약에 두 값이 일치하면, 사용자는 올바른 비밀번호를 입력한 것이다. password_verify() 함수는 두 개의 매개변수를 갖는다.

  • 회원이 방금 제공한 비밀번호
  • 해당 회원에 대해 이미 저장된 해시

이 함수에는 해시가 생성될 때 사용된 알고리즘이나 솔트를 지정할 필요가 없다. password_verify() 함수는 저장된 해시로부터 이러한 설정을 감지할 수 있기 때문이다.

이 함수는 다음을 반환한다.

  • 해시가 일치하면 true

  • 값이 서로 다르면 false

password_verify($password, $hash);

로그인과 개인화

회원이 사이트로 돌아와서 로그인을 할 때, 자신을 식별하기 위한 이메일 주소와 본인임을 인증하기 위한 비밀번호를 요구한다.

login.php 페이지는 회원이 로그인할 수 있게 한다. 로그인 폼이 제출되면, login()이라는 Member 클래스의 새로운 메서드는 데이터베이스의 member 테이블에서 회원의 이메일 주소를 찾아 비밀번호에 대한 해시를 포함하여 여러 세부 정보를 얻는다.

만약에 로그인할 때 사용자가 제공한 비밀번호가 데이터베이스에 저장된 것과 동일한 해시를 생성한다면, 사이트는 이 사용자가 회원이며 로그인한 것으로 간주한다.

회원이 로그인하면 사이트는 두 가지 주요 작업을 할 것이다.

  • 현재 방문 중에 회원을 기억할 세션을 생성한다. 세션은 회원에 대한 주요 데이터와 로그인했다는 사실을 저장한다.

  • 해당 회원에 대한 특정 정보로 페이지를 개인화한다.


세션

회원이 로그인하면 세션이 생성된다. 세션은 해당 회원이 사이트를 방문하는 동안 다른 페이지를 요청할 때마다 사이트가 해당 회원을 식별할 수 있게 한다. 세션은 회원의 아이디, 이름, 그리고 역할을 저장한다. 왜냐하면 이는 내비게이션 바에서 다음과 같은 용도로 사용되기 때문이다.

  • 프로필 페이지에 대한 링크 추가(링크는 쿼리 문자열에 회원 아이디를 사용한다)

  • 링크에 대한 링크 텍스트로 회원 이름을 표시

  • 만약에 역할이 admin이면 어드민 페이지에 대한 링크 추가

내비게이션 바를 생성하기 위해 각 페이지는 세션과 함께 동작하므로, $_SESSION 슈퍼글로벌의 데이터를 가지고 하는 작업을 위해 새로운 Session 클래스가 생성된다.

  • 사용자가 로그인하면, 사용자의 세션 데이터는 Session 객체의 속성에 추가된다.

  • 로그인하지 않았다면, 이 속성의 값은 자동으로 디폴트값이 주어진다.

Session 클래스에는 세션을 생성, 업데이트, 그리고 삭제하는 메서드도 있다. 이 클래스는 세션과의 작업에 사용되는 코드를 그룹화하여 각 페이지에 필요한 코드의 양을 줄인다.






출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022

0개의 댓글