상세 컨텐츠

본문 제목

[Spring] JWT (JSON Web Token)

Backend/Spring

by hyeminyy 2023. 12. 19. 19:11

본문

728x90

개인적으로 공부한 것으로 참고만

 

JWT(JSON Web Token)

토큰 기반의 인증 시스템 

 

사용자가 로그인 할 때

session

-> was에 사용자가 로그인을한다. (ID와 비밀번호) > controller에서 db와 비교를 한다. 이 것을 JSP로 내려보내준다.

was안에 세션에다가 사용자의 유일한 정보를 담는다(ID). 아이디가 저장되어 있는 세션에 고유한 번호를 만들어준다(세션ID).

세션안에는 세션의 고유한 번호를 가지고 있고, 사용자의 ID나 PWD를 가지고 있다.

세션 아이디를 내려보내준다. 브라우저는 리스펀스로 세션 아이디를 받고, 쿠키에 저장을 한다.

(쿠키 : 브라우저 내에 정보를 저장하는 공간(저장소))

다음 새로운 요청이 있으면, 새로운 요청을 할 때 요청 객체에 쿠키를 포함해서 보낸다. 서버는 쿠키로 부터 세션아이디를 읽어, 세션 아이디가 서버에 있으면 로그인한 사용자다.

세션아이디의 단점 : 

1. 쿠키를 잃어버렸을 때 (훔쳐 갔을 때) : JS로 쿠키를 훔쳐갈 수 있어, 자신도 모르게 보내버릴수도 있음(보안취약성)

2. was가 여러개로 나눠져 있다. : 1번 접속 성공! -> 2번 접속 ? -> 2번에는 세션이 없으니까 새로 또 로그인해야함.

 

JWT 

->로그인 했었던 인증방식을 토큰에 담는다. 세션을 사용하지 않는다. 토큰에 내려보내줌.

쿠키를 누가 훔쳐가면 대책이 없다. (세션과 동일)

장점 : 내려 보내주는 쿠키 안에 ISS, 등등.. 담고 암호화한다. 암호화 한 쿠키를 내려보내줌, 브라우저는 쿠키에 저장.

다시 다음을 요청할 때 request 넘기고, 토큰을 통해 인증이 됬는지 안됐는지 확인한다.

 

예시)

은행에서 여러 고객의 일을 순서대로가 아닌 섞어서 받을 때, 판단 방법은 ? 

1. Session : 고객 정보와 번호를 적어 준다. -> 만약 번호를 잃어버렸으면 ? -> 잘못되면 다른 사람들에게 잘못 대출이나 인출이 될 수도 있음.

2. JWT : 고객의 정보를 암호화해서 가지고 있다가 (나만의 암호화, 복호화를 가지고 있다가) , 사용할 때 복호화해서 이 사람이 누구인지 알 수 있도록 한다.

 

 

encoded : 서버에서 만들어진 코드의 샘플

decoded : 인코딩 토큰을 만들기 위한 알고리즘

 

웹 토큰은 안에 무엇이 있는지 공개하면 안됨

Encoed를 사용자에게 내려보낸다.

 

장단점

장점 : 서버는 비밀키만 알고 있으면 되기 때문에 세션 방식과 같이 별도의 인증 저장소가 필요하지 않음

단점 : 토큰을 탈취 당할수도 있으니 중요한 데이터는 안 넣는게 좋음

구현절차

 담아야할 것 : 알고리즘, payload에 담기위한 정보들 (iss, iat(issued at), sebject),(클레임 하나가 네임 벨류를 담는 조각),시큐리티 키도 필요

 

 

 

@빈으로 등록이 되어야 함.

 

 

 

728x90

관련글 더보기