1. session
유저가 로그인하면 서버가 유저한테
입장권 발급 -> 사이트에서 어떤 행동을 할 때마다 입장권 제출
입장권에 들어가있는 정보가 거의 없음 ( 발급번호 하나 )
세션스토어에 있는 발급번호를 조회해서 문제 없으면 통과
2. token
입장권에 들어가있는 정보가 많음
입장권만 조회하고 문제없으면 통과
=> token 방식이 서버에 부담이 덜하다
session은 회원이 많아질수록 부담이 간다.
장점 :
토큰 위변조가 불가능
서버에 토큰 저장할 필요가 없고
검증해서 안전하면 바로 데이터 꺼내쓰면 됌.
jwt는 대충 만들면 심각한 보안이슈가 생김
문제 1 : alg : none 공격
alg를 none으로 변조 후에
변조된 토큰을 사용하면
토큰 자체에 문제가 없다고 판단하고 보안이 뚫리는 경우가 발생
=> 대응 방안
None 알고리즘 사용 금지
문제 2 : jwt는 변환이 쉬움
header, payload, signature 등을 이용해서 토큰을 만드는 것과 반대로
토큰을 디코딩해서 header, payload를 확인할 수 있다
=> 대응 방안
그래서 항상 최소한의 정보를 이용해서 토큰을 만들어야함
이걸 보완하기 위한 jwe 토큰이 따로 있음
문제 3 : 시크릿키
시크릿키를 대충 적으면 때려맞추기 쉬움
=> 대응 방안
생성용 키 / 검증용 키 2개 사용
private + public
문제 4 : jwt 탈취
탈취한 jwt로 접속이 가능
=> 대응 방안
1. HttpOnly cookie
훔치기 어려운 저장소
2. 특정 토큰 블랙리스트
이러면 jwt 장점이 없어지고
토큰의 정보를 하나하나 비교하는 session과 다를게 없음
3. jwt 유효기간 짧게 - 권장
유효기간 : 5분 이후에는 못 쓰니까 안전
이렇게 할려면
재발급하는 refresh token 이 필요
refresh token rotation 방법 필요 - refresh token을 재발급, 재사용하면 토큰을 발급하지 않음
( refresh token 은 언제나 1회용 ) - 이것도 탈취 당할 수 있기 때문
'SpringBoot Security' 카테고리의 다른 글
JWT 정리, 프론트 연동, role 권한, refresh token (3) | 2024.12.20 |
---|---|
CORS, 시큐리티 기본 설정 (0) | 2024.12.17 |