Dev/SW Engineering

35. Authentication - Authentication & Authorization

HJChung 2020. 9. 6. 12:58

Client의 요청의 단점은 하나의 Server가 여러 Client를 구분할 줄 모른다는 것이다. (IP 주소와 브라우저 정보는 알 수 있을것이다. 그래도 '누가'에 대한 정보는 더 까다로운데, 여러 컴퓨터가 공통 IP 주소를 가지거나 한 컴퓨터를 여러 사람이 사용할 수도 있기 때문이다. )

이렇게 (로그인을 통해) user를 판별하는데 필요한 것이 Session, Cookie라고 할 수 있다. 

이번  sprint에서는 인증에 대해 알아본 후, Cookie, Session을 통해 회원 가입 및 로그인 기능을 구현해보았다.

 

1. 인증과 권한의 개념 (Authentication & Authorization)

인증(Authentication)은 요청이 왔을 때 그 요청을 보낸 사람이 누구인지를 증명하고, 그 요청에 대한 답(정보)를 줄 것인지 결정할 때 확인하는 절차를 말한다. 

권한(Authorization)은 인증(Authentication)을 통해 증명된 누군가가, 어떤 권한을 가지고 있어서, 어떠한 액션을 허용하는지 확인한는 절차를 말한다. 

 

웹에서 인증을 요청하는 사용자는 내가 누구인지(예를 들어, id, username등)와 그 유저인 증거(예를 들어, password)를 서버에 제시해야한다. 

 

2. 인증 절차

case1) 인증을 거치지 않고도 개인정보를 서버에 요청하고 받아올 수 있다면?

 

출처: codestates

 

이렇게 쉽게 받아올 수 있겠지만 당연히 보안이슈가 발생할 것이다. 

 

case2) 그래서 간단히 비밀번호를 넣어서 설계를 했다면?

 

출처: codestates

 

클라이언트가 서버에게 email과 password를 주면서 요청하면 => 서버는 DB에서 이메일과 비번을 받아서 => 이를 비교하는 과정을 거친다. => 비교한 결과가 일치하면 이메일을 가지고 관련된 개인정보를 다시 DB로부터 받아서 => 이 정보를 반환해주게 된다. 

 

그런데 email은 공개 정보인 반면 password는 보안에 신경을 써야하는 정보이다. 그래서 password는 암호화해주는것이 좋다. 

※ 암호화(Encryption)이란 

일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환하여 해당 방식에 대한 정보를 소유한 사람을 제외하고는 이해할 수 없도록 '암호화 알고리즘'을 이용해 정보를 관리하는 과정이다. 

 

case3) 암호화를 도입한 이후의 flow는?

 

출처: codestates

 

클라이언트가 서버에게 email과 password를 주면서 요청하면 => 서버는 일를 암호화시켜서 => 암호화시킨 결과와 DB에 암호화되어서 저장되어있던 문자열을 비교하는 과정을 거친다. => 그러면 이메일을 가지고 관련된 개인 정보를 요청해서 => 이 정보를 반환해주게 된다. 

 

3. 보안 방법

1) Hashing

Hashing은 어떠한 문자열에 '임의의 연산'을 적용하여서 다른 문자로 변환하는 것을 말한다. 이는 상대적으로 정보가 노출되기 쉬운 클라이언트 상에서의 보안을 위해 서버 내에서 이루어지며, 

민감 정보(휴대폰 번호, 비밀 번호.. 등) 등을 그대로 노출시키지 않고 암호화하여 주고 받을 수 있게 한다. 

 

출처: codestates

 

2) Salt

임의의 연산을 통해 암호화를 진행하였다고 하자. 그런데 임의의 연산에 대해서 누군가 알아버리면 그 사람은 바로 원본을 얻어 낼 수 있을 것이다. 

그래서 일반 hash만 사용하기에는 위험이 있다. 이를 방지하기 위해 hashing을 하기 전에 원본에 임의로 문자열을 추가한 후, hashing을 한다. 그러면 연산 알고리즘이 노출되더라도 원본 값을 보호할 수 있다. 

즉, Salt는 '안전장치'인 이다

Salt를 도입한다면 

case3의 flow가 아래와 같이 될 것이다. 

 

출처: codestates

 

 

3) Crypto

Hashing과 Salt를 알아보았다. 정리하면, 

only hashing: (암호화 하려는 값) => (hash 값)

salt사용: (암호화 하려는 값) + (Salt용 값) => (hash 값)

이렇게 Hashing과 salt를 암호화에 사용할 수 있도록 도와주는 것이 NodeJS 내장 모듈인 Crypto이다. 

 

 

 

 

지금까지 인증에 대해 알아보았다. 다음 포스트에서 Cookie, Session을 통해 회원 가입 및 로그인/아웃 기능을 구현해보면서 배웠던 것들에 대해서 정리할 것이다. 

 

Achievement Goals

 암호화와 hasing, salting등의 개념을 이해할 수 있다. 

 인증과 권한의 개념 (Authentication & Authorization)에 대해 이해할 수 있다. 

 클라이언트, 서버, 데이터베이스의 전체 동작을 이해할 수 있다. 

 

Reference

hanee24.github.io/2018/04/21/authentication-authorization/

 

'Dev > SW Engineering' 카테고리의 다른 글

37. Authentication - Session  (0) 2020.09.06
36. Authentication - Cookie  (0) 2020.09.06
33. ORM - Sequelize  (0) 2020.09.05
31. Databases - Client-Server-Database  (0) 2020.08.31
29. Databases - Structured Query Language with Database  (0) 2020.08.17