SpringBoot Security

JWT 기초

pjh8838 2024. 12. 20. 11:17
반응형


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회용 ) - 이것도 탈취 당할 수 있기 때문

 

 

 

 

 

 

 

 

728x90
반응형