범위 9장 - JWT로 로그인/로그아웃 구현하기

 

세션 기반 인증

- 세션을 사용하는 인증방법

- 사용자마다 사용자의 정보를 담은 세션을 생성하고 저장해서 인증한다.

- 스프링 시큐리티의 기본 인증 방법

/*

  - 세션 기반 인증과 서버 기반 인증은 일반적으로 비슷한 의미로 사용되는 용어

  - 세션 기반 인증은 주로 웹 애플리케이션에서 사용되는 용어로, 사용자의 상태를 서버 측에서 관리하며 세션 ID를 사용하여 사용자를 식별 하는 방식.

  - 서버 기반 인증은 더 일반적인 용어로, 어떤 형태의 인증이 서버 측에서 처리된다는 의미

*/

 

토큰 기반 인증

- 토큰을 사용하는 인증방법

- 토큰: 서버에서 클라이언트를 구분하기 위한 유일한 값

- 서버가 토큰을 생성해서 클라이언트에 제공 -> 클라이언트는 갖고있다가 여러 요청을 이 토큰과 함께 신청 -> 서버는 토큰을 보고 유효한     사용자인지 검증

 

토큰 전달 및 인증 방법

1. 클라이언트 아이디 비밀번호 요청 

2. 서버가 토큰 생성 후 응답

3. 클라이언트 토큰 저장하고 토큰 정보와 함께 인증이 필요한 뭔가 요청을 보냄

4. 서버는 토큰의 유효성을 검증

5. 유효하면 클라이언트가 요청한 내용을 처리

 

토큰 기반 특징

- 무상태성: 클라이언트에서 토큰을 가지고 있고, 서버에는 저장하지 않아서 완전한 무상태

- 확장성: 무상태성으로 하나의 토큰으로 결제 서버와 주문 서버에 요청을 보낼 수 있는 장점이 생김

- 무결성: 토큰을 발급한 이후에는 누구도 토큰 정보를 변경할 수 없음

 

 

JWT(JSON Web Token)

- 토큰 기반의 인증 방식 중 하나

- 특히 클라이언트와 서버 간의 인증 정보를 안전하게 전달하고 검증하는 데 사용

 

JWT 특징

- JSON 형식

- Signature: JWT는 서버에서 발급된 토큰에 서명을 추가하여 토큰의 무결성을 보장

- Claims: 토큰에 담기는 정보를 나타내는 속성들이 포함. 예를 들면, 사용자의 식별자(ID), 권한 등.

                등록된 클레임, 공개 클레임, 비공개 클레임으로 나누어짐.

- Base64 인코딩: JWT는 Base64로 인코딩되어 전송되어 가볍고 다양한 곳에서 사용 가능

 

JWT 구조

- '.'을 기준으로 각각 header, payload, signature로 이루어져 있다.

- 헤더 : 토큰의 타입과 해싱 알고리즘을 지정하는 정보를 담는다.

- 페이로드: 토큰과 관련된 정보 (내용의 한 덩어리를 클레임이라고 부름)

- 시그니쳐: 해당 토큰이 변경되지 않았음을 호가인하는 용도. 헤더의 인코딩 값과 내용의 인코딩 값을 합친 후에 주어진 비밀키를 사용해

                  해시값을 생성

 

토큰 유효기간 

- 토큰의 유효기간이 길면 너무 많은 일을 할 수 있음

- 토큰의 유효기간이 짧으면 사용자 입장에서는 너무 불편함

-> 리프레시 토큰 등장!

- 엑세스 토큰(일반적인 JWT토큰)과는 별개의 토큰이다. 

- 엑세스 토큰이 만료되었을 경우 새로운 엑세스 토큰을 받기위해 설정한다.

=> 엑세스 토큰의 유효기간을 짧게 설정하고 리프레시 토큰의 유효기간을 길게 설정하면 공격자가 엑세스 토큰을 탈취해도 몇 분 뒤에는 사용할 수 없는 토큰이 되어서 안전하다.

===> 엑세스 토큰도 유효기간이 있고, 리프레시 토큰도 유효기간이 있다. 그런데 엑세스 토큰이 만료될 때마다 리프레시 토큰이 새로 엑세스 토큰을 발급해주는데, 이 과정을 리프레시 토큰의 유효 기간동안만 가능하다

 

?? 왜 서버에 저장할까 

- 보안상의 이유로 리프레시 토큰은 클라이언트보다는 안전한 서버에 저장된다.