기타

JWT(JSON Web Token) 토큰이란??

호리둥절 2023. 4. 7. 15:38

🔒 인증(Authentication)  VS  인가(Authorization) 

인증

인증은 사용자가 자신이 주장하는 신원이 실제로 맞는지 확인하는 과정입니다. 이를 위해 사용자 이름과 비밀번호를 사용하여 로그인 폼에 인증 정보를 입력하는 것이 일반적입니다.

인증 방식에는 사용자 이름과 비밀번호, 바이오메트릭 인증(지문, 안면, 홍채 등), OAuth, SSO(Single Sign-On) 등이 있습니다.

인가

인가는 인증된 사용자가 요청한 자원에 대해 어떤 권한이 있는지 확인하는 과정입니다

 

예시)

  • 인증: 관리자 페이지에 접근하려면, 관리자 계정으로 로그인해야 합니다. 이때, 관리자는 사용자 이름과 비밀번호를 입력하여 자신이 맞는지를 인증합니다.
  • 인가: 관리자는 관리자 페이지에서 사용자 계정을 추가, 수정, 삭제할 수 있습니다. 이때, 권한에 따라 사용자 계정에 대한 읽기, 쓰기, 수정, 삭제 등의 권한이 부여됩니다. 따라서 관리자는 자신의 권한에 따라 사용자 계정을 관리할 수 있습니다.

🔑 Session 과  JWT(JSON Web Token)

👉 세션에 대하여 좀 더 자세히 알고 싶다면 아래의 링크를 클릭하세요.

https://develop-const.tistory.com/13

 

쿠키 vs 세션(cookie vs session)

공통점은 무엇일까? 쿠키와 세션은 모두 http 프로토콜에서 클라이언트와 서버가 상태를 유지하기 위해 사용되는 것입니다. 쿠키와 세션에 대해 알아보자 1. 쿠키 🍪 쿠키는 클라이언트 측에 저

develop-const.tistory.com

 

Session과 JWT(Json Web Token)는 둘 다 인증(Authentication) 및 인가(Authorization)에 사용되는 방식입니다. 하지만 두 방식은 사용 목적, 작동 방식, 장단점 등에서 차이가 있습니다.

💛 Session 

Session은 서버 측에서 사용자 상태를 유지하고 인증 정보를 저장하는 방식입니다. 사용자가 로그인을 하면, 서버는 사용자의 인증 정보를 세션(Session)에 저장하고 해당 세션 ID를 클라이언트에게 전달합니다. 클라이언트는 이후 서버에 요청을 보낼 때, 해당 세션 ID를 함께 전송하여 서버가 해당 사용자의 세션 정보를 확인하고 인증을 수행하게 됩니다.

 

Session의 장점

  • 보안성이 높습니다. 인증 정보를 서버 측에서 관리하기 때문에, 클라이언트에서 조작하거나 탈취하는 것이 어렵습니다.
  • 사용이 쉽습니다. 세션을 사용하면 서버 측에서 인증 정보를 관리하기 때문에, 클라이언트에서 인증 정보를 별도로 관리할 필요가 없습니다.

Session의 단점

  • 서버의 부하가 증가합니다. 사용자가 많아지면, 서버에서 세션 정보를 유지하기 위해 많은 자원이 소모됩니다.
  • 서버의 확장성이 떨어집니다. 서버에서 세션 정보를 유지하기 때문에, 서버를 확장하거나 분산시키는 것이 어렵습니다. 

💛 JWT

JWT는 인증 정보를 JSON 형태로 암호화하여 토큰(Token)으로 만든 다음, 해당 토큰을 클라이언트에게 전달하는 방식입니다. JWT 토큰에는 사용자의 인증 정보뿐만 아니라, 필요한 추가 정보(클레임(Claim))도 함께 포함될 수 있습니다. 클라이언트가 서버에 요청을 보낼 때, 해당 JWT 토큰을 함께 전송하여 서버가 해당 사용자의 인증 정보를 확인하고 인가를 수행하게 됩니다.

 

JWT의 장점

  • 서버의 부하가 적습니다. JWT는 클라이언트에서 인증 정보를 관리하기 때문에, 서버에서 세션 정보를 유지할 필요가 없습니다.
  • 서버의 확장성이 높습니다. JWT를 사용하면, 클라이언트에서 인증 정보를 관리하기 때문에 서버를 확장하거나 분산시키는 것이 용이합니다.

JWT의 단점

  • 보안성이 낮을 수 있습니다. JWT는 클라이언트에서 인증 정보를 관리하기 때문에, 클라이언트에서 토큰을 조작하거나 탈취하는 것이 가능합니다. 이러한 문제를 해결하기 위해, JWT는 토큰을 암호화하여 보안성을 강화할 수 있습니다.
  • 사용이 복잡합니다. JWT는 서버와 클라이언트 모두에서 인증 정보를 관리해야 하기 때문에, 구현하기가 어려울 수 있습니다.

 

어떤방식을 사용할지는 사용 목적과 요구사항에 결정되지만 보안이 중요한 경우 Session을 사용하는 것이 좋고, 서버의 부하를 줄이고 확장성을 높이는 것이 중요한 경우 JWT를 사용하는 것이 적합합니다. Session과 JWT를 함께 사용하는 방법도 있으며, 이를 hybird방식이라고 합니다.

🕶 JWT구조

JWT토큰의 구조를 확인해보고싶다면  아래의 사이트를 들어가서 직접 만들어보세요🌞

https://jwt.io/#debugger-io

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

[header].[payload].[signature]

 

[Header]

Header JWT 토큰의 헤더에는 두 가지 정보가 포함됩니다. 첫 번째는 토큰이 어떤 종류의 토큰인지를 나타내는 "typ"이라는 필드이고, 두 번째는 사용된 암호화 알고리즘을 나타내는 "alg"라는 필드입니다. 이러한 정보들은 Base64로 인코딩되어 있습니다.

const header = {
  alg: "HS256",
  typ: "JWT",
}

[Payload]

Payload JWT 토큰의 페이로드에는 사용자 정보와 같은 클레임(claim) 정보들이 들어갑니다. 클레임 정보는 이름과 값으로 구성되어 있으며, JWT에서는 미리 정의된 세 가지 종류의 클레임을 사용할 수 있습니다. 이들은 registered, public, private 클레임이며, 각각의 클레임은 다양한 정보를 담을 수 있습니다. Payload 역시 Base64로 인코딩되어 있습니다.

const payload = {
  id: 4
  email: "2_4_3_1@gmail.com",
  role: "admin",
}

[Signature] 암호와 방법

Signature JWT 토큰의 시그니처는 Header와 Payload를 합쳐서 암호화하는데 사용됩니다. 암호화 알고리즘은 Header에서 지정된 알고리즘을 따릅니다. 이러한 Signature는 헤더와 페이로드가 조작되지 않았다는 것을 검증하는 역할을 합니다.

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  
your-256-bit-secret

)

직접 jwt토큰을 만드는방법을 구현하는방법도 있지만 요즘에는 JWT 생성하는 라이브러리가 많이 존재하니 라이브러리를 사용하여 간단하게 JWT 토큰을 구현하면된다. 예를들어 npm에 jsonwebtoken이 있으니 이를 사용하여 토큰을 쉽게 구현하면 된다.

💔 JWT 토큰의 단점

JWT 토큰의 만료 및 갱신은 JWT의 단점 중 하나입니다. JWT의 토큰은 일단 발급되면 만료 전까지는 유효하기 때문에, 만료 전에 토큰을 잃어버리거나 탈취당할 경우 보안 문제가 발생할 수 있습니다.

 

이를 해결하기위한방법으로 Refresh Token 방식이 있습니다.

Refresh Token 방식은 access token과 별도로 발급되는 Refresh Token을 이용하여 access token의 만료시간이 지나갔을 경우 Refresh Token을 사용하여 access token을 갱신하는 방식입니다. Refresh Token은 access token보다 더 긴 유효기간을 가지며, access token 만료시 Refresh Token을 사용하여 access token을 재발급합니다. 이 방식을 사용하면 access token의 유효기간이 길어지는 것을 방지할 수 있습니다. 하지만 Refresh Token이 탈취당할 경우 보안 문제가 발생할 수 있으므로, 적절한 관리가 필요합니다.

 

😃다음 페이지에서 Refresh Token 과 access token에 대해 알아봅시다 😃

'기타' 카테고리의 다른 글

aws 인스턴스 고정 IP (탄력적 IP) 생성하기  (0) 2023.08.03
aws ec2 서버 생성하기  (0) 2023.08.03
git 명령어 모음  (0) 2023.08.02
쿠키 vs 세션(cookie vs session)  (0) 2023.04.07
파워쉘 보안 정책 문제해결  (0) 2023.04.05