본문 바로가기

개념정리

10/28[TIL]Authentication

이번 스프린트는 인증에 관련된 스프린트이다. 세션, 쿠키, 토큰, 암호화, 해싱, 솔트 등 클라이언트가 서버와 요청을 주고받으면서의 인증 문제 적인 측면을 다루어 볼 수 있는 부분이다.

 

인증 부분에 있어서는 크게 세션과 암호화로 나누어 볼 수 있으며 세션은 쿠키와 토큰, 암호화는 해싱과 솔트로 나누어 볼 수 있다.

 

세션(Session)

세션은 일정시간 동안 동일한 사용자에 대한 상태 정보를 유지시키는 것을 의미한다. 그리고 방문자(브라우저)가 웹서버에 접속하게 되면 방문자의 요구에 따른 정보를 저장하는 것을 말한다. 사용자 정보를 사용자 쪽이 아닌 서버 상에서 관리(저장)한다.

 

서버와 클라이언트의 연결이 활성화 된 상태를 보게 된다면

 

1. 서버가 client에 대해 유일한 id를 부여하여 서버 측에서 관리하고

2. 일반적으로 이 유일한 client id가 서버에서 존재하는 상황을 세션이라고 말한다 이를 쉽게 말하면 우리가 로그인하고 창을 끄고 다시 접속 시 다시 로그인하여야 한다는 것을 생각해볼 수 있다.

3. 각 client id의 세션 객체마다 data를 관리할 수 있다.(ex) 며칠 전에 접속하셨습니다 라는 문구)

4.사용자의 정보 중 보안상 중요한 데이터는 세션에서 관리한다.

 

 

쿠키(Cookie)

사용자의 정보를 사용자 메모리(브라우저)에서 관리한다.

서버가 사용자의 위치에 정보를 저장하고 불러올 수 있는 수단으로 이전에 컴퓨터에서 쿠키를 지우고 했던 기억들이 났다.

1. 특정 호스트에서 생성된 쿠키는 이후 모든 요청마다 서버로 다시 전송

2. 이름값, 만료 날짜, 경로 정보로 구성

서버와 클라이언트(에서 관리)가 대화하기 위한 수단

 

토큰(Token)

인증을 위해 사용되는 암호화된 문자열로 어떤 정보들을 해싱하여 client와 서버를 왕복한다는 개념으로 이해하면 될 것 같다.

특징으로는 

1. http 통신의 stateless 특징과 알맞다.

이전에 배운 부분이지만 되새겨 보면 연결된 상태일 때만 교류한다는 것이고 서버와 연결 안되 있을 때는 정보를 받을 수 없고 혹여 정보가 있었더라도 폐기된다는 특징을 가지는 것이다. 하지만 토큰을 지니고 있다면 해당 데이터들을 기억한다(?) 유저에 대한 상태를 관리할 필요가 없다고 볼 수 있을 것 같다.

2. 유저의 인증 정보를 서버나 세션에 담아 두지 않고 토큰으로!(접근 등 판단 가능!)

3. 유저의 활성화 여부를 신경 쓰지 않고 넘겨진 요청에 담긴 토큰의 정합성만을 확인하면 됨!

4. 서버에서 클라이언트의 상태 정보를 저장하지 않고 클라이언트에서 넘겨지는 요청만으로 작업을 처리하게 되는데 이런 경우 클라이언트 상태 관리에 관한 비용이 없기 때문에 서버의 확장성이 높아지게 되고 이는 세션 관리를 하는 코드를 짤 필요가 없고 우리는 결국엔 api 로직만 신경 쓰면 되므로 생산성이 향상될 수밖에 없다.

 

 

암호화(Encryption)

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

 

해싱(Hashing)

어떠한 문자열에 임의의 연산을 적용하여 다른 문자열로 변환하는 것이다. 이전에 배웠던 부분이라 뒤의 솔팅 부분까지 이해가 한결 쉬웠다. 민감한 정보(비밀번호, 휴대폰 번호 등)를 그대로 노출시키지 않고 한눈에 알아볼 수 없는 문자열로 변환하여 주고받을 때 사용하며 주로 서버 로직 내에서 이루어지며 상대적으로 정보가 노출되기 쉬운 클라이언트 상에서의 보안을 신경 쓰기 위해 사용한다.

이러한 해싱을 할 때 필요 요건들이 존재하는데

1. 모든 값에 대해 해시 값을 계산하는데 오래 걸리지 않아야 한다.

2. 최대한 해시 값을 피해야 하며 모든 값은 고유한 해시 값을 가진다.

3. 아주 작은 단위의 변경이라도 완전히 다른 해시 값을 가져야 한다.

 

솔팅(Salting)

해시하려는 값(원본)에 추가하는 값이며 우리가 솔팅을 하여야 하는 이유는

1. 암호화를 진행했다면 해당 알고리즘을 알고 있는 순간 바로 원본을 얻어낼 수 있다.

2. 원본 값에 임의로 약속된 추가 문자열을 추가하여 해시를 진행하여 기존 해시값과 전혀 다른 해시 값이 반환되어 알고리즘이 노출되더라도 원본 값을 보호할 수 있도록 하는 안전장치이다.

간단히 설명하여 보자면 값 + Salt => 알고리즘으로 값 변환 => 변환 값을 입력받은 방식으로 인코딩 => 해쉬값으로 표현할 수 있을 것 같다.

Crypto (NodeJS 내장 암호화 모듈) 같은 프로그램이 존재하는데 사용한 예를 보자면 아래의 그림과 같다.

1
2
3
4
5
6
7
const crypto = require('crypto');
 
const secret = 'coding'//
const hash = crypto.createHmac('sha256', secret) //(알고리즘방식, salt값)
                   .update('I love coding'//hashing 할 값
                   .digest('hex'); //인코딩방식
console.log(hash);
cs

 

 

 

 

'개념정리' 카테고리의 다른 글

11/3[TIL]AWS Deploy  (0) 2020.11.03
10/30 [TIL] OAuth 2.0  (0) 2020.10.30
10/26[TIL]MVC Patterns & ORM  (0) 2020.10.26
10/21[TIL]Database  (0) 2020.10.21
10/19[TIL]Routing  (0) 2020.10.21