웹 서비스는 로그인 정보같은 다양한 client의 상태를 알기위해 대표적으로 쿠키를 사용한다. 하지만 쿠키는 쉽게 볼 수 있고 조작이 가능하기에 id,password같은 중요한 정보를 직접 저장할 순 없다. 또한 쿠키의 저장공간은 크지 않기에 다양한 정보를 담기에는 client에게 부담이 될 수 있다. 이러한 문제를 해결하기 위해 세션(session) 을 사용한다.
세션은 쿠키만 사용할때의 단점을 보완한다. session은 서버에 각 User의 중요한 정보를 저장하고 client에게 해당 session의 접근할 수 있는 sessionId를 준다. client는 쿠키에 sessionId를 넣고 통신한다. 만약 User가 로그아웃을 하거나 User의 sessionId가 탈취당한 경우 해당 session을 제거 하여 비정상적인 접근을 막을 수도 있다.

세션 방식으로 로그인 하였을때의 로직이다.
토큰기반 인증중에 가장 널리 쓰이고 있는 토큰은 JWT(Json Web Token)이다. 세션은 server에서 User의 정보를 가지고 있어 접속한 User가 너무 많으면 과부하가 올수 있다는 단점이 있다. JWT는 server에서 토큰의 유효성 검증만 하면 돼서 부담을 덜어 준다. JWT 보통 쿠키에 넣지 않고 Http Authorization Header에 넣는다. Header에 넣으면 컨트롤러를 가기전에 인터셉터 나 필터 등에서 확인이 가능하다.
JWT는 Header,payload,signature로 이루어져있다.
<Header>.<payload>.<signature>
토큰의 유형과,signature 알고리즘이 명시되어있다
{
"alg": "HS256",
"typ": "JWT"
}
HS256알고리즘을 사용하고 JWT 토큰이다.
토큰정보 및 사용자의 인증/인가 정보 같은 서비스에 필요한 정보들을 담는다. 이때 각각의 Key값을 claim 이라고 부른다.
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
header의 인코딩값과 payload의 인코딩 값을 secretkey로 해싱한 값이다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
signature 부분을 만드는 슈도코드의 구조이다.
jwt는 쉽게 디코딩이 가능하여 중요한 정보를 담으면 안된다.
https://jwt.io/
해당 사이트에서 쉽게 디코딩 할 수 있다.
하지만 시크릿키는 알 수 없으므로 조작은 불가능하다.