본문 바로가기

웹 개발

웹 개발 일기장 3 - 2 (해시함수)

저번 시간에 로그인 로직을 몇 개 살펴보았는데 로그인을 구현할 때 해시함수를 사용하여 로그인을 수행할 수 있습니다.

 

일단, 해시함수가 무엇인지 먼저 알아보겠습니다.

 

해시함수란? 

임의의 길이를 가진 데이터를 입력받아 고정된 길이의 값, 즉 해시값을 출력하는 일방향 함수입니다.

 

임의의 길이를 가진 데이터를 입력받아 고정된 길이의 값을 출력한다는 것이 무슨 뜻일까요??

 

예시를 보면 a라는 데이터를 이상한 문자열로 만들어진 것이 보이시나요?

a 해시값

 

 다른 문자도 한번 해보겠습니다.

안녕 해시값

이렇게 a나 안녕이라는 임의의 문자를 넣었을 때 고정된 32자로 나타내는 것입니다. 32자 16진수 표현법이므로 각 자리마다 4비트씩하여 md5 해시함수는 총 128비트로 표현하는 것입니다.

 

해시함수가 임의의 데이터를 고정된 길이의 값으로 표현하는 것은 알겠는 데 다음 일방향 함수라는 것은 무슨 뜻일까요?

이것은 위의 예시로 a를 '0cc175b9c0f1b6a831c399e269772661'로 변환시킬 수는 있지만, 반대로 '0cc175b9c0f1b6a831c399e269772661'를 a로 되돌릴 수는 없다는 뜻입니다. 

 

보통 암호화나 디코딩은 평문을 다른 문자열로 변경시킨 후 결과 문자열을 통해 다시 원래대로 복호화 할 수 있지만, 해시함수는 그것이 안된다는거죠!!

 

해시함수가 무엇인지는 이제 알겠는데 어떻게 로그인에 적용시킬 수 있는지 보겠습니다.

바로!! 다른 사람에게 알려지면 안되는 비밀번호를 해시함수를 통해 해시값을 구한 후 이것을 데이터베이스에 저장해놓습니다.

그러면 해시함수의 일방향성 때문에 만약 데이터베이스를 다른 사람이 볼 수 있다고 해도 비밀번호가 해시화되어 원래값을 알지 못 할 것입니다.

 

하지만 로그인 로직을 만들 때 우리는 입력 받은 비밀번호를 해시화 한 후 해시값으로 데이터베이스에서 비밀번호를 검색하면 로그인 성공 여부를 판단할 수 있습니다.

 

php에서 해시함수는 hash(사용할 해시 알고리즘, 해시할 값) 으로 사용할 수 있습니다. 

해시 알고리즘은 엄청 많은데 그 중 저는 sha-256을 사용하였습니다.

해시함수를 실행하여 비밀번호 저장

 

해시값 비밀번호 저장한 데이터베이스 확인

 

바로 한번 해시함수를 사용하여 로그인 로직을 만들어 보겠습니다.

 

1. 해시함수를 사용하여 식별과 인증 동시에 수행하는 로그인 로직

식별/ 인증 동시 with HASH

 

식별과 인증을 동시에 하지만 저번과 다른점은 비밀번호를 해시화하여 저장한다는 것입니다.

로그인 성공(아이디: test, 비밀번호: test 입력)
로그인 실패(아이디: test, 비밀번호: test 해시값 입력)

 

비밀번호를 데이터베이스에 저장되어있는 값으로 입력해도 해시값을 다시 해시한 값과 비교하기 때문에 실패하는 것 확인 가능

 

2. 해시함수를 사용하여 식별과 인증을 분리해서 수행하는 로그인 로직

식별/ 인증 분리 with HASH

 

식별과 인증을 불리해서 실행하지만 저번과 다른점은 비밀번호를 해시화하여 저장한다는 것입니다.

로그인 성공(아이디: test, 비밀번호: test 해시값 입력)
로그인 실패(아이디: test, 비밀번호: test 해시값 입력)

 

이렇게 해시를 간단하게 알아보았고, 저번 시간과 합쳐 4가지의 로그인 로직을 만들어 보았습니다. 

 

이것으로 로그인이 어떻게 구현되는 지 이해할 수 있다면 좋을 것 같습니다.

3-3에는 이제 이 로그인한 것을 어떻게 유지할  것인지 알아보겠습니다.