인증은 사용자가 누구인지 확인하는 과정이다.
아이디와 비밀번호 입력, 생체 인식, OTP, 스마트 카드와 같은 방법이 있다.
인가는 인증된 사용자가 특정 자원이나 서비스에 접근할 수 있는 권한을 부여받는 과정이다.
예를 들어, 관리자는 시스템의 특정 부분에 대한 접근 권한을 가지지만 일반 사용자는 접근 권한을 가질 수 없다.
인증 : '누가 사용자인가'
인가 : '사용자가 무엇을 할 수 있는가'

HTTP/1.1 302
Date: Tue, 6 Dec 2023 17:10:37 GMT
Set-Cookie: IDPW=test.test!; Max-Age=3600;
...
매번 로그인 정보를 요청에 담아 보내는 것은 보안상 문제가 생길 수 있다.
이러한 문제점에서 벗어나고자 나온 것이 Session이다.

중요한 정보를 주고받지 않아 보안상 이점이 있지만, 사용자를 식별할 수 있는 값을 생성하고 서버에 저장해두어야 한다.


Session ID의 탈취의 가능성이 있고, 무엇보다 Client의 상태를 서버에서 관리한다는 점이 HTTP 통신의 stateless 특성과는 거리가 있다.
사용자를 인증할 수 있는 정보가 숨겨진 암호화된 Access Token을 발행하고, 인증이 필요할 때마다 서버에 Token과 함께 요청을 보낸다. 서버는 저장된 데이터가 아닌 Token 해독을 통해 Token 속에서 사용자를 식별할 수 있는 정보들을 알아내고 이를 바탕으로 인증/인가를 한다.
// 예시
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 // Header 영역
.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWQiOiJlZ2c1MjgifQ // Payload 영역
.dxx7fHi3twlN_GnfG3kZHxkLElTi9y99n5DEby-a_TE // Signature 영역
Header, Payload, Signature로 구성된 정보들은 "."을 구분자로 위 예시와 같이 읽기 어려운 코드로 생성된다.
Jwts.builder()
.setClaim(claim) // key, value 쌍으로 정보 저장
.setIssuedAt(now) // 발행 시간
.setExpiration(expiration) // 유효 시간
.signWith(key) // 서명 저장
.compact(); // 생성