본문 바로가기
AWS/EKS

[AEWS2] 6-1. JWT 란?

by okms1017 2024. 4. 13.
728x90

✍ Posted by Immersive Builder  Seong

 

JWT(Json Web Token)

Json 포맷의 데이터를 네트워크를 통해서 서로 다른 장치끼리 안전하게 전송하기 위한 방법입니다. 

 

  • Header, Payload(claims), Signature 3가지 구성요소로 이루어집니다. 
  • Header에는 타입(JWT)과 Signature에 적용된 암호화 알고리즘이 표기됩니다. ex) HS256 
  • Payload 내에 Json 포맷의 데이터가 담깁니다. 
  • Signature는 Payload의 무결성을 검증하는 고유한 값입니다. 
  • Header, Payload, Signature를 각각  Base64 방식으로 인코딩하여 '.' 으로 연결한 텍스트가 바로 JWT입니다.  

 

Signature

클라이언트 또는 서버 단에서 JWT가 유효한지 확인하기 위해 Signature(디지털 서명)을 사용하여 검증합니다. 

 

Signature는 Header와 Payload를 결합한 후 암호화 알고리즘과 비밀키를 적용하여 생성한 값입니다. 

JWT를 전달받은 입장에서는 Header와 Payload를 동일한 알고리즘과 비밀키를 적용하여 재구성한 값과 Signature 값을 비교하여 일치 여부를 확인하며, 일치하였을 경우 데이터의 위변조가 발생하지 않았음을 검증하게 됩니다. 

 

JWT 활용 분야

  • Authentication(인증) => 활용 사례 ↑
  • Authorizaion(인가) 
  • Information Exchange(정보 공유) 
  • SSO(Single Sign-On) 
  • Server to Server Communication(서버 간 통신) 

 

Authentication: Session vs JWT 

1. Cookie-based Session Management

 

1) 사용자가 로그인을 시도합니다. 

2) 서버는 DB를 조회하여 사용자 정보를 확인합니다. 

3) 사용자 ID(user_id)와 임시비밀번호(session_id)를 별도의 Session Table에 저장합니다. 

4) 서버는 세션 정보를 쿠키에 담아 사용자에게 반환합니다. 

5) 세션 정보는 브라우저에 저장되고 사용자가 접속할 때마다 서버로 전송됩니다. 

 

쿠키와 비교하여 사용자의 민감정보가 담기지 않으므로 보안상 이점이 있습니다.

처음 로그인 이후 DB를 조회하지 않고 세션을 유지할 수 있는 장점이 있습니다. 

 

반면, 사용자가 접속할 때마다 Session Table을 조회해야 하는 부분과

사용자가 새로운 장치로 접속할 때마다 세션 정보를 재생성하기 때문에 Session Table이 쌓이는 단점이 있습니다. 

 

2. JWT Authentication 

 

1) 사용자가 로그인을 시도합니다. 

2) 서버는 DB를 조회하여 사용자 정보를 확인합니다. 

3) 서버는 Payload에 암호화 알고리즘과 비밀키를 적용하여 Signature를 생성합니다. 

4) 그리고 암호화 알고리즘을 Header에 기록합니다. 

5) Header, Payload, Signature를 Base64로 인코딩하여 JWT를 생성합니다. 

6) 서버가 발급한 JWT는 브라우저에 저장됩니다. 

7) 사용자가 다시 인증을 시도할 때 JWT가 서버로 전송됩니다. 

8) 서버는 JWT를 Base64로 디코딩합니다. 

9) 디코딩한 Header와 Payload를 결합한 후 암호화 알고리즘과 비밀키를 적용하여 서명을 합니다. 

10) 서명한 값과 Signature를 비교하여 일치 여부를 확인합니다. 

11) 인증을 처리합니다. 

 

JWT는 어플리케이션에서 자주 필요로 하는 정보를 Payload에 담아두기 좋습니다. 

즉, 해당 정보를 가져오기 위해 서버에 다시 접속하지 않아도 되기 때문에 그만큼 서버의 부담을 덜 수 있습니다. 

 

JWT는 로그인 시 처음 한 번만 DB를 조회하므로 DB에 부하가 걸리지 않습니다. 

그리고 JWT 토큰만으로 인증을 처리하므로 별도의 Session Table이 필요하지 않습니다. (조회x, Refresh x)

 

JWT 실습

Payload의 "name" claim 값(seong)을 입력하고 비밀키를 적용(seong_pw)하여 JWT를 생성해보겠습니다. 

JWT 토큰의 인코딩된 값은 "eyJhb***.eyJzd***.yPK0H***" 입니다. 

 

JWT Encoding

 

다시 페이지를 리로드하여 JWT 토큰을 넣으면 "Invalid Signature"라는 문구가 뜹니다. 

그 이유는 Signature 값을 아직 검증하지 않았기 때문입니다. 

 

JWT Decoding

 

그럼 비밀키를 적용(seong_pw)하여 서명해보겠습니다. 

이제 정상적으로 인증 처리 "Signature Verified" 된 모습입니다. 

 

JWT Signature Verified

 

끝.

 


[출처] 

1) https://jwt.io/introduction

 

JWT.IO

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

jwt.io

2) 생활코딩, JWT 강의 

 

728x90

'AWS > EKS' 카테고리의 다른 글

[AEWS2] 6-3. EKS IRSA & Pod Identity  (0) 2024.04.13
[AEWS2] 6-2. EKS Authentication & Authorization  (0) 2024.04.13
[AEWS2] 5-2. Karpenter  (1) 2024.04.07
[AEWS2] 5-1. EKS AutoScaling  (1) 2024.04.07
[AEWS2] 4-2. Prometheus & Grafana  (0) 2024.03.31