[Spring Security] JWT 인증

정동아·2023년 7월 13일

백엔드 부트캠프

목록 보기
40/41

Spring Security에서 지원하는 폼 로그인 방식은 기본적으로 서버 측 세션을 이용해 상태를 유지하는 방식으로 REST API를 이용하는 CSR방식의 백엔드 서버와는 안맞는다.

그래서 REST API 통신을 사용하는 백엔드 서버에서 사용하기 적합한 자격 증명 방식 중 가장 활용도가 높은 JWT를 정리해보려한다.


JWT (JSON Web Token)란?

데이터를 안전하고 간결하게 전송하기 위해 고안된 인터넷 표준 인증 방식으로, 토큰 인증 방식에서 가장 범용적으로 사용된다.
JSON 포맷의 토큰 정보를 인코딩한 뒤, 인코딩 된 토큰 정보를 Secret Key로 서명한 메시지를 Web Token으로써 인증하는 과정에 사용한다.

JWT는 보통 두가지 종류의 토큰을 사용자의 자격 증명에 이용한다.

  • 액세스 토큰(Access Token)
    : 보호된 정보들(이메일, 연락처, 사진 등)에 접근할 수 있는 권한 부여에 사용된다.
    (탈취되더라도 오랫동안 사용할 수 없도록 비교적 짧은 유효기간을 준다.)

  • 리프레시 토큰(Refresh Token)
    :Access Token의 유효기간이 만료된다면 Refresh Token을 사용해서 새로운 Access Token을 발급받는다. 이때, 사용자는 다시 로그인 인증을 할 필요가 없다.

JWT 구조

JWT는 .으로 세부분이 나누어져있다.

1) Header
: Header는 이게 어떤 종류의 토큰인지, 어떤 알고리즘으로 Sign할지 정의한다.

{ //JWT니까 JSON 포맷 형태로 정의 
  "alg": "HS256",
  "typ": "JWT"  
}

이 JSON객체를 base64 방식으로 인코딩하면 JWT의 첫번째부분이 완성된다.

2) Payload
Payload에는 서버에서 활용할 수 있는 사용자의 정보가 담겨있다.
어떤 정보에 접근 가능한지에 대한 권한을 담을 수도있고, 사용자의 이름 등 필요한 데이터를 담을 수도 있다.
( payload는 Signature를 통해 유효성이 검증될 정보이긴 하지만, 민감한 정보는 담지 않는게 좋다. )

{
  "sub": "someInformation",
  "name": "phillip",
  "iat": 151623391
}

1)에서 처럼 이 JSON객체를 base64 방식으로 인코딩하면 JWT의 두번째부분이 완성된다.

3) Signature

base64로 인코딩 된 첫번째와 두번째 부분이 완성되었으면, Signature에서는 원하는 비밀 키와 Header에서 지정한 알고리즘을 사용해서 Header 와 Payload에 대해 단방향 암호화를 수행한다.
이렇게 암호화된 메시지는 토큰의 위변조 유무를 검증하는 데 사용된다.

JWT를 통한 인증의 장점

1) 상태를 유지하지 않고(Stateless), 확장에 용이한 (Scalable) 애플리케이션을 구현하기에 용이하다.

  • 서버는 클라에 대한 정보를 저장할 필요가 없다. (토큰이 정상적으로 검증되는지만 판단하면 되기 때문에)

2개의 댓글

comment-user-thumbnail
2023년 8월 4일

아 이거 수업시간에 얼핏 들었던거같은데 너무 얼핏이라서 흐린눈뜨고 읽고 넘겨요~~~^^;;

1개의 답글