게시판 API를 구현하면서 JWT인증을 사용하게되었는데 앞으로도 자주 쓰일 것이라 생각되어 JWT가 무엇이고 JWT로 인증 인가를 했을 때 장점과 한계점에 대해 정리하고자 한다.
인증과 인가는 둘 다 보안과 관련되어있고, JWT토ㅡㄴ 기반인 경우 해당 토큰을 사용한다는 점에서는 동일하나 인증은 장치 혹은 사용자를 식별하는 행위 인가는 장치 및 사용자 엑세스 권한을 허용/거부하는 행위이다.
어떤 사실 또는 어떤 문서가 진짜인지 증명하는 과정을 가리키는 용어.
사용자는 사용자와 시스템간에 공유되는 합의된 정보를 제공하여 자신의 신원을 증명함.
ex) 회원가입하고 로그인 하는 것.
유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차.
즉, 액세스 권한을 확인하는 프로세스를 의미.
ex) 유저에 대한 권한을 허락하는 것.
인증→인가로 이어질 수 있지만 인가→인증으로는 이어질 수 없다.
// 참고
JWS(Json Web Signature) : JSON으로 전자 서명을 하여 URL-safe문자열로 표현한 것.
JWE(Json WEb Encryption) : JSON을 암호화하여 URL-safe 문자열로 표현한 것.
URL-safe : URL에 포함할 수 없는 문자를 포함하지 않는 것.
도 있다.

토큰 타입과 해시 암호화 알고리즘으로 구성되어있다.
{
"alg": "HS256",
"typ": "JWT"
}
토큰에 담을 클레임(claim)정보를 포함하고 있다.
name-value의 한 쌍으로 이루어 져 있고, 토큰에는 여러개의 클레임들을 넣을 수 있다.
{
"type": "test",
"name": "nana_velog",
"date": "2024-09-13"
}
secret key를 포함하여 암호화 되어있다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
기존의 토큰 방식 인증은 이후의 모든 서비스 호출에 사용되어 서비스를 받기 위해서 토큰의 유효성을 확인하고 세부 정보를 쿼리해야한다.
참조에 의한 호출(Call by Reference) 형태로 모든 서비스는 항상 상호작용할 때 다시 접속해야한다.
서버에서는 사용자에 대한 세션을 유지할 필요가 없다.
사용자가 요청을 했을 때 토큰만 확인하면 되므로 세션 관리가 필요 없어서 서버 자원과 비용을 절감할 수 있다.
JWT는 두 개체 사이에서 안정성 있게 정보를 교환하기에 좋은 방법이다.
정보가 서명되어있기 때문에 정보를 보낸이가 바뀌진 않았는지, 정보가 도중에 조작되지는 않았는지 검증할 수 있다.
jwt.io 여기서 인코딩과 디코딩을 바로 확인 가능합니다.
▪️ 우연히 본 세션에 관한 글.
"어디에 세션을 보관할까?"