JWT(JSON Web Token)를 공부하며: 개념부터 Spring에서의 활용까지

이상민·2024년 8월 22일
0

강의를 보며 JWT(JSON Web Token)라는 개념을 접하게 되었는데,웹 애플리케이션에서 사용자 인증을 처리하는 방법 중 하나로 굉장히 많이 사용되고 있더라고요.

그래서 저도 한번 공부해보고, 정리해보는 시간을 가져보았습니다.

JWT란 무엇일까?

JWT는 웹 애플리케이션에서 사용자 인증과 권한 부여에 자주 사용되는 토큰 기반 인증 방식이라고 해요. 제가 이해한 바로는, 클라이언트와 서버가 서로 안전하게 정보를 주고받을 때 쓰이는 일종의 디지털 서명된 데이터라고 할 수 있습니다.

JWT는 크게 세 가지 부분으로 나뉘는데요:

  • 헤더(Header): 토큰의 타입과 암호화 알고리즘을 담고 있어요.
  • 페이로드(Payload): 사용자의 정보나 클레임(claim)을 포함합니다.
  • 서명(Signature): 이 토큰이 변조되지 않았다는 걸 보증하는 역할을 해요.

이 세 가지가 결합되어 만들어진 문자열이 바로 JWT예요. 예를 들어:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

이런 식으로 .으로 구분된 세 부분이 합쳐져 있는 게 JWT입니다. 암호화된 정보라서 쉽게 읽을 수는 없지만, 이 안에 사용자 정보와 서명이 들어 있다는 거죠.

JWT가 어떻게 쓰일까?

이제 JWT가 무엇인지 알았으니, 어디에 어떻게 쓰일 수 있는지 궁금해서 알아보았습니다. 생각보다 다양한 상황에서 쓰이더라고요!

1. 웹 애플리케이션 로그인
사용자가 로그인하면 서버에서 JWT를 발급해줘요. 클라이언트는 이 토큰을 저장해 두었다가 이후 요청할 때마다 서버에 보냅니다. 서버는 토큰을 확인해서 사용자를 인증해주죠. 예를 들어 쇼핑몰에서 로그인을 하고 계속해서 상품을 주문할 때마다 다시 로그인할 필요가 없게 하는 방식이에요.

2. API 인증
RESTful API와 같은 곳에서도 JWT가 많이 쓰입니다. 클라이언트가 API를 호출할 때마다 JWT를 함께 보내면, 서버는 그 토큰을 확인해 인증을 처리합니다. 서버가 별도로 세션을 관리할 필요가 없어서 확장성이 뛰어난 장점이 있어요.

3. 싱글 사인온(SSO)
한 번 로그인하면 여러 시스템에서 그 인증 정보를 공유할 수 있게 해주는 SSO에서도 JWT가 자주 사용됩니다. 예를 들어, 구글 계정 하나로 여러 구글 서비스(Gmail, YouTube 등)에 한 번에 로그인할 수 있는 방식이죠.

4. 모바일 앱
모바일 앱에서도 JWT가 많이 사용되는데, 서버와의 통신에서 세션을 유지하기보다는 토큰으로 인증을 처리하는 게 더 간편하고, 확장성도 좋기 때문입니다.

Spring에서 JWT 다루기

저가 주력으로 사용할 프레임워크인 Spring Boot에서 JWT를 어떻게 사용하는지, 기본적인 흐름을 개념적으로 알아보았습니다.

1. JWT 의존성 추가
먼저, 프로젝트에서 JWT와 Spring Security를 사용하려면 관련 라이브러리를 추가해야 해요. Spring Boot에는 기본적으로 보안 기능이 포함되어 있어서, 필요한 의존성을 추가하는 것만으로 JWT 기반의 인증을 구현할 수 있습니다.

2. JWT 생성
JWT는 사용자가 로그인했을 때 서버에서 생성돼요. 사용자가 로그인에 성공하면 서버는 그 사용자의 정보를 바탕으로 JWT를 발급합니다. JWT는 암호화된 문자열로, 사용자 ID 같은 중요한 정보가 담겨 있어요. 또한, 이 JWT는 만료 시간이 포함되기 때문에 일정 시간이 지나면 더 이상 유효하지 않게 설정할 수 있습니다.

3. JWT 저장
클라이언트(예: 브라우저 또는 모바일 앱)는 서버에서 받은 JWT를 로컬 스토리지나 쿠키에 저장합니다. 이후 클라이언트가 서버에 요청할 때마다 이 JWT를 함께 보내 사용자 인증을 유지하게 됩니다. 특히 API 호출 시에는 JWT를 요청의 헤더에 포함시키게 되죠.

4. JWT 검증
서버는 클라이언트가 보내온 JWT를 받아서 그 토큰이 유효한지 검증합니다. 이때, JWT가 변조되지 않았는지, 만료되지는 않았는지 등을 확인하게 되죠. 유효한 JWT라면, 서버는 이 토큰을 통해 사용자 정보를 확인하고 요청을 처리할 수 있어요. 만약 토큰이 유효하지 않다면 서버는 인증되지 않은 사용자로 간주하고 요청을 거부하게 됩니다.

5. JWT를 사용한 인증 흐름
Spring Security에서는 이 JWT를 매번 검증하는 과정이 자동으로 이루어져요. 먼저, 사용자가 요청을 보낼 때마다 요청 안에 JWT가 포함되는지 확인하고, 포함되어 있다면 그 JWT를 해석해 사용자의 정보를 추출합니다. 그 정보를 바탕으로 인증된 사용자인지 확인하는 작업을 거쳐야 하죠.

6. Spring Security 설정
JWT는 일반적인 세션 기반 인증 방식과는 다르게 동작해요. 그래서 Spring Security 설정에서 세션을 사용하지 않고 JWT로 인증하는 무상태(stateless) 방식으로 설정해야 합니다. 이는 서버가 매번 클라이언트의 JWT를 확인해 사용자를 인증하는 구조라서 서버가 별도의 세션 상태를 유지할 필요가 없기 때문이에요.

7. 최종 인증 처리
클라이언트가 JWT를 포함해서 서버에 요청을 보내면, 서버는 JWT의 유효성을 검증하고, 그 토큰이 유효하다면 요청을 처리합니다. 예를 들어, API 요청이라면 서버는 JWT 안에 포함된 사용자 정보를 바탕으로 해당 사용자가 요청한 리소스에 접근할 수 있는 권한이 있는지 확인한 후 요청을 완료합니다.

요약

1. JWT 생성:
사용자가 로그인하면 서버는 JWT를 발급합니다.

2. JWT 저장:
클라이언트는 JWT를 저장하고, 이후 요청마다
서버에 JWT를 포함해 전송합니다.

3. JWT 검증:
서버는 요청에 포함된 JWT가 유효한지 확인하고, 유효하면 해당 사용자를 인증합니다.

4. 무상태 인증:
Spring Security에서 JWT 기반의 인증은 세션을 사용하지 않고 무상태 방식으로 동작합니다.

정리

  • JWT (JSON Web Token): 사용자 인증 및 권한 부여를 위해 사용하는 토큰 기반의 인증 방식.

  • 구성 요소: JWT는 헤더(Header), 페이로드(Payload), 서명(Signature)의 세 부분으로 구성되며, .으로 구분된 문자열 형태로 사용됨.

  • 토큰 발급: 서버가 사용자가 인증되면 JWT를 생성하고 클라이언트에게 제공.

  • 토큰 저장 및 전송: 클라이언트는 JWT를 저장하고 이후 서버에 요청할 때 JWT를 포함하여 전송.

  • 토큰 검증: 서버는 클라이언트가 보낸 JWT의 무결성(변조 여부)과 유효 기간을 검증하여 사용자를 인증함.

  • 무상태 인증: 서버는 세션을 유지하지 않고 JWT로 사용자 인증을 처리해 확장성과 보안성을 높임.

마무리

오늘 JWT에 관해 알아보면서 토큰 기반으로 인증을 해서 서버가 상태를 유지할 필요 없이, 인증 정보를 안전하게 전달하고 검증할 수 있게 함으로써, 서버 부담이 감소하도록 만들어주는 장점이 있다는 점을 배울 수 있어서 유익한 시간이였다.

profile
안녕하세요

0개의 댓글