JWT

zio도미닉·2021년 9월 14일
1

CS

목록 보기
2/2

인증(Authentication)과 인가(Authorization)

  • JWT를 이야기 하기 전에 둘의 차이는?!
  • "인증"이란?
    - 특정 권한이 있는 사용자임을 알려주는 것
    - ID/PW를 통해 로그인 하는것
  • "인가"란?
    - 인증을 받은 사용자가 이후 여러 서비스의 기능을 사용하는 것
    - EX) Facebook에 로그인 후 사진을 업로드하거나 댓글을 남기거나 "좋아요"등의 기능을 사용하는것
  • IF) "인가"가 없다면?
    - Client는 매 요청마다 계속된 "인증" 절차를 거쳐야 됨 -> 이는 서버의 부하 (DB의 접속 & Validation 등의 작업으로)
    - 보안상의 위험 (요청에 계속 ID/PW를 추가 적으로 입력해야 되기 때문에)

따라서 이를 해결하기 위해 "인가"의 기술적인 방법이 필요!

  • Session & Cookie
  • JWT
  • 서버가 세션 ID를 두고 관리
  1. 클라이언트 -> 서버 / 서버 : 세션 ID를 생성
  2. 서버 -> 클라이언트 / 세션 ID를 쿠키에 담아 응답
  3. 클라리언트 -> 서버에 요청 / 이 쿠키의 세션 ID를 서버에 전달
  • 서버는 세션 ID로 세션에 있는 클라언트 정보를 가져온다.
  1. 서버 -> 클라이언트 클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답

좀 더 빠르게 가져오기 위해서는? Memory나 레디스(Cache)를 사용

  • 단점
  1. 사용자가 동시 접근, 메모리 부족
  2. IF 서버 에러 발생, 재시작하면 메모리(휘발성) 다 사라짐 -> 사용자는 다시 인증

JWT (Json Web Token)

  • JSON이란?
    "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷

    {
       "이름": "홍길동",
       "나이": 25,
       "성별": "여",
       "주소": "서울특별시 양천구 목동",
       "특기": ["농구", "도술"],
       "가족관계": {"#": 2, "아버지": "홍판서", "어머니": "춘섬"},
       "회사": "경기 수원시 팔달구 우만동"
    }```
    
  • Token이란?
    통상, 최소 단위, 대용 화폐(상품권,교환권 등), 정보를 지닌 물리적,가상적 물체 등을 의미 함
    - 보안 시스템에서의 토큰은, 크레딧 카드 크기의 작은 장치를 말하는데, ID 코드

  • JWT란?
    - Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token

  • JWT 구성 요소 (먼저 Payload부터!)
    - HEADER : 알고리즘 (RS256, HS256, RS512 등), 토큰 타입
    - PAYLOAD : 사용자의 ID, 서비스상의 Level, 관리자 여부등의 사용자 정보(Claim)
    - SIGNATURE (서명)

    사이트 : https://jwt.io/

  • 그럼 어떻게 진행되는데?! Flow Chart

  • 서버는 HEADER + PAYLOAD + 서버에 숨겨져있는 비밀키 값을 알고리즘으로 돌려서 SIGNATURE과 같은지 확인! 맞으면 PASS 틀리면 REJECT

  • 장점
    - 이렇게 되면 서버는 비밀키만 관리하면 되기 때문에 메모리 관리가 용이
    - 서버의 부하를 낮춤 (DB 접근을 계속할 필요가 없기 때문에)

  • 단점
    - 그러면 JWT가 제일 좋을까?! "NO"

  1. JWT로는 "사용자의 정보 통제가 어렵다"
    예를들어 1개의 기기 로그인만 가능하는 서비스를 만든다고 가정
    EX) PC, 스마트 폰 중 한개만 로그인되고 나머지는 접속 종료되어야 함.
    -> 이때, JWT로는 구현 힘듬, 이유는 사용자의 흐름에 따라 어떤 상태값도 저장을 안하기 때문에 Stateless
    -> 하지만 세션은 상태 정보를 저장하기 때문에 Stateful, 따라서 사용자를 통제가능!
  2. 해커에게 토큰을 탈취당할 경우, **무효화시키기 어려움

따라서 이에 대한 일부 해결방법은 2개의 Token을 나눠주는 방법!

  • Access 토큰 : 수명이 몇 시간 or 몇 분 이하 (인가토큰)
  • Refresh 토큰 : 보통 2주 정도의 토큰 (Access 토큰을 재 발급 받을때 쓰는 토큰)
  • Refresh 토큰은 발급 후 DB에 저장
  • Client는 Access 토큰의 수명이 다하면 Refresh 토큰을 보냄
  • 서버는 Refresh 토큰이 오면 DB와 대조하고 새로운 Access Token을 보냄.

해결책

  • 해커가 Access 토큰을 중간에서 가로채도 오래 사용하지 못함
  • 중복 로그인을 제거하기 위해서 DB의 Refresh 토큰을 지워서 Access Token의 토큰 갱신을 안되게 할 수 있음.

결론

  • JWT가 Session보다 구현하기 편리하고 좋더라도 Session과 같이 이용하는 방법을 사용!

REFERENCE

TODO

profile
BackEnd Developer

0개의 댓글