back-end/spring boot

jwt 토큰 개념

study-minjeong 2024. 3. 3. 22:13

spring security와 jwt를 이용하여 로그인, 로그아웃을 구현하기 위해 jwt에 대해 학습한 것을 정리한 내용이다.

 

 

 

jwt란?

Json Web Token으로, 인증에 필요한 정보들을 토큰에 담아 암호화하여, 인증에 사용하는 인터넷 표준 인증 방식이다. jwt는 header, payload, signature로 구성되어 있다.

header는 서명에 사용된 알고리즘과 토큰의 타입을, payload에는 사용자나 토큰에 대한 정보를, signature은 헤더와 페이로드를 비밀키로 암호화한 내용이 담겨있다.

 

사용할 수 있는 상황은 로그인, 정보 교류 등이 있다.

로그인을 할 떄는 서버가 유저의 정보에 기반한 토큰을 발급하여 유저에게 전달해주고, 유저가 서버에 요청을 할 때마다 jwt를 포함하여 전달한다. 서버에서는 토큰이 유효하고 인증되었는지를 검증하고, 권한을 확인하여 작업을 처리한다. 서버측에서는 세션 유지를 할 필요가 없다.

두 개체 사이에서 안정성 있게 정보를 교환하기에 좋은 방법이다. 정보가 sign이 되어있기 때문에 검증을 할 수 있다.

 

 

 

jwt 사용의 장점

1) 별도의 인증 저장소가 필요 없다.

2) 쿠키를 전달하지 않아도 되므로 취약점이 사라진다.

3) url 파라미터와 헤더로 사용된다.

4) 트래픽에 대한 부담이 낮다. 

5) REST 서비스로 제공 가능하다.

 

jwt 사용의 단점

1) 토큰 자체에 정보를 담고 있어 위험할 수 있다.

2) 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.

3) 페이로드는 BASE64로 인코딩된 것이므로, 페이로드에 중요한 정보를 넣지 않아야 한다.

4) 상태를 저장하지 않기 때문에 만료 시간을 꼭 넣어줘야 한다.

5) 클라이언트 측에서 관리해야하므로, 토큰을 저장해야 한다.

 

 

access 토큰과 refresh 토큰

access 토큰은 유효기간이 짧고, refresh 토큰은 유효기간이 길다.

평소에 api 통신을 할 때는 access 토큰을 사용하고, refresh 토큰은 access 토큰이 만료되어 갱신될 때 사용한다. 

작동 원리는 1) 로그인에 성공하면 refresh 토큰과 access 토큰을 서버로부터 받게 된다. 2) 클라이언트는 로컬에 저장해두고, 헤더에 access 토큰을 넣고 api 통신을 한다. 3) access token의 유효기간이 만료되었으면, 헤더에 refresh 토큰을 넣어 재요청하고, 서버는 새로운 access 토큰을 넣어 응답한다. 4) refresh 토큰도 만료되었다면 클라이언트는 재로그인해야한다.