📌 인증(Authentication)과 인가(Authorization)
- 인증(Authentication) : 서비스를 이용하려는 유저가 등록된 회원인지 확인하는 절차 (예: 로그인)
- 인가(Authorization) : 특정 리소스에 접근할 수 있는 권한이 있는지 확인하는 절차 (예: 인터넷 카페 운영자? 마이페이지에 대한 권한?)
📌 HTTP 프로토콜 통신의 특징
1) 무상태 (Stateless)
- 서버는 클라이언트의 상태를 기억하지 않는다. 따라서 각 요청마다 서버에서 요구하는 모든 상태 정보를 담아서 요청해야 한다.
- 상태값은 매 요청마다 클라이언트가 가지고 오기 때문에 서버는 클라이언트의 상태를 별도로 기억할 필요 없이 주문 받은대로 응답한다.
- 무상태라는 특성 덕에 동일한 서버를 여러개로 확장시킬 수 있다.
2) 비연결성 (Connectionless)
- 서버와 클라이언트는 연결되어 있지 않다. 서버 입장에서는 매번 새로운 요청이다.
- 비연결성으로 인해 최소한의 서버 자원으로 서버를 유지할 수 있다.
- 그러나 사용자별 요청이 잦은 서비스(채팅)의 경우 이러한 비연결성은 오히려 비효율적일 수 있다.
📌 쿠키 (cookie)
- 무상태와 비연결성이라는 http 통신의 특징에도 불구하고 마치 서버가 클라이언트의 인증 상태를 기억하는 것처럼 구현할 수 있는 수단이다.
- key-value형태로 브라우저에 저장되는 텍스트 파일이다.
- 별도로 삭제처리 하거나 유효기간이 만료되지 않는 이상 서버와 통신할 때 자동으로 주고 받게 된다.
- 서버에 특정 API 요청을 했을 때 서버가 응답 시 Header 안에 Set-Cookie 속성으로 쿠키 정보를 담아주면 응답을 받은 부라우저는 쿠키를 브라우저에 자동으로 저장한다.
- 저장된 쿠키 정보는 [개발자도구][애플리케이션][저장용량][쿠키]에서 확인할 수 있다.
- 서버에 http 요청을 할 때마다 브라우저에 저장되어 있는 쿠키는 자동으로 서버에 보내진다. (단, 동일한 Origin 또는 CORS를 허용하는 Origin에만 쿠키를 보낸다.)
- 클라이언트에서 직접 추가/수정/삭제 할 수 있다.
✅ Origin?
✅ CORS?
- Cross Origin Resource Sharing(CORS)는 다른 출처에 리소스 요청하는 것을 허용하는 정책이다.
- 브라우저는 보안상의 이유로 기본적인 Same Origin Policy(SOP)을 원칙으로 하지만, 서버와 클라이언트 각각 CORS 설정을 통해 상호합의된 웹사이트는 예외적으로 서로 다른 출처(Cross-Origin)임에도 API 요청이 가능하다.
📌 세션 (session)
- 클라이언트와 서버 간의 연결이 활성화된 상태를 의미하는 개념이다.
- 혹은 인증이 유지되고 있는 상태이다.
- [로그인 성공] -> 서버에서 세션 생성 및 저장(key-value형태) -> key(sessionId)를 쿠키로서 브라우저에 응답
✅ 쿠키-세션 인증 방식
(1) 브라우저(클라이언트)에서 유저가 아이디와 패스워드를 가지고 서버에 로그인을 시도하면
(2) 서버는 데이터베이스에서 클라이언트로부터 받은 아이디와 패스워드를 가진 유저를 찾는다.
(3) 아이디와 패스워드를 가진 유저가 있다면 데이터베이스는 그에 해당하는 유저 객체(유저에 해당하는 정보)를 리턴해준다.
(4) 서버는 받은 유저 객체(유저에 해당하는 정보)를 Value에 담고 그에 대한 sessionid를 발급 및 저장한다.
(5) 서버는 클라이언트의 응답으로 Set-Cookie로 sessionid를 전달한다.
(6) 클라이언트는 브라우저의 쿠키에 자동으로 sessionid를 저장한다.
(1) 클라이언트는 서버에 GET요청을 할 때 sessionid를 담아서 요청한다.
(2) 서버에서는 sessionid를 읽고 session storage에서 validatate(유효성 검사)를 한다.
(3) 유효하다면, 데이터베이스에서 클라이언트에서 요청한 작업을 수행한다.
(4) 그에 맞는 리스트를 검색한다.
(5) 서버는 데이터에서 받은 리스트를 클라이언트에게 응답한다.
📌 토큰 (token)
- 클라이언트에서 보관하는 암호화된 인증 정보이다.
- 세션처럼 서버에서 사용자의 인증 정보를 보관할 필요가 없기 때문에 서버 부담을 줄여주는 인증 수단이다.
- 웹에서 인증 수단으로 사용되는 토큰은 주로 JWT(Json Web Token)이다.
✅ JWT (Json Web Token)
- header.payload.signature 형식으로 3가지 데이터로 구성되어 있다.
- 암호화된 토큰은 누구나 복호화하여 payload를 볼 수 있다. 따라서 토큰의 용도는 인증정보(payload)에 대한 보호가 아니라 위조 방지에 있다.
- 정보(payload)를 토큰화할 때 signature에 secret key가 필요하고, secret key는 복호화가 아니라 토큰이 유효한 지를 검증하는데 사용된다.