본문 바로가기
Programming/Spring Boot

[Spring Boot] JWT

by 공부합시다홍아 2024. 5. 30.
 

[Spring Boot] Spring Security

스프링 시큐리티스프링 시큐리티는 스프링에 login을 처리하는 모듈이다.같은 시큐리티 기반이라도 코딩이 버전별로, 로그인방식에 따라 모두 다르다.시큐리티는 방대한 스프링 모듈이다. 로그

hong-study.tistory.com

이전까지 Spring Security에 대해서 어떻게 구성되어 있고, 어떻게 구현하는지에 대해서 공부를 하였다.
오늘은 Spring JWT에 대해서 공부하려고 한다.


JWT, Json Web Token

  • JWT는 유저를 인증하고 식별하기 위한 토큰 기반 인증이다.
  • 토큰 자체에 사용자의 권한 정보나 서비스를 용하기 위한 정보가 포함된다.
  • Restful과 같은 무상태(Stateless)인 환경에서 사용자 데이터를 주고 받을 수 있게 된다.
  • 세션(Session)을 사용하게 될 경우 쿠키 등을 통해 사용자를 식별하고 서버에 세션을 저장했지만,
    토큰을 클라이언트에 저장하고 요청시 HTTP 헤더에 토큰을 첨부하는 것만으로도 단순하게 
    데이터를 요청하고 응답받을 수 있다.

JWT의 구조

JWT는 세 개의 부분으로 구분되고, 각 부분은 점으로 표현한다.

출처 : BizSpring

(1). Header

  • 서명을 할 때 사용하는 키, 사용할 타입, 서명 암호화 알고리즘에 대한 정보가 담겨있다.

출처 : BizSpring

  • 키 : 서명 시 사용하는 키 (Public / Private Key) 식별 값
  • 사용할 타입 : 토큰 유형
  • 알고리즘 : HS256, HS512, RS256, ES256 등

(2). Payload 

  • 토큰에서 사용할 정보의 조각들인 Claim이 담겨있다.
  • 클레임은 Key/Value 형태로 된 값을 가진다.
  • 저장되는 정보에 따라 등록된 클레임, 공개 클레임, 비공개 클레임으로 구분된다.

  • iss : 토큰 발급자 
  • sub : 토큰 제목 
  • iat : 토큰 발급 시간
  • exp : 토큰 만료 시간
  • roles : 권한

(3). Signature

  • Header에서 정의한 알고리즘 방식을 활용한다.
  • Header + Payload와 서버가 갖고 있는 유일한 Key 값을 합친 것을 헤더에서 정의한 알고리즘으로 암호화한다.


세션 방식과 JWT 방식의 차이

세션방식의 동작 구조

  • 쉽게 접근하면 롯데월드 입장 티켓을 예시로 설명한다.
  • 고객(사용자)이 입장 티켓을 직원(서버)에게 구매한다.
  • 직원(서버)는 해당 티켓의 정보를 본인의 PC에 저장하고, 고객(사용자)의 ID만 생성해 보낸다.
  • 그러면 고객(사용자)는 티켓의 ID를 개인의 지갑(쿠키 저장소)에 넣어둔다.
  • 다음에 사용할 때, 고객(사용자)는 이전에 구매헀던 티켓을 직원(서버)에게 보여주는데,
  • 직원(서버)는 이전에 저장한 정보를 기반으로, 회원이 맞는 지 조회하고 입장을 허락한다.

JWT 동작 구조

  • JWT 또한 똑같이 롯데월드 입장티켓을 예로 들겠다.
  • 고객(사용자)는 직원(서버)에게 입장 티켓을 구매한다.
  • 직원(서버)는 고객에 대한 정보를 담고 있는 입장권(JWT)를 생성한다.
  • 직원(서버)는 고객에 대한 정보가 담긴 입장권(JWT)를 전달한다.
  • 고객은 입장권은 개인의 지갑(Session Storage)에 넣어둔다.
  • 이후에 입장 티켓을 사용하려고 할 때, 고객의 정보가 담긴 입장권(JWT)를 직원(서버)에게 전달한다.
  • 직원(서버)는 고객의 정보가 담긴 입장권(JWT)를 유효성 검사를 하고, 결과를 전달한다.

위 과정을 통해 알 수 있는 것은 입장권을 누가? 관리하는 가 이다.

세션의 경우, 고객에 대한 정보는 롯데월드에서 관리하고 고객은 본인의 개인 ID만 보유하지만
JWT의 경우, 고객에 대한 정보를 고객이 관리하고, ID만 롯데월드에서 관리한다.


JWT 장점

위의 예시를 보았다면, JWT의 장점에 대한 정보를 하나는 생각할 수 있을 것이다.

  • 세션 기반 인증은 서버가 세션 저장소를 가지고 있고 찾는 과정을 거친다. 
  • 토큰 기반 인증은 입장권 관리클라이언트가 하고, 검사만 하기 때문에 서버에 부담을 덜어준다.
  • 서버가 달라도 개인 정보를 클라이언트에게 관리하기 때문에 사용이 가능하다.

JWT 단점

  • 가장 큰 단점은 탈취의 위험이라고 할 수 있다.
  • 입장권을 클라이언트에서 관리하기 때문에 JWT의 구조 중 끝에 특이한 내용을 붙여서 사용자들에게 혼동을 준다.

위의 단점을 극복하기 위해서 JWT의 구조 중 Sigature에 들어갈 보안 알고리즘들이 추가 되었다.


JWT는 RSA 공개키 암호화(비대칭키) 또는 HMAC SHA256 방식을 사용한다.

대칭키 암호화 방식

  • 하나의 비밀키를 양쪽(client & server)가 모두 같이 사용한다.
  • 암호화와 복호화에 사용하는 키가 같은 암호화 알고리즘

장점으로는 속도가 빠르다라는 장점이 있지만, 비밀키 하나만 알게되면 해커가 암호화된 모든 정보에 대해 알 수 있는 상당히 큰 취약점을 가지고 있다.

출처 : https://pilyeooong.tistory.com/entry/SSH란

예를 들면, 실제로 이전 진주만 전쟁때, 미국이 일본에 원자 폭탄을 투하하기 이전에 일본은 단순한 통신 방식을 가지고 있었다. 이를 미국이 역이용하여, 일본의 암호화된 통신 방식을 풀어내 일본 전투함의 위치를 찾아 격퇴한 기록이 있다.
이것이 대칭키 암호화 방식의 엄청난 취약점이 이미 역사로 들어난 사실인 것이다.


비대칭키 암호 ( 공개키 암호화 )

  • 비밀키 하나 만 가지는 대칭키 암호 방법과 달리, 공개키와 비밀키 두 개가 존재한다.
  • 공개키 암호를 구성하는 알고리즘을 대칭키 암호 방식과 비교하여 비대칭 암호라고 불린다.
  • 암호화와 복호화에 사용하는 키가 서로 다르다.
  • 암호화할 때의 키는 공개키(public key), 복호화할 때의 키는 개인키(private key)를 가진다.
  • 공개키는 누구나 알 수 있지만, 그에 대응하는 비밀키는 키의 소유자만이 알 수 있어서 특정한 비밀키를 가지는 사용자만이 내용을 열어볼 수 있도록 하는 방식

출처 : https://pilyeooong.tistory.com/entry/SSH란

Public Key 누구에게나 공개될 수 있으며 메세지를 보내는 발신자는 공개키를 통해 정보를 암호화한다.
Private Key 수신자는 비밀키를 암호화된 메세지를 복호화 하는데 사용한다. 외부에 노출되지 않도록 안전하게 보관한다.

예를 들면 구글을 들 수 있다.

구글은 오직 구글만 가지고 있는 개인키를 가지고 있다. 그리고 공개키는 누구나 가질 수 있게 공개한다.
공개키는 탈취 당해도 개인키만 지켜내면 복호화할 수 없기 때문에 보안이 매우 높다.

RSA 비대칭키 암호화 방식

단점은 해커가 양쪽 공개키를 둘 다 탈취해서 중간에 전송되는 메세지를 변형(위조) 시킬 수 있다.
비밀키는 뺏기지 않지만, 공개키만 탈취한다.


위의 모든 문제점들을 해결하기 위해 나온 것이 전자 서명(공인 인증) 이다.

RS256 ( RSA + SHA256(JWT웹토큰) )

비대칭키 방식

너의 공개키로 암호화하고, 평문 뒤에 나의 개인키로 "내가 사용했어"라고 서명한다.

  • 사용자(A)는 쿠팡(B)의 공개키로 평문을 암호화한다.
  • 사용자(A)는 사용자(A)의 개인키로 평문+개인키(내가 사용자야) 서명한다.
  • 쿠팡(B)은 쿠팡(B)의 개인키를 이용해서 복호화한다.
  • 쿠팡(B)은 사용자(A)의 공개키를 이용하여 서명을 검증한다. ( 위조 여부 판단 ) 

HS256 ( HMAC + SHA256)

대칭키 방식

서로 비밀키를 공유하고, 평문 뒤에 비밀키로 "내가 사용했어"라고 서명한다.

  • 사용자(A)와 쿠팡(B)는 나만 알고 있는 비밀 값을 서로 공유한다.
  • 사용자(A)는 평문 + 나만 알고 있는 비밀 값을 서명한다.
  • 사용자(A)는 암호화(평문 + 나만 알고있는 비말 값)로 암호화 한다.
  • 쿠팡(B)는 암호화(평문 + 나만 알고 있는 비밀 값)로 똑같이 암호화 한다.
  • 두 개가 같다면 위조되지 않고, 해킹 당하지 않는다.

이렇게 하더라도 지속적으로 기술이 발달함에 따라 해커들의 수준이 많이 올라간다.

이를 해결하고자 근래 기업에서는 대칭키 + 비대칭키를 둘 다 사용해 암호화하는 보안정책을 펼친다.

RSA 방식 + 디피헬만 알고리즘

비대칭 방식임은 동일하다.
디피헬만 알고리즘을 이용해 서버, 클라이언트는 동일한 비밀키(세션키)를 생성한다.
이제 서버, 클라이언트는
비밀키(세션키) 둘 다 가지고 있다.
비밀키(세션 키)를 사용하여 암호화 전송을 한다.(대칭키 암호화)

 

728x90