본문 바로가기
카테고리 없음

Spring JWT

by 차리하루일기 2024. 10. 10.

JWT - Json Web Token 

정보를 비밀리에 전달하거나 인증할 때 주로 사용하는 토큰으로, Json 객체를 이용함. 

 

Json포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. 즉, 토큰의 한 종류라고 생가하면 된다.  일반적으로 쿠키 저장소를 사용하여 JWT를 저장한다. 

 

JWT 사용 이유 

  • 서버가 1대 인 경우  vs  서버가 2대 이상인 경우  vs  세션 저장소 생성  vs  jwt 사용

1) 서버가 1대인 경우  

Session 1이 모든 Client 의 로그인 정보를 소유하고 있다. but 대부분의 회사는 서버망이 크기 때문에 사용할 확률 낮음.

 

2) 서버가 2대 이상인 경우

서버의 대용량 트래픽 처리를 위해 서버 2대 이상 운영이 필요할 수 있다. 

서버 2대 이상인 경우

Session을 다음과 같이 Client 로그인 정보를 가진다고 가정,

Session 1 = Client 1, 2, 3

Session 2 = Client 4

Session 3 = Client 5, 6

 

만약, Client 1 의 로그인 정보를 가지고 있지 않은 Server 2, 3 에 API 요청을 하게 되면 문제가 발생하지 않을까? 

해결방법) 

Sticky Session :Client 마다 요청 Server를 고정한다

세션 저장소를 생성하여 모든 세션을 저장한다. 

 

세션 저장소를 사용한 경우

3) 세션 저장소 생성

Session Storage 가 모든 Client의 로그인 정보를 소유하고 있기 때문에 모든 서버에서 모든 Client의 API 요청을 처리할 수 있다. 

 

 

4) JWT 사용 

로그인 정보를 Server에 저장하지 않고, Client에 로그인 정보를 JWT로 암호화하여 저장 

JWT 를 통해 인증 / 인가

jwt 사용

모든 서버에서 동일한 Secret Key 소유 

Secret Key 톨한 암호화 / 위조 검증 (복호화 시) 

 

JWT 장/ 단점 

1) 장점.

동시 접속자가 많을 때 서버 측 부하 낮춤

client , Server가 다른  도메인을 사용할 때, ex) 카카오 OAuth2 로그인 시 JWT Token 사용 

 

2) 단점.

구현의 복잡도 증가

JWT에 담는 내용이 커질 수록 네트워크 비용 증가 (클라이언트 -> 서버)

기 생성된 JWT 를 일부만 만료시킬 방법이 없음

Secret Ket 유출 시 JWT 조작 가능. 

 

JWT의 구성 요소

Header, Payload, Signature 세 파트로 구성. 

 

aaaaa,bbbbb,ccccc  

 

헤더 (Header)

어떠한 알고리즘을 암호화 할 것인지, 어떠한 토큰을 사용할 것인지에 대한 정보가 들어있음. 

 

정보 (Payload)

전달하려는 정보 (사용자 id나 다른 데이터들, 이거들을 클레임이라고 부른다) 가 들어있음.

Payload에 있는 내용은 수정이 가능, 더 많은 정보를 추가할 수 있으나, 노출과 수정이 가능한 지점이기 때문에 

인증에 필요한 최소한의 정보만 담아야 한다. (이 토큰을 가졌을 때 권한의 범위나 토큰의 발급일과 만료일자 등)

 

서명(Signature)

가장 중요한 부분, 헤더와 정보를 합친 후 발급해 준 서버가 지정한 secret key로 암호화 시켜 토큰을 변조하기 어렵게 만들어 줌. 

ex) 토큰이 발급된 후 누군가가 Payload의 정보를 수정하면 Payload에는 다른 누군가의 조작된 정보가 들어가 있지만, Signature에는 수정되기 전의 Payload 내용을 기반으로 이미 암호화된 결과가 저장되기 때문에 

Payload와는 다른 결과값이 나옴. 

이러한 방식으로 비교하면 서버는 토큰이 조작되었는지 아닌지를 쉽게 알 수 있고, 다른 누군가는 조작된 토큰을 악요하기가 어려워짐. 

 

JWT 동작원리 

1. 사용자가 id와 pw 를 입력하여 로그인 요청을 한다. 

2. 서버는 회원 DB에 들어가 있는 사용자이니지 확인을 한다. 

3. 확인이 되면 서버는 로그인 요청 확인 후, secret key 를 통해 토큰을 발급한다. 

4. 이것을 클라이언트에 전달한다. 

5. 서비스 요청과 권한을 확인하기 위해서 헤더에 데이터 (JWT)요청을 한다. 

6. 데이터를 확인하고 JWT에서 사용자 정보를 확인한다.

7. 클라이언트 요청에 대한 응답과 요청한 데이터를 전달해 준다.