Spring/Spring Boot

[Spring Boot] JWT(Json Web Token) - 웹의 안전한 인증 방식

JoonYong 2024. 2. 20. 18:04

 

JWT에 대하여 설명하기 이전에 Session / Cookie 방식과 Token 방식에 대하여 먼저 설명하겠습니다.

 

1. Session / Cookie 방식 vs Token 방식

사용자 인증 방식에는 크게 Session / Cookie 방식과 Token 방식이 있습니다.

1-1) Session / Cokie 방식

쿠키-세션 방식은 클라이언트와 서버 간에 세션 ID를 주고받으며 사용자 인증을 처리합니다. 로그인이 성공하면, 서버는 세션 ID를 생성하고 이를 클라이언트에게 전송합니다. 클라이언트는 이 세션 ID를 쿠키에 저장하고, 이후 요청마다 쿠키에 저장된 세션 ID를 함께 보내어 사용자 인증을 수행합니다.

이 방식의 장점은 상태를 유지하면서 사용자 인증을 처리할 수 있다는 것입니다. 하지만 서버 측에서 사용자의 세션 상태를 계속 유지해야 하므로 서버의 부하가 커질 수 있습니다.

 

1-2) Token 방식

토큰 방식은 서버가 사용자의 인증 정보를 토큰에 담아 클라이언트에게 전달하는 방식입니다. 클라이언트는 이 토큰을 저장하고, 이후 요청마다 토큰을 함께 보내어 사용자 인증을 수행합니다. JWT(Json Web Token)는 이 토큰 방식의 한 예입니다.

토큰 방식의 장점은 서버가 사용자의 상태를 유지할 필요가 없어 서버의 부담이 적다는 것입니다. 또한, 토큰은 클라이언트가 저장하므로 쿠키를 사용하지 않아도 되고, 이로 인해 쿠키 기반의 CSRF 공격을 피할 수 있습니다. 하지만 토큰이 탈취되면 그대로 사용자의 권한을 행사할 수 있으므로, 토큰의 안전한 관리가 필요합니다.

Authentication(인증) : 내가 누구인지 증명 ! 해주는 것.
Authorization(인가) : 음.. 너구나 ! ok 통과다

 


2. JWT(Json Web Token)란?

 

JWT는 JSON Web Token의 약자로, 두 개체 사이에서 정보를 안전하게 전송하기 위한 컴팩트하고 독립적인 방법을 정의한 웹 표준(RFC 7519)입니다. 정보는 디지털 서명되어 있어서, 정보의 신뢰성과 무결성이 보장됩니다.

JWT 는 C, Java, Python, C++, R, C#, PHP, JavaScript, Ruby, Go, Swift 등 대부분의 주류 프로그래밍 언어에서 지원됩니다.

 


3. JWT의 동작 흐름

 

 

  1. 사용자가 아이디와 비밀번호 혹은 소셜 로그인을 이용하여 로그인 요청을 보낸다
  2. 서버는 비밀키를 사용해 json 객체를 암호화한 JWT 토큰을 발급한다.
  3. JWT를 헤더에 담아 클라이언트에 보낸다.
  4. 클라이언트는 JWT를 로컬에 저장해놓는다.
  5. API 호출을 할 때마다 header에 JWT를 실어 보낸다.
  6. 서버는 헤더를 매번 확인하여 사용자가 신뢰한만한지 체크라고, 인증이 되면 API에 대한 응답을 보낸다.

4. JWT의 구조

 

JWT는 세 부분으로 구성되어 있습니다: 헤더(Header), 페이로드(Payload), 그리고 시그니처(Signature).

 

  • 헤더(Header): 헤더는 토큰의 타입과, 사용된 암호화 알고리즘을 포함하고 있습니다. 주로 JWT의 타입은 'JWT'이며, 암호화 알고리즘으로는 HMAC, RSA 등이 있습니다.
  • 페이로드(Payload): 페이로드는 클레임(Claim)이라는 선언된 데이터를 포함. 클레임은 이름과 값을 가지는 한 쌍의 데이터로, 사용자에 대한 정보나, 토큰의 만료 시간 등이 여기에 포함됩니다.
  • 시그니처(Signature): 시그니처는 헤더와 페이로드를 암호화한 값입니다. 이 시그니처는 서버에서 헤더와 페이로드를 검증하는 데 사용됩니다.

 

각 부분은 '.'(점)으로 구분되어 있어, 완전한 JWT 토큰은 'xxxx.yyyy.zzzz'와 같은 형태를 가집니다.

 

4-1) JWT -> JSON

JWT를 JSON으로 디코딩을 해주면 header, payload, signature 부분으로 나온다.

signature부분에 비밀번호 역할을 하는 Secret 값이 들어가는데, 이 부분이 일치하지 않으면 해당 데이터에 접근을 할 수 없도록 깨진다.

 


5. JWT의 장점과 단점

  • 장점: 상태를 저장하지 않아도 되므로 서버의 부하를 줄일 수 있습니다. 또한, 쿠키를 사용하지 않아도 되므로 CSRF 공격에 대한 방어가 가능합니다.
  • 단점: 토큰이 탈취당하면 사용자의 권한을 행사할 수 있으므로, 토큰의 보안 관리가 중요합니다.

6. Access Token & Refresh Token

Access 토큰Refresh 토큰JWT 토큰 기반으로 구현됩니다. 즉, JWT 토큰Access 토큰Refresh 토큰을 포함하는 포괄적인 개념이라고 생각하면 됩니다.

JWT 토큰만 사용하는 방식과 JWT 토큰 개념으로 Access 토큰Refresh 토큰을 사용하는 두 가지 방식이 있습니다.

 

Access Token과 Refresh Token에 대한 자세한 내용은 아래 링크에 정리되어 있습니다.

 

[Spring Boot] Access Token & Refresh Token

1. JWT 비밀키 탈취 JWT 토큰은 우리가 서버와 클라이언트 간에 안전하게 정보를 주고받을 수 있게 해주는 열쇠와 같습니다. 이 열쇠는 사용자의 신원이나 권한 같은 중요한 정보를 담고 있습니다.

achieve-dev.tistory.com

 

 

[Reference]

https://velog.io/@chuu1019/%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-JWTJson-Web-Token

https://ocblog.tistory.com/56