JWT - (1) JWT와 쿠키&세션의 기초

단비·2023년 5월 11일
0

학습

목록 보기
43/66

JWT (Json Web Token)

  • 인증에 필요한 정보들을 암호화시킨 JSON 토큰
  • 인증(authentication) 또는 인가(authorization) 정보를 서버와 클라이언트 간에 안전하게 주고 받기 위해서 사용
  • JSON 데이터를 Base64 URL-safe Encode 를 통해 인코딩하여 직렬화한 것
    (위변조 방지를 위해 개인키를 통한 전자서명이 들어있음)

    Base64 URL-safe Encode 는 일반적인 Base64 Encode 에서 URL 에서 오류없이 사용하도록 '+', '/' 를 각각 '-', '_' 로 표현한 것

Authorization HTTP 헤더를 Bearer <토큰>으로 설정하여 클라이언트에서 서버로 전송
서버에서는 토큰에 포함되어 있는 서명(signature) 정보를 통해서 위변조 여부를 빠르게 검증



JWT 구조

  • 헤더(header)와 페이로드(payload), 서명(signature) 이렇게 세 부분으로 이루어지며 각 구역이 , 기호로 구분

1. 헤더(header)

  • 토큰의 유형과 서명 알고리즘에 명시됨

    typ : 토큰의 유형(type)
    alg : 서명 알고리즘(algorithm)
    iss : 토큰 발급처


2. 페이로드(payload)

  • 서버와 클라이언트가 주고받는 시스템에서 실제로 사용될 정보에 대한 내용을 담고 있는 섹션
  • 사용자의 인증/인가 정보

페이로드는 정해진 데이터 타입은 없지만,
대표적으로 Registered claims, Public claims, Private claims 이렇게 세 가지로 나뉨

Claim
key-value 형식으로 이루어진 한 쌍의 정보

Registed claims

  • 미리 정의된 클레임
    • iss(issuer; 발행자)
    • exp(expireation time; 만료 시간)
    • sub(subject; 제목)
    • iat(issued At; 발행 시간)
    • jti(JWI ID)

Public claims

  • 사용자가 정의할 수 있는 클레임 공개용 정보 전달을 위해 사용

Private claims

  • 해당하는 당사자들 간에 정보를 공유하기 위해 만들어진 사용자 지정 클레임.
    외부에 공개되도 상관없지만 해당 유저를 특정할 수 있는 정보들을 담음

3. 서명(signature)

  • 헤더와 페이로드가 비밀키로 서명되어 저장됨






JWT를 이용한 인증 과정

  1. 브라우저(클라이언트)가 서버에 요청(접속)

  2. 서버에서 클라이언트로부터 인증 요청을 받으면, Header, PayLoad, Signature를 정의
    Hedaer, PayLoad, Signature를 각각 Base64로 한 번 더 암호화하여 JWT를 생성하고 이를 쿠키에 담아 클라이언트에게 발급

  3. 클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장
    (쿠키나 다른 곳에 저장할 수도 있음)
    API를 서버에 요청할때 Authorization header에 Access Token을 담아서 보냄

  4. 서버가 할 일은 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인
    인증이 통과되었으므로 페이로드에 들어있는 유저의 정보들을 select해서 클라이언트에 돌려줌

  5. 클라이언트가 서버에 요청을 했는데, 만일 액세스 토큰의 시간이 만료되면 클라이언트는 리프래시 토큰을 이용해서 새로운 엑세스 토큰을 발급 해줌




JWT 장점

확장성

  • JWT
    토큰 자체에 사용자의 정보가 저장되어 있어있기 때문에 서버 입장에서 토큰을 검증만 해주면 됨
  • 쿠키와 세션
    로그인한 모든 사용자의 세션을 DB나 캐시(cache)에 저장해놓고
    쿠키로 넘어온 세션 ID로 사용자 데이터를 조회해야함

    JWT를 사용할 때는 사용자가 늘어나더라도 사용자 인증을 위해서 추가로 투자해야하는 인프라 비용을 크게 절감할 수 있음




JWT 사용 시 주의사항

서명이 되어 있는 JWT 토큰 서버에서만 유효성을 검증할 수 있지만,

그 안에 저장된 데이터는 누구나 쉽게 열람이 가능

따라서, 민감한 사용자 정보를 JWT 토큰에 그대로 저장하게 되면 큰 보안 문제로 이어질 수 있으니 주의 필요


❗❗ 중요한 정보는 무조건 암호화 ❗❗




Refresh Token이란?

  • JWT 방식의 인증(보안) 강화 방식인 Access Token & Refresh Token 인증 방식에서 사용 가능

Refresh Token이 필요한 이유

  • Access Token 만을 통한 인증 방식의 문제는 만일 제 3자에게 탈취당할 경우 보안에 취약

  • 유효기간이 짧은 Token의 경우
    그만큼 사용자는 로그인을 자주 해서 새롭게 Token을 발급받아야 하므로 불편하다는 단점이 있음

Access Token은 접근에 관여하는 토큰
Refresh Token은 재발급에 관여하는 토큰


Refresh Token의 사용 원리!

만료된 Access Token을 서버에 보내면,
서버는 같이 보내진 Refresh Token을 DB에 있는 것과 비교해서
일치하면 다시 Access Token을 재발급하는 간단한 원리

사용자가 로그아웃을 하면 저장소에서 Refresh Token을 삭제하여 사용이 불가능하도록 하고
새로 로그인하면 서버에서 다시 재발급해서 DB에 저장







쿠키 & 세션 & 토큰의 차이점


쿠키(Cookie)

  • Key-Value 형식의 문자열
  • 클라이언트의 브라우저에 설치되는 작은 기록 정보 파일

쿠키 인증 방식

  1. 브라우저(클라이언트)가 서버에 요청(접속)

  2. 서버는 클라이언트의 요청에 대한 응답을 작성할 때,
    클라이언트 측에 저장하고 싶은 정보를 응답 헤더의 Set-Cookie에 담음

  3. 이후 해당 클라이언트는 요청을 보낼 때마다, 매번 저장된 쿠키를 요청 헤더의 담아서 보냄
    서버는 쿠키에 담긴 정보를 바탕으로 해당 클라이언트를 식별함

쿠키 인증 방식의 단점

  1. 보안에 취약

    • 요청 시 쿠키의 값을 그대로 보내기 때문
  2. 용량 제한이 있어 많은 정보를 담을 수 없음

  3. 웹브라우저마다 쿠키에 대한 지원 형태가 다르기 때문에 브라우저 간 공유가 불가능함

  4. 쿠키의 사이즈가 커질수록 네트워크 부하가 심해짐




세션(Session)

  • 비밀번호 등 클라이언트의 민감한 인증 정보를 브라우저가 아닌 서버 측에 저장하고 관리
    (서버의 메모리에 저장하기도 하고, 서버의 로컬 파일이나 데이터베이스에 저장하기도 함)

세션의 저장 형태
Key: SESSION ID,
Value: data ...

Value에는 세션 생성 시간, 마지막 접근 시간 및 User가 저장한 속성 등 이 Map 형태로 저장됨

세션 인증 방식

  1. 유저가 웹사이트에서 로그인하면 세션이 서버 메모리(혹은 데이터베이스) 상에 저장됨
    (세션을 식별하기 위한 Session Id를 기준으로 정보를 저장)

  2. 서버는 브라우저 쿠키에 Session Id를 저장

  3. 쿠키에 정보가 담겨있기 때문에 브라우저는 해당 사이트에 대한 모든 Request에 Session Id를 쿠키에 담아 전송

  4. 서버는 클라이언트가 보낸 Session Id 와 서버 메모리로 관리하고 있는 Session Id를 비교하여 인증을 수행

세션 인증 방식의 단점

  1. 쿠키를 포함한 요청이 외부에 노출되더라도 세션 ID 자체는 유의미한 개인정보를 담고 있지 않지만,
    세션 ID 자체를 탈취하여 클라이언트인 척 위장할 수 있음
    (이는 서버에서 IP특정을 통해 해결 할 수 있음)

  2. 서버에서 세션 저장소를 사용하므로 요청이 많아지면 서버 과부하




토큰(Token)

  • 클라이언트가 서버에 접속을 하면 서버에서 해당 클라이언트에게 인증되었다는 의미로 토큰을 부여

토큰 인증 방식

  1. 브라우저(클라이언트)가 서버에 요청(접속)

  2. 서버 측은 사용자(클라이언트)에게 유일한 토큰을 발급

  3. 클라이언트는 서버 측에서 전달받은 토큰을 쿠키나 스토리지에 저장해 두고,
    서버에 요청을 할 때마다 해당 토큰을 HTTP 요청 헤더에 포함시켜 전달

  4. 서버는 전달받은 토큰을 검증하고 요청에 응답
    (토큰에는 요청한 사람의 정보가 담겨있기에 서버는 DB를 조회하지 않고 누가 요청하는지 알 수 있음)

토큰 인증 방식의 단점

  1. 쿠키/세션과 다르게 토큰 자체의 데이터 길이가 길어,
    인증 요청이 많아질수록 네트워크 부하가 심해질 수 있음

  2. Payload 자체는 암호화되지 않기 때문에 유저의 중요한 정보는 담을 수 없음

  3. 토큰을 탈취당하면 대처하기 어려움
    (따라서 사용 기간 제한을 설정하는 식으로 극복)





참고사이트

JWT - Json Web Token - daleseo
JWT 토큰 인증 이란? (쿠키 vs 세션 vs 토큰) - 인파
Access Token & Refresh Token 원리 - 인파

profile
tistory로 이전! https://sweet-rain-kim.tistory.com/

0개의 댓글