무기는 끈기

[웹 개발] 대표적인 로그인 로직 4가지 알아보자(식별, 인증, HASH ...) 본문

Dev/Web Dev

[웹 개발] 대표적인 로그인 로직 4가지 알아보자(식별, 인증, HASH ...)

김유비야 2023. 11. 10. 13:35

이번 시간엔 로그인 기능과 관련된 학습을 했다.

로그인에는 다양한 로직이 있다. 만들어낸다면 무궁무진한 로직이 존재하게 될 수도 있을 것이다.

그 중 가장 대표적인 로직 2개, 그리고 그 2개를 HASH 처리한 로직 총 4개를 알아보겠다.

 

1. 식별/인증 동시

해당 로직은 로그인할 때 아이디와 비밀번호를 SELECT 한 줄에 몽땅 때려넣어서 동시에 처리하는 방식이다.

// sudo
$sql = "select * from member where id='$user_id' and pass='$user_pass'"
$ret = $sql.execute()
if($ret){ 
  // 로그인 성공
}else{ 
  // 로그인 실패
}

 

2. 식별/인증 분리

해당 로직은 식별 과정과 인증 과정을 분리해서 처리하는 방식이다.

<식별>
// sudo
$sql = "select pass from member where id='$user_id'"

<인증>
$db_pass = $sql.execute()
if($db_pass == $user_pass){
  // 로그인 성공
}else{ 
  // 로그인 실패
}

 

 

 

* HASH 함수

#일방향_함수 #복구_불가능 #데이터_검증용

암호화, 인코딩 등 인증 정보를 지킬 수 있는 여러 방식이 존재한다.
그러나 암호화는 복호화가 가능한 양방향이고, 인코딩 역시 디코딩이 가능한 양방향 솔루션(?)이다.

HASH 함수도 암호화와 비슷하지만 명확하게 다른 점은 일방향 함수라는 점이다.

일방향을 쉽게 설명하자면 다시 되돌릴 수 없다는 것이다.

DB가 털렸을 경우 그걸 해석해낼 수 있는 방법이 없어 데이터를 지킬 수 있다는 것이다.
해당 DB에 들어오는 모든 정보는 같은 방식으로 HASH 처리가 된다.

그래서 로그인 인지에는 지장이 없으면서 데이터를 보호할 수 있는 것이다.

// sudo
$sql = "select * from member where id='$user_id' and pass=md5('$user_pass')"
$ret = $sql.execute()
if($ret){ 
  // 로그인 성공
}else{ 
  // 로그인 실패
}

 

 

HASH 처리가 되는 과정을 예시로 살펴보자.

1. 사용자가 로그인 폼에 데이터 입력

사용자명: yubi
비밀번호: mysecurepassword

 

2. 서버에서 비밀번호 해시 처리

해시 함수 + 솔트 → SHA256("mysecurepassword" + "randomsalt123") → 해시 결과

 

3. 데이터베이스에서 비밀번호 비교

저장된 해시값: e3b0c44298fc1c149afbf4c8996fb...
받은 데이터의 해시값: e3b0c44298fc1c149afbf4c8996fb...

 

4. 인증 토큰 생성 및 클라이언트에 전송

JWT 토큰 발급: Header.Payload.Signature

 

5. 로그인 인증 상태 유지

요청마다 HTTP 헤더에 JWT 포함하여 전송

 

이런 방식으로 데이터가 보관되기 때문에 DB가 털린다 하더라도 최소 1번은 보호가 가능하다.

4, 5번의 토큰, 로그인 인증 상태 유지 부분은 다음글에서 더 자세히 알아보도록 하자.