JWT(Json Web Token) 개요

박종원·2024년 11월 4일

개인 프로젝트 하기에 앞서 회원가입 부분을 공부하고 싶어서 이 글을 작성한다.
평소 회원가입을 하기 위해서는 DB에 직접 비밀번호를 저장하여 입력값과 비교하였다.

하지만 이는 매우 위험한 방식이다. 만약 SQL Injection을 받아 DB가 유출이 된다면? 매우 큰일 차라리 비밀번호를 아예 저장하지 않은 방식이 가장 안정한 방식이다.

인증/인가

  1. 인증 : 인증은 사용자가 누구인지 확인하는 과정이다. 주로 아이디와 비밀번호 또는 OTP, 생체인식, 인증 토큰 등을 사용해 인증을 수행한다.

  2. 인가 : 인가는 인증된 사용자가 시스템에서 특정 리소스에 접근할 권한이 있는지를 결정하는 과정이다. 인증이 사용자가 누구인지를 확인하는 것이라면, 인가는 그 사용자가 무엇을 할 수 있는지를 결정하는 과정이다.

즉 회원가입을 위해서는 인가가 아닌 인증의 과정이 필요하다!

인증의 종류

Cookie/Session/Token

보통 서버가 클라이언트 인증을 확인하는 방식은 대표적으로 쿠키, 세션, 토큰 3가지 방식이 있다.

쿠키(Cookie)는 웹 브라우저와 서버 간의 통신에서 사용자의 정보를 임시로 저장하기 위해 사용하는 작은 데이터 조각이다. 주로 로그인 상태 유지, 사용자 설정 저장, 쇼핑 카트 정보 저장 등에 사용된다.

쿠키 인증의 문제점

  1. 보안에 취약하다.
    요청 시 쿠키의 값을 그대로 보내기 때문에 유출 및 조작 당할 위험이 존재한다.
  2. 용량에 매우 제한적이다.
  3. 브라우저가 달라진다면 어려워진다.

Session 인증

세션 인증은 서버가 사용자 인증 정보를 서버 측에 저장하고, 클라이언트에는 세션 ID만 전달하는 방식으로 인증을 관리하는 방법이다. 사용자가 로그인할 때 생성된 세션 ID는 클라이언트 측(보통 쿠키로)에서 서버로 전달되며, 서버는 세션 ID를 통해 해당 사용자의 세션 정보를 조회하여 인증 상태를 유지한다.

세션 인증의 장점

  1. 보안성이 높음: 세션 정보가 서버에 저장되기 때문에 클라이언트가 세션 정보를 조작할 수 없어서, 비교적 안정.

  2. 상태 유지에 유리: 서버가 사용자의 상태 정보를 가지고 있어, 사용자의 상태(로그인 상태, 권한 등)를 일관되게 관리할 수 있. -> (Session key)

  3. 세션 만료 처리 용이: 서버 측에서 세션의 만료 시간을 설정할 수 있어, 일정 시간이 지나면 자동으로 로그아웃되게 설정하는 등 보안적인 처리 가능 -> (session validation)

세션 인증의 단점

서버 부하 증가: 세션 정보를 서버 메모리에 저장해야 하므로, 사용자가 많아질수록 서버의 메모리 사용량이 증가해 성능에 영향을 줄 수 있다. 특히, 트래픽이 많은 대규모 서비스에서는 서버 자원을 많이 소모하게 됨.

보안 취약 : 해커가 JSession 쿠키를 훔쳐 클라이언트인척 위장을 할 수가 있다.

토큰 인증

토큰 인증은 사용자가 로그인하면 서버가 토큰을 생성하여 클라이언트에 전달하고, 이후 클라이언트가 이 토큰을 서버에 전달하여 인증을 수행하는 방식이다.
주로 JWT (JSON Web Token)과 같은 형식으로 구현되어있다.이 토큰은 주로 서버가 아닌 클라이언트가 가지고 있다는 특징이 있다.

  1. Client가 요청을 보낸다.
  2. Server가 JWT를 만든다.
  3. Browser에게 전달한다.
  4. 클라이언트는 다시 Http Header에 담아 JWT를 보내고
  5. Server는 인증된 JWT인지 검사하고
  6. response를한다 .

JWT란

JWT (JSON Web Token)는 JWT는 사용자 인증과 정보 교환을 위해 안전하게 정보를 담아 전달하는 디지털 서명된 토큰이다. 주로 인증 및 정보 전달에 사용되며, JWT는 세 가지 부분으로 구성된다:

  • 헤더(Header): 토큰의 타입(JWT)과 해싱 알고리즘 정보를 담고 있다.

  • 페이로드(Payload): 클레임(Claim)이라는 정보 집합으로, 사용자의 ID, 권한 등 다양한 정보를 담을 수 있다. 클레임은 표준 클레임과 커스텀 클레임으로 나뉜다.

  • 서명(Signature): 헤더와 페이로드의 무결성을 보장하기 위해 서버 비밀 키로 생성된다.

JWT만의 장점

  • 무상태성 : JWT는 클라이언트가 토큰을 보유하고 인증을 수행한다. 이는 서버에서 상태를 저장할 필요가 없다(세션과 달리). 덕분에 서버의 부담이 줄고, RESTful API와 같이 무상태 구조가 필요한 시스템에 적합하다.

  • 토큰이 자체 정보 포함 : JWT는 사용자 ID, 권한, 만료 시간 등의 정보를 자체적으로 포함하고 있다. 이는 서버가 매번 데이터베이스를 조회하지 않아도 인증과 권한 검증을 수행할 수 있다.

  • 확장성과 호환성: JWT는 JSON 형식을 사용하여 다양한 플랫폼에서 쉽게 사용할 수 있다.

JWT의 가장 큰 장점은 서버가 매번 데이터베이스를 조회하지 않아도 된다는 점 이다. 예를 들어, 페이로드에 유저 이름과 유저 등급을 포함하여 토큰을 생성하면, 서버는 유저 이름을 기준으로 데이터베이스를 조회할 필요 없이 바로 유저 등급 등의 필요한 정보를 JWT에서 얻을 수 있다. 이를 통해 요청 속도가 빨라지고 서버의 부담도 크게 줄어든다.


출처
https://jwt.io/introduction

https://monsterlessons-academy.com/posts/jwt-authentication-beginners-guide-with-real-application

0개의 댓글