범위 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토큰)과는 별개의 토큰이다.
- 엑세스 토큰이 만료되었을 경우 새로운 엑세스 토큰을 받기위해 설정한다.
=> 엑세스 토큰의 유효기간을 짧게 설정하고 리프레시 토큰의 유효기간을 길게 설정하면 공격자가 엑세스 토큰을 탈취해도 몇 분 뒤에는 사용할 수 없는 토큰이 되어서 안전하다.
===> 엑세스 토큰도 유효기간이 있고, 리프레시 토큰도 유효기간이 있다. 그런데 엑세스 토큰이 만료될 때마다 리프레시 토큰이 새로 엑세스 토큰을 발급해주는데, 이 과정을 리프레시 토큰의 유효 기간동안만 가능하다
?? 왜 서버에 저장할까
- 보안상의 이유로 리프레시 토큰은 클라이언트보다는 안전한 서버에 저장된다.
'묘공단 스프링부트 스터디' 카테고리의 다른 글
묘공단 스프링부트 스터디 7주차 (0) | 2023.12.25 |
---|---|
묘공단 스프링부트 스터디 6주차 (0) | 2023.12.12 |
묘공단 스프링부트 스터디 5주차 (1) (2) | 2023.12.03 |
묘공단 스프링부트 스터디 4주차 (1) | 2023.11.27 |
묘공단 스프링부트 스터디 3주차 (2) | 2023.11.23 |