인증과 인가
인증
인증이란, 서비스를 이용하려는 유저가 등록된 회원인지 확인하는 절차이다.
인가
인가란, 인증을 받은 유저가 특정 리소스에 접근할 수 있는 권한이 있는지 확인하는 절차이다.
쿠키
쿠키란 브라우저에 저장 되는 작은 데이터 조각이며, key-value 형태로 저장된다.
- HTTP의 무상태성과 비연결성 특성에도 불구하고, 쿠키를 사용하여 마치 서버가 클라이언트의 인증 상태를 기억하는 것처럼 구현할 수 있다.
- 쿠키는 별도로 삭제 처리하거나 유효기간이 만료되지 않는 한, 서버와 통신할 때 자동으로 주고받게 된다.
- 서버에 특정 API 요청을 했을 때(ex : 로그인 요청) 서버가 응답 시 헤더에 Set-Cookie 속성으로 쿠키 정보를 담아주면, 응답을 받은 브라우저는 쿠키를 브라우저에 자동으로 저장한다.
- 서버에 http 요청할 때마다 브라우저에 저장되어 있는 쿠키는 자동으로 서버에 보내진다. (단, 동일한 Origin 또는 CORS를 허용하는 Origin에만 쿠키를 보낸다. ex- 유튜브 서버에서 받은 쿠키는 유튜브 이용 시에만 주고 받을 수 있다.)
세션
세션이란 사용자와 서버 간의 연결이 활성화된 상태를 의미하는 개념이다. (인증이 유지되고 있는 상태)
- 로그인 성공 → 서버에서 세션 생성 및 저장(key-value 형식) → key(sessionId)를 브라우저에 응답(by 쿠키)
하지만 세션 인증 방식에는 메모리 사용량, 보안 등의 문제가 있었는데 이런 한계를 극복하기 위해 나온 것이 JWT(JSON Web Token)이다. JWT는 서버 확장성, 무상태성 유지, 보안성 등을 개선한 토큰 기반의 인증 방식이다.
토큰
클라이언트에서 보관하는 암호화 또는 인코딩된 인증 정보를 의미한다. 서버의 상태를 유지하지 않고도 클라이언트의 인증 상태를 확인할 수 있게 해준다.
- 세션처럼 서버에서 사용자의 인증 정보를 보관할 필요가 없기 때문에 서버 부담을 줄여주는 인증 수단
- 웹에서 인증 수단으로 사용되는 토큰은 주로
JWT (Json Web Token) 을 이용함
JWT
JWT는 토큰 기반 인증 방식에서 사용되는 특별한 토큰이다. 로그인한 사용자가 이후에 서버에 요청을 보낼 때 사용된다.
JWT의 3가지 부분
- 헤더(Header): 어떤 종류의 토큰인지와 어떤 알고리즘으로 서명되었는지에 대한 정보가 들어있음
- 본문(Payload): 실제로 중요한 데이터가 들어있는 부분. 예를 들어, 사용자 ID, 토큰의 만료 시간 등이 여기에 포함된다.
- 서명(Signature): 이 부분은 토큰이 위조되지 않았는지 확인하는 역할을 함. 서버만이 알 수 있는 비밀 키로 서명되어 있음. 이 서명 때문에 토큰의 무결성이 보장된다.