[Web] 서버 기반 인증과 토큰 기반 인증

kihongsi·2022년 3월 18일
0

web

목록 보기
3/3

HTTP Protocol의 특징

  1. connectionless: 요청에 따른 응답을 받으면 연결이 끊어진다.
  2. stateless: 통신이 종료되면 상태정보가 남지 않는다.

따라서 로그인 후 페이지를 새로고침하면 로그인 상태가 유지되지 않는다.
로그인 상태를 유지하기 위해 서버(세션, 쿠키) 기반 인증과 토큰 기반 인증 방식을 사용한다.



  1. 처음 사용자가 로그인 시 응답과 함께 세션id를 반환해야 함
  2. 사용자는 세션id를 받아 쿠키에 저장한 후, 인증이 필요한 요청마다 쿠키를 헤더에 포함시켜 서버에 요청함
  3. 서버는 쿠키를 받아 세션 저장소에서 대조함

토큰 기반 인증 - JWT

  1. 로그인 시 계정 검증 후 사용자에게 토큰 발급
  2. 클라이언트는 토큰을 저장해두고 서버에 요청할 때마다 전달
  3. 서버가 토큰을 검증 후 요청에 응답

JWT (Json Web Token)

json 형식의 데이터를 저장하는 토큰
헤더, 페이로드, 시그니처 세 부분으로 구성됨

  • 헤더: 토큰 종류와 해시 알고리즘 정보
  • 페이로드: 토큰의 내용물이 인코딩된 부분
  • 시그니처: 토큰 변조 여부를 확인할 수 있는 일련의 문자열

access token & refresh token

access token: 인증을 위한 JWT, 보안을 위해 유효기간이 매우 짧음

이를 보완하기 위해 refresh token 사용

로그인 구현 방법

  1. 로그인시 Access token과 Refresh token 모두 발급
    • 쿠키에 두 토큰 모두 저장
    • 서버측의 DB에는 refresh token만 저장함
  2. 두 토큰 모두 만료된 경우 에러, 한 토큰이 만료된 경우 재발급
  3. 두 토큰 모두 유효할 시 다음 미들웨어로
  4. 로그아웃 시 두 토큰 만료시킴


비교

세션 인증의 경우

  • 서버에서 세션id 저장소를 만들어 사용하기 때문에 서버에 추가 저장공간이 필요하여 저장공간 부하 증가

  • 서버의 확장성 문제

  • CORS 문제 : 단일 도메인(혹은 서브 도메인)에서만 작동하도록 설계된 쿠키는 여러 도메인에서 관리하기 번거로움

토큰 인증의 경우

  • stateless : 상태를 유지하기 않기 때문에 클라이언트측에서 들어오는 요청만으로 작업을 처리한다.

  • 클라이언트-서버 간의 연결이 없기 때문에 서버 확장성이 향상됨

  • 인증정보를 다른 어플리케이션으로 전달할 수 있기 때문에 SNS 계정 로그인도 가능

0개의 댓글