[normaltic 취업반 5기] 2023-11-08 3주차 과제 : 3번 과제

2023. 11. 11. 07:02normaltic 취업반 5기/과제

 

3번 과제

 

목표 기능 : 로그인 페이지 로직 4개 구현

  • 식별/인증 동시
  • 식별/인증 분리
  • 식별/인증 동시 with Hash
  • 식별/인증 분리 with Hash

 

식별/인증 동시 수행

 

로직 테스트에 쓰일 데이터베이스

 

with Hash

로직 테스트에 쓰일 데이터베이스

1. 로그인 성공, 2. 비밀번호가 틀린 경우, 3. 아이디가 틀린 경우

 

  • 식별/인증을 동시에 수행하는 경우 입력된 아이디와 비밀번호가 동시에 일치하는 데이터를 DB에서 조회한다.
  • 조회된 결과가 존재하는 경우 로그인에 성공하고, 존재하지 않는 경우 로그인에 실패한다.

 

식별/인증 분리 수행

 

로직 테스트에 쓰일 데이터베이스

 

with Hash

로직 테스트에 쓰일 데이터베이스

1. 로그인 성공, 2. 비밀번호가 틀린 경우
  • 식별/인증을 분리해서 수행하는 경우 입력된 아이디와 일치하는 데이터를 DB에서 조회한다.
  • 조회된 결과(입력된 아이디가 DB에 존재)가 존재하는 경우 입력된 비밀번호와 조회된 결과에 대응하는 비밀번호의 일치여부를 확인한다.
  • 비밀번호가 일치하면 로그인 성공, 비밀번호가 불일치하면 로그인 실패한다.

 

두 경우의 Hash에 대하여

 

식별/인증 동시 수행과 분리 수행 시 쓰인 해싱 방법이 다르다. 동시 수행에서는 DB 자체에서 지원하는 해시 알고리즘을 사용하였고, 분리 수행에서는 php 언어에 존재하는 비밀번호 해시 알고리즘 함수를 사용하였다.

 

두 경우에 대해 어째서 서로 다른 해시 방법을 사용하였는지 알아보자. 또한 해시 방법에 따른 보안성을 비교해 보자.

 

password_hash([해싱 대상], [해시 알고리즘]) 함수 - php 내장 함수

: php 내장함수 중 하나로 [해싱 대상]을 설정한 [해시 알고리즘]으로 해싱 작업을 진행한다. 이 함수의 특징으로는 [해싱 대상]의 값이 같아도 해당 함수를 호출할 때마다 그 결과값은 다르다는 점이 있다.

 

sha1('[해싱 대상]') - mysql 내장 함수

: mysql 내장함수 중 하나로 [해싱 대상]을 sha-1 해시 알고리즘으로 해싱 작업을 진행한다. 이 함수는 [해싱 대상]이 같으면 함수의 결과는 항상 같은 값을 출력한다.

 

식별/인증 동시 수행 로직에서는 mysql 내장 함수를 사용하였다. 그 이유는 password_hash 함수의 특징 때문이다. 위에서도 설명했듯이 password_hash 함수는 호출할 때 마다 그 결과값이 다르다. 그렇기 때문에 식별/인증 동시 수행 시 입력한 비밀번호와 쿼리문으로 조회한 비밀번호의 일치여부를 확인할 수 없다. 왜냐하면 결과값이 다르기 때문이다.

 

password_hash 함수를 사용한 식별/인증 동시 수행 로직에 대한 작동 순서를 알아보자.

  1. 로그인하기 위해 아이디와 비밀번호를 입력한다.
  2. 입력된 비밀번호를 password_hash 함수로 해싱한다.
  3. 쿼리문에 입력된 아이디와 password_hash 함수로 해싱된 비밀번호가 동시에 일치하는 데이터를 DB에서 조회한다.
  4. 아이디는 일치하지만 비밀번호와 일치하는 값이 존재하지 않아 로그인을 성공할 수 없다.

식별/인증 동시 수행에서 password_hash 함수를 사용할 경우 위 작동 순서에도 볼 수 있듯이 문제가 발생하게 된다. 식별/인증 동시 수행은 입력한 아이디, 비밀번호가 쿼리문을 통해 DB에 저장되어 있는 데이터와의 일치여부를 확인하는 방법이다. 그러나 입력된 비밀번호를 password_hash 함수를 사용하여 해싱 시 그 결과값이 DB에 저장되어있는 값과 항상 다르기 때문에 식별/인증 동시 수행 로직에서는 password_hash 함수를 사용할 수 없다. 그래서 식별/인증 동시 수행 로직에서는 해싱 대상을 해싱 시 항상 같은 결과값이 나오는 다른 해시 함수를 사용해야만 한다.

 

이러한 문제점을 통해 알 수 있는 점으로 보안적으로 좋은 로직은 식별/인증 분리 수행 로직이라고 생각해 볼 수 있는데 이는 단순히 password_hash 함수의 사용여부 때문이라고도 볼 수 있다. 

 

해시 알고리즘은 단방향 함수라 복호화가 힘들다고 알고있다. 그러나 힘들 뿐이지 시간을 들여 공격을 하게 된다면 복호화가 가능하다. 이를 이용한 공격의 예로 레인보우 테이블 공격이 존재한다. 레인보우 테이블 공격이란 해시 함수를 사용하여 만들어낼 수 있는 값들을 저장한 레인보우 테이블을 사용한 브루트 포스 공격이다.

 

이와 같이 해시 알고리즘에 대한 결과값을 알고 있는 상태라면 공격도 불가능하지 않기 때문에 같은 해시 알고리즘을 사용하더라도 항상 그 결과값이 다른 password_hash 함수를 사용한 로직이 보안상 더 안전하다고 볼 수 있다.