웹 인증에서 많이 사용되는 방식은 세션, 쿠키, JWT, 웹 스토리지 등이 있다.
이 포스팅에서는 각 방식의 원리, 장단점, 그리고 사용 사례를 비교해보려 한다.
브라우저에 저장되는 작은 데이터 조각.
클라이언트-서버 간의 상태를 유지하거나 사용자 정보를 저장하는 데 사용.
Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure; SameSite=Strict
Set-Cookie: sessionId=abc123; HttpOnly
HttpOnly. 클라이언트의 JavaScript 코드에서 해당 쿠키에 접근할 수 없도록 설정.
- XSS(크로스 사이트 스크립팅) 공격 방지. 악성 스크립트가 브라우저에서 실행될 때 쿠키를 읽지 못하게 하여 탈취를 방지할 수 있다.
- HTTP 요청, Set-Cookie 헤더에서 설정할 수 있다.
다만, 클라이언트 측 쿠키 접근이 필요한 경우 HttpOnly 속성이 적용되어 있으면 접근할 수 없으니 주의.
Set-Cookie: sessionId=abc123; Path=/; Secure
Set-Cookie: sessionId=abc123; Path=/; SameSite=Strict
SameSite. 쿠키가 어떤 URL 요청에서만 전송되는지 제어하는 속성.
같은 도메인에서만 전송할 수 있도록 하는 Strict.
같은 도메인 요청과 일부 크로스 사이트 요청(GET 요청)을 허가하는
Lax.
모든 크로스 사이트 요청에서 쿠키가 전송할 수 있도록 하는 None 옵션이 제공된다.
{
"header": {
"alg": "HS256",
"typ": "JWT"
},
"payload": {
"userId": 12345,
"role": "admin",
"exp": 1700000000
},
"signature": "HMACSHA256(header + payload)"
}
Authorization: Bearer 'JWT토큰'
클라이언트 측에서 데이터를 저장하기 위한 브라우저 제공 API.
LocalStorage와 SessionStorage 두 가지 유형이 있다.
LocalStorage:
브라우저를 닫아도 데이터 유지.
SessionStorage:
브라우저 탭을 닫으면 데이터 삭제.
localStorage.setItem("token", "abc123");
const token = localStorage.getItem("token");
소셜 로그인(예: "Google로 로그인", "Facebook으로 로그인").
사용자가 비밀번호를 공유하지 않고 제3자 애플리케이션에 자원 접근 권한을 위임하여 처리한다.
여러 가지 인증 요소(예: 비밀번호 + OTP + 생체 정보)를 조합하여 인증하는 방식.
비밀번호, PIN, OTP, 인증 어플리케이션, 지문/얼굴/홍채 인식 등증.. 여러가지 방식을 조합한다.