Spring Security에서 지원하는 폼 로그인 방식은 기본적으로 서버 측 세션을 이용해 상태를 유지하는 방식으로 REST API를 이용하는 CSR방식의 백엔드 서버와는 안맞는다.
그래서 REST API 통신을 사용하는 백엔드 서버에서 사용하기 적합한 자격 증명 방식 중 가장 활용도가 높은 JWT를 정리해보려한다.
데이터를 안전하고 간결하게 전송하기 위해 고안된 인터넷 표준 인증 방식으로, 토큰 인증 방식에서 가장 범용적으로 사용된다.
JSON 포맷의 토큰 정보를 인코딩한 뒤, 인코딩 된 토큰 정보를 Secret Key로 서명한 메시지를 Web Token으로써 인증하는 과정에 사용한다.
JWT는 보통 두가지 종류의 토큰을 사용자의 자격 증명에 이용한다.
액세스 토큰(Access Token)
: 보호된 정보들(이메일, 연락처, 사진 등)에 접근할 수 있는 권한 부여에 사용된다.
(탈취되더라도 오랫동안 사용할 수 없도록 비교적 짧은 유효기간을 준다.)
리프레시 토큰(Refresh Token)
:Access Token의 유효기간이 만료된다면 Refresh Token을 사용해서 새로운 Access Token을 발급받는다. 이때, 사용자는 다시 로그인 인증을 할 필요가 없다.

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에 대해 단방향 암호화를 수행한다.
이렇게 암호화된 메시지는 토큰의 위변조 유무를 검증하는 데 사용된다.
1) 상태를 유지하지 않고(Stateless), 확장에 용이한 (Scalable) 애플리케이션을 구현하기에 용이하다.
아 이거 수업시간에 얼핏 들었던거같은데 너무 얼핏이라서 흐린눈뜨고 읽고 넘겨요~~~^^;;