암호화 방식 중 하나
다른 암호화 방식들과 달리 암호화만 가능
해시함수(Hash) 사용해 암호화 진행
해싱은 항상 같은 결과값이 나오기 때문에 해싱 이전의 값을 알아낼 수 있는 레인보우 테이블이 존재 -> 솔트 사용. 해시 이전의 값에 임의의 값을 추가하여 이전의 값을 알아내기 어렵도록 하는 방식
동일한 값의 데이터를 사용하고 있는지 여부 확인
(데이터 그 자체를 사용하는 것이 목적이 아님)
인증과 권한 정보를 담고 있는 암호화된 문자열
사용자의 인증 정보를 서버가 아닌 클라이언트 측에 저장
기존 세션 기반 인증이 가지고 있던 한계(서버의 부담이 큼) 극복, 서버의 부하나 메모리 부족 문제를 줄일 수 있음
토큰 방식의 흐름 |
---|
클라이언트 POST /login 인증 정보(아이디와 패스워드) 사용 로그인 요청 ↓ 서버 데이터베이스에 저장된 사용자 인증 정보 확인 유효하다면 해당 유저에 대한 토큰 생성 클라이언트에 토큰 전달 (Auhorization 헤더 사용&쿠키 전달) ↓ 클라이언트 클라이언트에 토큰 저장 (저장 위치 : LocalStorage, Session Stroage, Cookie 등) GET /someinfo 요청과 함께 토큰 전달(Authorization 헤더&쿠키 사용) ↓ 서버 유효한 토큰인지 검증 유효하다면 클라이언트의 요청에 대한 응답 데이터 전송 |
JSON Web Token
토큰 기반 인증 구현시 대표적으로 사용하는 기술
JSON 객체에 정보를 담고 이를 토큰으로 암호화하여 전송
aaaa.bbbb.cccc 처럼 . 으로 나누어진 세 부분 존재
토큰 자체를 설명하는 데이터 포함
토큰의 종유, 시그너치를 만들 때 사용한 알고리즘을 JSON 형태로 작성
{
"alg":"HS256",
"typ":"JWT"
}
전달하려는 내용을 담고 있는 부분
어떤 정보에 접근 가능한지에 대한 권한, 유저의 이름 등 개인정보, 토큰의 발급 시간 및 만료 시간 등의 정보가 담겨 있음
{
"sub": "someInformation",
"name": "phillip",
"iat": 151623391
}
토큰의 무결성을 확인할 수 있는 부분
서버의 비밀키와 Header에서 지정한 알고리즘을 사용하여 해싱
토큰 자체가 탈취되었을 경우 토큰 인증 방식의 한계가 드러남
무상태성
인증 상태 관리 주체가 서버가 아니어서 토큰이 탈취되어도 강제로 만료시킬 수 없음
유효 기간
유효 기간을 짧게 설정하면 사용자 경험이 낮아지고, 유효 기간을 길게 설정하면 탈취될 경우 치명적일 수 있음
토큰의 크기
토큰에 많은 데이터가 담길 경우 암호화 과정이 길어지고 크기가 커져서 네트워크 비용 문제가 발생할 수 있음
서버에 접근하기 위한 토큰
보안을 위해 보통 24시간 정도의 짧은 유효기간이 설정되어 있음
액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급받기 위해 사용되는 토큰
(애겟스 토큰보다 긴 유효기간을 가짐)
보안과 사용자 경허 사이의 적절한 균형이 중요함