[Spring] 토큰 기반 인증
토큰 기반 인증이란?
- 스프링 시큐리티로 로그인/로그아웃에서는 기본적으로 시큐리티에서 제공해주는 세션 기반 인증을 사용
- 사용자마다 사용자의 정보를 담은 세션을 생성하고 저장해서 인증
- 토큰 기반 인증은 토큰을 사용
- 토큰은 서버에서 클라이언트를 구분하기 위한 유일한 값
- 서버가 토큰을 생성해서 클라이언트에게 제공하면, 클라이언트는 이 토큰을 갖고 있다가 여러 요청을 이 토큰과 함께 신청
- 서버는 토큰으로만 유효한 사용자인지 검증
토큰을 전달하고 인증받는 과정
- 클라이언트가 아이디와 비밀번호를 서버에게 전달하면서 인증 요청
- 서버는 아이디와 비밀번호를 확인해 유효한 사용자인지 검증. 유효한 사용자일 경우 토큰을 생성해서 응답
- 클라이언트는 서버에서 제공한 토큰을 저장
- 이후 클라이언트는 인증이 필요한 API를 사용할 때 토큰을 함께 전송
- 서버에서 토큰의 유효성 검증
- 유효할 경우 클라이언트가 요청한 내용을 처리
토큰 기반 인증의 특징
- 무상태성
- 상태를 관리한다 : 사용자의 인증 상태를 유지하면서 이후 요청을 처리하는 것
- 토큰 기반 인증에서는 클라이언트에서 인증 정보가 담긴 토큰을 생성하고 인증
- 서버 입장에서는 클라이언트의 인증 정보를 저장하거나 유지하지 않아도 되기 때문에 완전한 무상태(stateless)로 효율적인 검증 가능
- 확장성
- 서버 확장시 상태 관리를 신경쓸 필요가 없기 때문에 서버 확장에도 용이함
- 무결성
- 토큰 방식은 HMAC(hash-based message authentication)기법이라고도 부름
- 토큰 발급 이후에는 토큰 정보를 변경할 수 없음 = 토큰의 무결성 보장
JWT
JWT의 구조
JWT는 .을 기준으로 헤더(header), 내용(payload), 서명(signiture)로 이루어져 있음
- 헤더 : 토큰의 타입과 해싱 알고리즘을 지정하는 정보를 담음
이름 | 설명 |
---|---|
typ | 토큰의 타입을 지정. JWT라는 문자열이 들어가게 됨 |
alg | 해싱 알고리즘 지정 |
- 내용 : 토큰과 관련된 정보
- 클레임(claim) : 내용의 한 덩어리, 클레임은 키값의 한 쌍으로 이루어짐. 등록된 클레임, 공개 클레임, 비공개 클레임으로 구분됨
- 서명 : 해당 토큰이 조작되었거나 변경되지 않았음을 확인하는 용도로 사용, 헤더의 인코딩값과 내용의 인코딩값을 합친 후에 주어진 비밀키를 사용해 해시값을 생성
Leave a comment