본문 바로가기
Spring Boot 개념 정리

JWT 개념 정리

by 반오십 코린이 2023. 3. 26.
728x90

 

인증과 인가

 

인증(Authentication)은 로그인

인가(Authorization)는 로그인으로 인증하고 나서 유지되는 상태에서 일어나는 일(글 작성 등)


JWT 개념

 

JWT는 인가에 관련된 기술이다. 세션 처럼 서버에 데이터 일부를 놓고 사용자에게 넘기는 것이 아니라

서버에 저장시키지 않고 사용자에게 온전히 넘긴다.

 

 

해당 토큰의 형식은 xxxxx.yyyyy.zzzzz

x는 1번 헤더

type: JWT 고정값

alg: 알고리즘의 약자, 서명값을 만드는데 사용되는 알고리즘 지정 ex) HS256

 

 

y는 2번 페이로드

Base 64로 디코딩 해보면 JSON 형식으로 여러 정보들이 들어있다.

 

이 토큰을

누가 누구에게 발급했는지

언제까지 유효한지

공개하기 원하는 내용

 

z는 3번 서명

 

토큰에 담긴 사용자 정보등의 데이터를 claim이라고 한다.

서버로 부터 인가를 수행할 때 서버측에서는 토큰을 확인하면 되기 때문에 db에 접근해야하는 동작이 불필요.

 

보안상의 이유로 위험할 수 있다는 생각을 가질 수 있다.(왜냐하면 디코딩 해버리면 페이로드값이 그대로 들어나기 때문)

 

하지만 서버에서 헤더, 페이로드, 서버에 감추어 놓은 비밀값을 암호화 알고리즘에 돌리면 3번 서명값이 나옴

 

결국 3번 서명 부분은 정답인지 아닌지  확인하는 거임

1,2 번 부분은 3번을 확인하기 위한 재료이다. (서버에 감추어 놓은 비밀값 또한 재료)


jwt와 세션의 차이점?

 

jwt는 stateless

세션은 stateful

 

세션은 사용자의 상태를 유지해야 하기 때문에 로직이 복잡하지만 통제할 수 있다는 장점이 있다.

하지만 서버가 재부팅 되어야 하는 상황이 오면 메모리에 저장되어 있던 정보가 날라가기 때문에 

로그인이 풀린다는 단점

 

jwt는 서버에 메모리에 데이터를 따로 저장시키지 않아도 된다는 장점(db에 정보 하나를 저장하긴 함) → 서버 재부팅 상황이 와도 로그인이 끊기지 않는다.  but stateless하기 때문에 통제하기 어렵다는 단점이 있다.

 

ex) 한 기기에서만 로그인 상태를 유지하게 끔 설정하려고 했을 때 세션은 통제가 가능하지만 jwt는 불가능하다. 


jwt의 단점 최소화 하는 법

 

jwt의 단점을 최소화 하기 위해 쓰이는 방법은 토큰 만료시간을 짧게 주는것이다. + 2가지 종류의 토큰 넘긴다.

- access 토큰(만료시간이 짧음)

- refresh 토큰, 상응하는 값을 서버의 db에도 저장함(만료시간이 김)

 

사용자는 access 토큰이 만료되면 refresh 토큰을 서버에 보낸다.

서버는 db에 저장된 상응하는 값을 확인하고 일치하면 access 토큰을 다시 발급해서 보낸다.

 

이렇게 하면 계속 로그인 할 필요가 없어진다는 장점

+ access 토큰을 탈취당한다고 해도 오래 쓰지를 못함( 계속 쓰려면 access 토큰이 만료되고 refresh 토큰을 보내야 하는데

refresh 토큰이 없으니까 무용지물)

 

but access 토큰이 탈취 되었을 때 바로 차단시킬 방법이 없기 때문에 그 짧은 시간 동안 무슨 일을 당하면 유감..

728x90