과거의 사황 Session 이라면
현재의 사황은 Jwt 토큰 이다
Session은 칠무해급이다
jwt 토큰을 사용하는 백엔드 서버는
일반 http 프로토콜 처럼 무상태를 가진다.
그래서 서버측에 session에 그 상태를 저장하면서 인증 / 인가를 처리했었다 (물론 지금도 쓸수있다)
그렇다면, 장사가 너무 잘되어서 서버를 증설해야할경우에
문제가 발생하게되는데
A 백엔드가 발급한 세션은 B 백엔드 서버는 모른다.
그래서 레디스를 도입하거나, 이런 정보를 디비에 저장해야하는데
그중 jwt 토큰도 하나의 방법이 될 수 있고, 널리 쓰인다
그리고 토큰의 용량도 비교적 적다(문자열이다)
예를 들면 다음과 같다 ( 보기 쉽게 . 을 기준으로 문자열에 색상을 입혔다)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
문득 이것만 보면 이상한데 잘보면 . 기준으로 문자열이 작성되어있다
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
다시한번 각 줄 마다 의미를 부여해보겠다
1. 헤더 - 암호화 알고리즘 및 토큰 유형 을 나타내고
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
2. 페이로드 - 데이터를 나타낸다 (실제 꺼낼값들은 여기에 있다)
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
3. 시그니처 - 서명을 나타낸다 (토큰을 변조하면 이부분이 바낀다고)
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
사실 방금 그 토큰은 jwt.io 에서 제공하는 샘플이다 (https://jwt.io/#debugger-io)
이 사이트에 접속해서 오른쪽 페이로드 쪽을 값을 바꿔보면
페이로드 문자열도 바끼지만
시그니처 부분의 문자열도 바끼는걸 볼 수 있다
변조된 토큰은 서버측에서 서명한 키로 다시 토큰을 읽어들일때 예외를 발생시킨다
변조된 토큰 이라했으니까 어떻게 하는건지 의문을 갖을 수 있는데.
jwt token 은 기본적으로 Base64를 이용해서 인코딩 되기때문에
아무 프로그래밍 언어나 특정 운영체제 쉘로도 Base64를 디코딩할 수 있다
방금 jwt.io 사이트에서도 그렇게 디코딩한거다 (잘 보면 왼쪽은 인코딩, 오른쪽은 디코딩이 써있다)
생각을 이어가자...
그렇다면 토큰을 발급하는 자는
민감한 정보는 토큰에 담으면 안되겠다.
프론트 입장에서 어떤 준비를 해야할까?
1. 준비가 필요한 방식
특정 요청에 대해서는 항상
Authorization 라는 헤더를 추가하고 Bearer 라는 prefix를 주고 한칸 띄운다음
토큰을 적어 보낸다
Authorization : Bearer {toekn}
백엔드는 지정된 헤더에서 읽어서 토큰을 검증하고
토큰에 있는 회원 정보(민감정보X)로 인증상태를 유지한다
2. 준비가 필요없는 방식
프론트에서 자동빵을 원한다면 쿠키를 사용하는게 좋다
브라우저는 기본 요청시 쿠키를 담아 보내주는 기능을 이용하는 것이다
그렇다면 백엔드에서는 항상 쿠키를 뒤져서 존재하는지 체크하고
위와 마찬가지로
토큰에 있는 회원 정보(민감정보X)로 인증상태를 유지한다
다음은 토큰의 생존주기를 알아보자
토큰을 생성할때 토큰의 생성일과 만료일을 지정할 수 있다
이를 통해 만료된 토큰은 유통기한이 지난샘이다
지금 까지의 내용을 정리해보자
1. aaaaa . bbbb . cccccc 형태로 점(.) 2개를 기준으로 문자열이 3개 있다
2. Base64 로 디코딩, 인코딩 할 수 있다 , 누구나 볼 수 있다
3. 토큰의 만료 시간이 존재한다
'개발 > spring-security' 카테고리의 다른 글
jwt 토큰 생성하고 검증해보자 (0) | 2024.06.01 |
---|---|
spring security 와 jwt 주저리 (0) | 2024.06.01 |
커스텀 Filter 에 AuthenticationManager 공유하기 (0) | 2024.05.23 |
SpringSecurity - CORS 허용 (0) | 2024.05.12 |
AuthenticationManager 를 Bean 등록해보자 (0) | 2024.05.11 |