서버와 클라이언트에 필요한 것은
인증(Authentication)
사용자가 자기 계정을 사용하려고 할 때 아이디와 비밀번호가 맞는지 인증이 되면 로그인이 된다.
인가(Authorization)
인증을 받은 사용자가 서비스 안에서 돌아다닐 때 서버가 로그인을 한 사용자라는걸 알아보고 허가해준다.
세션 아이디가 담긴 쿠키는 클라이언트에 저장되어 있으며, 서버는 세션을 저장하고 있다.
서버는 그저 세션 아이디로만 요청을 판단한다.
로그아웃은 두 가지 작업을 해야 한다.
서버가 클라이언트의 쿠키를 임의로 삭제할 순 없지만, set-cookie
로 세션 아이디의 키 값을 무효한 값으로 갱신한다.
토큰은 유저 정보를 암호화한 상태로 담을 수 있고, 암호화했기 때문에 클라이언트에 담을 수 있다.
Access Token
Refresh Token
인코딩 또는 암호화된 3가지 데이터 이어 붙인다.
헤더
토큰의 타입이 JWT로 고정되어 있고, HS256 등 여러 암호화 방식 중 하나를 지정할 수 있다.
// JSON형태
{
"alg": "HS256",
"typ": "JWT"
}
페이로드
Base64로 인코딩해보면 JSON형식으로 여러 정보들이 있다.
이 토큰을 누가 누구에게 발급했는지, 이 토큰이 언제까지 유효한지 그리고 서비스가 사용자에게 이 토큰을 통해 공개하기 원하는 내용(닉네임, 서비스상의 레벨, 관리자 여부 등) 서비스 측에서 원하는대로 담을 수 있다.
이렇게 토큰에 담긴 사용자 정보 등의 데이터를 Claim이라고 한다.
// JSON형태
{
"sub": "someInformation",
"name": "phillip",
"iat": 151623391
}
서명
헤더, 페이로드, 서버에 감춰놓은 비밀 값 이 셋을 암호화 알고리즘에 넣고 돌리면 서명 값이 나온다.
// HMAC SHA256 알고리즘을 사용 시 생성되는 서명
HMACSHA256(base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret);
Statelessness & Scalability (무상태성 & 확장성)
안전하다.
어디서나 생성 가능하다.
권한 부여에 용이하다.
출처 :
유튜브 (https://www.youtube.com/watch?v=1QiOXWEbqYQ)
구글 검색
(https://ssungkang.tistory.com/entry/WEB-Authentication-1-%EC%84%B8%EC%85%98%EA%B3%BC-%EC%BF%A0%ED%82%A4)
(https://velog.io/@paulkim/Session-%EA%B3%BC-%ED%86%A0%ED%81%B0%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9C%A0%EC%A0%80-%EC%9D%B8%EC%A6%9D%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C)