HTTP는 state-less를 지향한다. (서버와 클라이언트 구조에서 서버가 클라이언트의 상태를 갖고 있지 않는 것)
-> state-ful방식(세션)보다 비교적 많은 양의 데이터가 반복적으로 전송되므로 네트워크 성능 저하가 될 수 있다.
-> 쿠키는 노출되었을 때 민감 정보까지 노출되기 때문에 보안이 좋지 않다.
쿠키와 세션의 단점을 보완하기 위해 등장한 하나의 인터넷 표준 인증 방식이다. 말 그대로 인증에 필요한 정보들을 토큰에 담아 암호화시켜 사용하는 것.
자세한 내용은 아래 링크 참고! 굉장히 구체적으로 설명되어있다.
https://brunch.co.kr/@jinyoungchoi95/1
공개/개인 키를 쌍으로 사용하여 토큰에 서명하면, 개인 키를 보유한 서버가 서명된 토큰이 정상적인 토큰인지 인증할 수 있다.
aaaaaa.bbbbb.ccccc
(.) 으로 구분되어 각 Header, Payload, Signature로 구성되어있다.
예시,
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
실제로 위와 같은 형태로 만들어진다. JWT 인코딩 링크
stateful해야 하는 세션의 단점을 보완하기 위해 만들어진 JWT는 별도의 세션 저장소를 강제하지 않기 때문에 stateless하여 확장성이 뛰어나고, signature를 통한 보안성까지 갖추고 있다.
보통 두 가지 방법 중 하나를 사용한다. 오늘은 Refresh Token에 대해서만 기록한다.
JWT가 만료되기 직전의 유효시간을 보고 재발급을 어떤 방식으로 하는지가 중요하다. 이 방법은 가장 많이 사용하는 방법으로 JWT를 처음 발급할 때 Access Token과 함께 Refresh Token을 발급하여 짧은 만료 시간을 해결하는 방법이다.
1. 로그인 요청 시 서버는Access Token과 Refresh Token을 함께 발급
- Access Token은 짧은 유효 기간을 가지며 API 요청 시 사용된다.
- Refresh Token은 상대적으로 긴 유효 기간을 가지며 Access Token이 만료되었을 때 새 Access Token을 얻는 데 사용된다.
2. Access Token이 만료되었을 때 Refresh Token을 통해 갱신
- 클라이언트는 Access Token이 만료되면 저장된 Refresh Token을 이용해 서버에 새로운 Access Token을 요청한다.
3. 요청 시 Access Token을 사용
- 클라이언트는 이후의 API 요청마다 Access Toekn을 포함하여 인증을 수행한다.
이러한 흐름은 사용자가 재로그인하지 않고도 일정 시간 동안 인증 상태를 유지할 수 있도록 해주며 보안성을 높이기 위해 사용한다.
┌──────────┐ ┌────────┐ ┌───────────────┐
│ 클라이언트 │ │ 서버 │ │ 데이터베이스 │
└──────────┘ └────────┘ └───────────────┘
│ │ │
│ ID/PW로 로그인 요청 │ │
│──────────────────────────────>│ │
│ │ DB에서 사용자 인증 │
│ │────────────────────────────────────>│
│ │ │
│ │ Access Token 및 Refresh Token 생성 │
│ │ │
│Access Token과 Refresh Token 반환│ │
│<──────────────────────────────│ │
│ │ │
│ Access Token을 포함한 API 요청 │ │
│──────────────────────────────>│ │
│ │ Access Token 검증 │
│ │────────────────────────────────────>│
│ │ │
│ 요청 처리 후 응답 반환 │ │
│<──────────────────────────────│ │
│ │ │
│ Access Token 만료 시 │ │
│ Refresh Token으로 새로운 Access Token 요청 │ │
│──────────────────────────────>│ │
│ │ Refresh Token 검증 │
│ │────────────────────────────────────>│
│ │ │
│ 새로운 Access Token 반환 │ │
│<──────────────────────────────│ │
│ │ │
이건 다른 블로그에서도 더 자세히 설명되어 있기 때문에 참고하기 !
가장 중요한 차이점은 JWT(토큰 기반 인증)는 서버가 상태 정보를 따로 저장하지 않고도 인증을 수행할 수 있다는 점이다. 이로 인해 서버 자원에 대한 부담이 줄어들어 확장성과 분산 시스템에서의 효율성이 높다. 또한, 보안성과 사용자 편의성을 동시에 확보할 수 있다.
: API를 사용하기 위한 인증용 토큰
: Access Token의 유효 기간 연장을 위한 토큰
방식이 세션 인증 방식과 크게 다르지 않다고 생각했다. JWT를 선택하는 이유는 "효율성"때문이라고 생각한다.
간단한 웹 애플리케이션이나 보안이 매우 중요한 환경(서버가 인증을 완전히 통제해야 하는 경우)에서는 세션 인증 방식이 더 적합할 수 있다. 토큰 인증 방식을 사용하는 이유는 위와 같은 추가적인 기능을 용이하게 제공하기 위해서이다.
참고
https://brunch.co.kr/@jinyoungchoi95/1
https://velog.io/@vamos_eon/JWT%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80-%EC%82%AC%EC%9A%A9%EC%B2%982