JWT(Json Web Token)

Jin·2024년 6월 17일
1

로그인 구현하기

목록 보기
2/2
post-thumbnail

세션 기반 인증 vs 토큰 기반 인증

세션 기반 인증

서버의 세션 기능과 클라이언트의 쿠키를 활용하여 사용자 인증을 하는 방법이다.
주로 서버 사이드 랜더링 방식으로 처리되는 웹서비스에서 많이 사용된다.

그렇다 보니 클라이언트로부터 요청을 받으면 클라이언트 상태를 계속 유지해놓고 사용한다. (Stateful)
이는 사용자가 증가함에 따라 메모리의 성능 문제를 일으킬 수 있고 -> Redis로 메모리 관리 가능
쿠키는 단일 도메인, 서브 도메인에서만 작동하여 여러 도메인에서 사용한다면 따로 관리를 해야한다.

토큰 기반 인증

Rest 아키텍처에서 많이 사용된다.
JWT가 있다.
사용자가 로그인을 요청하면 그 사용자가 맞는지 확인하고 토큰을 준다.
서버는 따로 토큰을 가지고 있지 않는다.
즉, 상태를 유지 하지 않는다.(Stateless)

JWT

JSON Web Token
JSON 객체를 사용하여 정보를 안전하게 전송하기 위한 개방형 표준이라고 한다.

JWT를 언제 사용할까?

  1. 인증(Authentication)
    사용자가 로그인할 때 서버에서 생성하여 클라이언트에 전달
    클라이언트는 이후의 요청에 JWT를 포함시켜 서버에 인증한다.
    서버는 JWT를 검증하여 사용자를 인증

    인증 (Authentication)
    인증은 사용자가 자신이 누구인지 확인하는 과정입니다. 즉, 사용자가 주장하는 신원이 실제로 그 사람인지 확인하는 절차
    인가 (Authorization)
    인가(권한 부여)는 인증된 사용자가 특정 자원이나 기능에 접근할 수 있는 권한을 가지고 있는지 확인하는 과정. 즉, 사용자가 무엇을 할 수 있는지 결정하는 절차.

  2. 정보 교환(Information Exchange)
    JWT는 서명이 포함되어 있어 정보의 무결성을 보장
    그렇기에 양 측으로 정보를 교환하는데 사용할 수 있다.

JWT의 구성 요소

JWT는 세 부분으로 구성되어 있다.
각 부분은 점(.)으로 구분된다.

  1. 헤더(Header): 토큰의 유형과 해싱 알고리즘을 지정한다.
  2. 페이로드(Payload): 클레임(claim)을 포함하여 실제 정보가 들어 있는 부분이다.
  3. 서명(Signature): 토큰의 무결성을 검증하기 위해 사용한다.

예시

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJhZG1pbiI6dHJ1ZX0
.
F-cvL2RcfQhUtCavIM7q7zYE8drmj2LJk0JRkrS6He4

jwt디버거 여기서 위의 jwt를 돌려보면 밑에서 설명하는 값이 나온다.

각 구성 요소의 설명

  1. 헤더(Header)
{
  "alg": "HS256",
  "typ": "JWT"
}
  • alg: 사용할 서명(비밀 키) 알고리즘 (예: SHA256)
  • typ: 토큰의 타입(JWT)
  1. 페이로드(Payload)
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022,
  "admin": true
}
  • sub: 토큰의 주체(Subject)
  • name: 사용자 이름
  • iat: 토큰 발행 시간(Issued At)

페이로드는 여러 개의 클레임을 포함할 수 있다.

클레임은 등록된 클레임(Registered Claims), 공개 클레임(Public Claims), 비공개 클레임(Private Claims)으로 나눌 수 있다.

  1. 서명(Signature)
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

서명은 헤더와 페이로드를 인코딩한 후 비밀 키를 사용하여 생성한다.
토큰을 무결성을 검증하는데 사용

JWT는 어떻게 작동하는가

  1. 사용자 인증
    사용자가 로그인할 때, 서버는 사용자의 자격 증명을 확인한다 (예: 아이디과 비번)

  2. JWT생성
    서버는 사용자가 인증에서 성공하면 JWT를 생성한다.
    이 토큰에는 사용자 정보를 포함한 페이로드와 함께 헤더,서명이 포함된다.

  3. JWT전달
    서버는 생성된 JWT를 클라이언트에 전달한다.
    클라이언트는 이 JWT를 로컬 스토리지나 쿠키에 저장한다.

  4. 요청 시 JWT첨부
    클라이언트는 이후의 모든 요청에 JWT를 포함시켜 서버에 보낸다.
    보통 이 토큰은 HTTP헤더의 Bearer스키마를 사용한Authorization필드에 포함된다.

Authorization: Bearer <token>
  1. 서버에서 JWT검증
    서버는 클라이언트로부터 받은 JWT를 검증한다.
    서명 확인, 유효성 검사, 사용자 정보확인과 같은 과정을 거친다.

  2. 요청 처리
    서버가 JWT가 유효하다고 판단하면 요청한 데이터에 접근할 수 있도록 허용한다.

JWT 단점

  • 토큰 크기: JWT는 기본적으로 크기가 커질 수 있어, 헤더의 크기가 증가할 수 있다. -> 네트워크 부하 일어날지도
  • 무효화 어려움: Stateless로 서버에서 임의 삭제 불가
  • 토큰 자체에 정보 저장해서 보안 취약

출처

https://jwt.io/introduction

https://inpa.tistory.com/entry/WEB-📚-JWTjson-web-token-란-💯-정리

https://velog.io/@jun7867/세선-기반-인증과-토큰-기반-인증JWT-차이점

profile
go-getter

0개의 댓글