마트철수

[TIL_4] KB 부트캠프: JWT 본문

KB IT's Your Life/KB 기자단

[TIL_4] KB 부트캠프: JWT

마트스 2024. 8. 26. 07:22

 
 
 

[TIL_4] KB 부트캠프: 컴포넌트 백엔드

 
 
안녕하세요,
 
'Today I Learned' 4주차에서는
컴포넌트 백엔드 중 JWT에 대해
작성해보고자 합니다.
 
웹 개발에서 보안은 항상 중요한 이슈 중 하나죠!
최근 많은 애플리케이션이 JWT(JSON Web Token)를 사용하여
인증 및 권한 부여를 처리하고 있습니다.
 
중요한 개념인 JWT의 기본 개념부터, 엑세스 토큰과 리프레시 토큰의 역할까지
자세히 알아보겠습니다.
 
좀 더 세부적인 내용은 가장 하단의 타임라인을 참고해주세요!
 
 


 

목차

  1. JWT란 무엇인가?
  2. 토큰 기반 인증 vs 세션 기반 인증
  3. 엑세스 토큰과 리프레시 토큰의 차이점
  4. 결론

현재 KB IT's Your Life에서 다루는 내용을 기반으로 작성하였으며,
하단엔 '~다' 체를 사용하였습니다.

#KB부트캠프 #KB코딩 #KB코딩테스트
 


1. JWT란 무엇인가?

  • JWT는 JSON Web Token의 약자
  • 자바스크립트의 Object 자료구조를 바탕으로 웹 토큰으로 사용되는 구조
  • 쉽게 말해, 데이터를 JSON 형식으로 인코딩하여 웹에서 인증 정보나 다른 데이터를 안전하게 주고받을 수 있도록 하는 방법
JSON 웹 토큰 (출처: 위키백과)

 

1.1. JWT를 사용하는 이유

  • 주로 HTTP의 특성상 서버가 클라이언트의 상태를 기억하지 않는 '무상태(stateless)' 특성을 보완하기 위해 사용한다.

장점:

  1. 서버의 확장성:
    서버에 클라이언트의 상태를 저장하지 않기 때문에, 대규모 트래픽 상황에서도 서버의 부담이 적다.
  2. 독립성:
    특정 서버나 데이터베이스에 의존하지 않고도 인증을 할 수 있다.

단점:

  1. 반복적인 데이터 전송:
    세션 방식보다 비교적 많은 양의 데이터를 반복적으로 전송하므로 네트워크 성능 저하가 발생할 수 있다.
  2. 보안 문제:
    데이터가 노출될 위험이 있다. 이를 방지하기 위해 데이터 압축 및 서명이 필요하다.

 

1.2. JWT의 구성 요소

  • JWT는 세 부분으로 나뉜다.
  • 헤더(Header), 페이로드(Payload), 시그니처(Signature)
    • 헤더: 토큰의 타입과 사용하는 암호화 알고리즘을 명시합니다.
    • 페이로드: JWT에 담길 데이터와 발급/만료일 등의 정보를 포함합니다.
    • 시그니처: 헤더와 페이로드가 변조되지 않았음을 확인하는 역할을 합니다.

 

JWT의 구성 요소

 

 

1.3 구조

  • 헤더
    • 서명 생성을 위해 어느 알고리즘을 사용할지를 식별한다.
    • HS256는 이 토큰이 HMAC-SHA256를 사용하여 서명됨을 의미한다.
    • 일반적으로 쓰이는 암호화 알고리즘들은 SHA-2(HS256) 방식의 HMAC와 SHA-256(RS256) 방식의 RSA 서명이다. 
{
 "alg" : "HS256",
 "typ" : "JWT"
}

 

  • 페이로드
    • 모든 클레임을 포함한다.
    • JWT 사양은 토큰에 일반적으로 포함되는 표준 필드인 7개의 등록 클레임 이름(Registered Claim Names)을 정의한다.
    • 토큰의 목적에 따라 사용자 지정 클레임 또한 일반적으로 포함된다.
{
 "loggedInAs" : "admin",
 "iat" : 1422779638
}

 

 

▲ 다음 예는 표준 Issued At Time 클레임(iat)과 사용자 지정 클레임(loggedInAs)을 보여준다.

 

  • 서명
    • 토큰을 안전하게 확인한다.
    • 서명은 Base64url 인코딩을 이용하여 헤더와 페이로드를 인코딩하고 이 둘을 점(.) 구분자로 함께 연결시킴으로써 계산된다. 해당 문자열은 그 뒤 헤더에 규정된 암호화 알고리즘(이번 경우에는 HMAC-SHA256)에 유입된다.
    • Base64url 인코딩은 base64와 비슷하지만 각기 다른 영숫자를 사용하며 패딩(padding)은 제외한다.
HMAC-SHA256(
 secret,
 base64urlEncoding(header) + '.' +
 base64urlEncoding(payload)
)

 


 

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

 

토큰 기반 인증:

  • 토큰이 보안 및 사용자 데이터를 관리한다.
  • 서버는 토큰을 발급하지만, 이후의 인증은 클라이언트와 토큰으로 처리된다.

 

세션 기반 인증:

  • 서버가 보안 및 사용자 데이터를 관리한다.
  • 서버가 세션을 유지하고 클라이언트는 세션 ID를 통해 인증을 진행한다.

 

보안이 뚫렸을 때의 차이점:

  • 세션 기반 인증에서는 서버 개발자가 세션을 만료시켜 추가적인 피해를 막을 수 있다.
  • 반면 토큰 기반 인증에서는 탈취된 토큰을 서버에서 강제로 만료시키기 어렵다.

 

이 문제를 해결하기 위해 리프레시 토큰이 도입되었다!




3. 엑세스 토큰과 리프레시 토큰의 차이점

 

엑세스 토큰:

  • 서버의 API를 직접 요청할 때 사용된다.
  • 주기가 짧아(약 1시간) 탈취되더라도 피해를 최소화할 수 있다.

리프레시 토큰:

  • 엑세스 토큰이 만료되었을 때, 이를 재발급받기 위해 사용된다.
  • 주기가 길어(약 2주) 더 안전하게 관리되어야 한다.

 

엑세스 토큰과 리프레시 토큰의 분리는
중간에 토큰이 탈취되었을 경우의 피해를 줄이기 위한 목적에 있다!

엑세스 토큰, 리프레쉬 토큰 출처: 네이버works




토큰 기반 인증의 장단점

장점:

  • 확장성: 대규모 유저를 다룰 때 서버의 부담이 적다.
  • 가벼움: 서버에 세션 정보를 저장하지 않기 때문에, 시스템이 가볍다.

단점:

  • 보안 문제: 탈취된 토큰은 서버에서 강제로 만료시킬 수 없으며, 탈취 시 피해가 클 수 있다.
  • 추가적인 복잡성: 리프레시 토큰 등의 관리가 필요하다.

 

Spring Security + JWT 동작 원리

 


 

7. 결론: JWT 사용의 적절한 상황

  • JWT 기반 인증은 대규모 트래픽을 처리하는 애플리케이션에서 유용하며, 서버의 확장성을 높여준다.
  • 보안이 중요한 경우에는 세션 기반 인증이 더 적합할 수 있다.
  • 프로젝트의 특성과 요구사항에 따라 JWT와 세션 기반 인증을 상호 보완적으로 사용하는 것이 중요하다.
!! 장단점이 확실하니, 프로젝트 기획과 시선에 따라 상호 대체가 가능하다!!

 

5. 컴포넌트 백엔드 교육 타임라인 정리

이번 TIL에서는 컴포넌트 백엔드 교육만
핵심 내용만을 축약해 보았습니다.
 
Rest API, Spring 로그인 구현을 위한 jwt
서버 프로그래밍입니다.
 
다음주부터는 Vue + Spring 프로젝트에

대한 정보로 찾아오겠습니다!
 
 
👩‍💻타임라인
 
1일차. Rest API
2024.08.19 - [KB IT's Your Life/교육] - [069] Rest API

 

2일차. Spring 로그인과 로그아웃 처리

2024.08.20 - [KB IT's Your Life/교육] - [070] Spring 로그인과 로그아웃 처리

 
3일차. JWT, Api Server Security

2024.08.21 - [KB IT's Your Life/교육] - [071] JWT, Api Server Security

 
4일차. API 로그인 및 사용자 인증

2024.08.22 - [KB IT's Your Life/교육] - [072] API 로그인 및 사용자 인증
 


 

📒TIL을 마무리하며..

 
4주차 TIL을 작성하면서,
웹 애플리케이션의 보안을 강화하는 데 중요한 역할을 하는 JWT에 대해 살펴보았습니다.

 

JWT는 그 간편함과 강력함 덕분에 많은 애플리케이션에서 채택되고 있으며,

특히 인증 및 권한 부여와 관련된 다양한 문제를 효과적으로 해결해 줍니다.

 

엑세스 토큰과 리프레시 토큰의 개념을 이해하고 올바르게 사용하는 것은

보안뿐만 아니라 사용자 경험을 향상시키는 데에도 큰 도움이 됩니다.

 

실제 프로젝트에서 JWT를 적용하면서 알게 된 점은,

기술적인 이해도 중요하지만, 이를 활용해 안전하고 신뢰할 수 있는 시스템을 구축하는 것이 얼마나 중요한가를 다시금 깨닫게 되었습니다.

 

해당 내용이 지금 글을 읽고 계시는 분들에게도 큰 도움이 되길 바랍니다!

아좌자!

 

 

 

KB IT's Is Your Life 기자단 부트캠프 til