인증 & 인가

인증

인증은 사용자 추적을 위해 사용자 로그인 절차에서 정확한 조합을 입력했는지 확인하는 과정을 뜻한다.

이러한 과정에서 비밀번호는 데이터베이스에 저장될 때 단방향 해쉬 함수를 통해  hashing 되어 저장된다.

 

단방향 해쉬 함수의 특징

  • 단방향만 가능하다. (이미 해쉬 된 값을 통해 원본의 값을 복원할 수 없다.)
  • 같은 input은 같은 output을 도출한다.

python의 dictionary, javascript의 object 타입은 key값을 해쉬하여 숫자로 변형한 후에 저장된다. 

이러한 자료구조를 해쉬 테이블(Hash Table)이라고 한다.

 

단방향 해쉬 함수의 약점(rainbow table attack 등)을 보완하기 위해 saltingkey Stretching이 사용된다.

 

Salting은 비밀번호를  해쉬할 때 무작위의 데이터를 더해서 해쉬값을 계산하는 방법이다.

Key Stretching은 Salting 하여 해쉬값을 구하는 절차를, 결과로 나온 해쉬값을 가지고 여러 번 반복하는 방법이다.

bcrypt : salting & key stretching의 대표적 라이브러리

인가

인가는 사용자가 서버에 요청을 보내면 인증 과정을 거쳐 확인된 사용자가 맞는지 확인하는 과정이다.

 

사용자는 로그인을 하기 위해 서버측으로 자신의 아이디와 비밀번호를 보내 인가를 요청하게 된다.

이 과정에서 클라이언트는 서버에 HTTP 요청을 보내게 되는데 HTTP 요청은 stateless이기 때문에

매 요청마다 사용자를 확인 할 수 있는 정보를 header에 담아주어야 한다.

 

이 과정에서 서버의 session이 쓰이게 된다.

 

인증 인가 flow

  1. 클라이언트 측에서 서버 측으로 HTTP 요청(로그인)
  2. 서버에서 유저 정보 확인 후 유저 정보를 담고 있는 session을 메모리에 저장한 후에 해당 session의 id를 쿠키 형태로 클라이언트에게 전송
  3. 브라우저에서 session id를 담고 있는 쿠키를 브라우저에 저장
  4. 다시 클라이언트에서 HTTP 요청을 보낼 때 브라우저에 저장된 쿠키를 포함시킨다.
  5. 서버에서 요청의 쿠키에 담긴 session id를 통해 유저 정보를 확인
  6. 서버에서 클라이언트로 HTTP 응답 전송

하지만 이러한 방식은 여러 대의 서버가 연결되어 있을 때 session을 공유하지 못한다는 단점이 있다.

 

이러한 단점을 해결하기 위해 JWT(Json Web Token)이 등장하였다.

 

JWT

 

 

출처: https://velopert.com/2389

 

JWT헤더, 페이로드, 시그니쳐로 이루어져 있다.

 

  • 헤더 : 토큰의 타입(JWT)과 해시 알고리즘의 정보를 담고 있다.
  • 페이로드 : 페이로드에 들어가는 값들은 name/value의 형식을 가지고 '클레임'이라는 단위로 불리게 된다.
    토큰에 대한 정보들을 담기 위하여 이름이 이미 정해진 등록된 클레임, 충돌을 방지하기 위해 중복된 이름 사용이 불가한 공개 클레임, 클라이언트 서버 간 협의하에 사용되는, 중복된 이름이 허용되는(주의해서 사용) 비공개 클레임으로 나눌 수 있다.
  • 시그니쳐 : 시그니쳐에는 JWT가 원본 그대로라는 것을 확인할 때 사용될 문자열이 담겨 있다.
    이 문자열은 헤더와 페이로드의 내용에 따라 바뀌게 되며 서버에서는 시그니쳐 부분의 문자열을 복호화하여 서버에서 생성된 원본의 JWT가 맞는지 확인한다. 

JWT의 헤더와 페이로드에는 누구나 봐도 상관없는 내용이 담겨야 한다.

 

JWT를 활용한 인증 인가 flow

  1. 클라이언트 측에서 서버 측으로 HTTP 요청(로그인)
  2. 서버에서 유저 정보 확인 후 시크릿 키를 활용하여 JWT생성 후 클라이언트로 전송
  3. 브라우저에 JWT를 저장
  4. 다시 클라이언트에서 HTTP 요청을 보낼 때 JWT를 포함시킨다.
  5. 서버에서 요청에 담긴 JWT의 시그니처 확인 후 유저 정보 확인
  6. 서버에서 클라이언트로 HTTP 응답 전송

클라이언트와 연결된 모든 서버가 시크릿 키를 공유하게 된다.


 

'개발 > WEB' 카테고리의 다른 글

TIL # 27 HTTP 통신  (0) 2021.05.24
SSR, CSR  (0) 2021.03.21
서비스 워커(Service Worker)  (0) 2021.02.14
Payload  (0) 2021.02.14
URI(Uniform Resource Identifier)  (0) 2021.02.14

+ Recent posts