참고
HTTP 헤더 - 인증
NOTE
인증 - Authorization (요청)
NOTE
•
클라이언트 인증 정보를 서버에 전달
◦
value 값은 인증방식(OAuth)에 따라 다양함(필요하면 검색)
인증 - WWW-Authenticate (응답)
NOTE
•
리소스 접근시 필요한 인증 방법 정의
•
401 Unauthorized 응답과 함께 사용
쿠키(Cookie)
NOTE
•
쿠키 정보는 항상 서버에 전송된다!
◦
네트워크 트래픽 추가 유발
◦
최소한의 정보만 사용(sessionId, 인증 토큰)
•
Set-Cookie : 서버 → 클라이언트 쿠키 전달(응답)
•
Cookie : 클라이언트가 서버에서 받은 쿠키를 저장, 클라이언트→서버 쿠키 전달(요청)
•
쿠키 생성, 접근 과정 정리
1.
웹 브라우저가 id, password를 담아 서버에 로그인 요청
2.
서버는 id, password 검증에 성공하면, 해당 사용자에 대한 sessionId(쿠키)를 생성함
3.
서버는 Set-Cookie에 sessionId를 담아 웹 브라우저에 로그인 성공을 응답
4.
웹 브라우저는 쿠키 저장소에 sessionId(쿠키)를 저장함
5.
이후 웹 브라우저가 쿠키 접근가능한 도메인 요청을 보낼 때마다 자동으로 쿠키 저장소에서 꺼낸 sessionId(쿠키)를 Cookie에 담아 서버에 요청 보냄
6.
서버는 sessionId(쿠키)의 유효성을 검사해 클라이언트를 식별함
쿠키 - 쿠키 미사용
NOTE
1.
처음 welcome 페이지 접근
로그인하지 않은 사용자가 서버에 /welcome을 요청하면, 서버는 ~손님을 응답함
2.
로그인
사용자가 id, password 정보를 담아 서버에 /login을 POST로 요청하면, 서버는 로그인 성공
응답을 한다.
3.
로그인 이후 welcome 페이지 접근
사용자가 로그인 이후 서버에 /welcome을 요청하면, 서버는 로그인한 사용자임을 구분할 수
없기때문에 ~손님을 응답한다.
→ HTTP 무상태(Stateless) 프로토콜이다.
•
클라이언트와 서버가 요청, 응답을 주고 받은 후 연결이 끊어진다.
•
클라이언트가 재요청을 하면 서버는 이전 요청을 기억하지 못한다
•
클라이언트와 서버는 서로 상태를 유지하지 않는다!
4.
대안 - 모든 요청과 링크에 사용자 정보 포함?
•
모든 요청에 사용자 정보를 넘기는 문제가 있다!!
◦
모든 요청에 사용자 정보를 넘긴다? → 해고당함
◦
브라우저를 종료하고 다시 열면 Web Storage에 저장해놓고 다시 넘겨야 함
쿠키 - 쿠키 사용
NOTE
1.
로그인
•
웹 브라우저가 id, password를 담아 POST로 /login을 서버에 요청하면, 서버는
Set-Cookie에 유저 정보를 담아 클라이언트에 응답한다.
→ 클라이언트 웹 브라우저의 쿠키 저장소에 쿠키를 저장한다!
2.
로그인 이후 welcome 페이지 접근
•
로그인 이후, 웹 브라우저가 자동으로 Cookie를 담아 /welcome를 서버에 요청하면,
서버는 쿠키를 확인해서 로그인한 유저를 확인하고 응답을 한다.
3.
해결 - 모든 요청에 쿠키 정보 자동포함
•
로그인 이후, 웹 브라우저가 요청을 보낼 때 자동으로 쿠키 저장소에서 꺼낸 쿠키를 담아
요청을 보낸다!!
쿠키 - 쿠기 속성(생명주기)
NOTE
1.
expires : 만료날짜 설정 (사용 권장하지않음)
2.
max-age : 초단위 설정 (주로 쓰임)
•
쿠키종류
◦
세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료시까지만 유지
◦
영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지(브라우저가 종료되어도 클라이언트
시간이 남아있는 한 유지됨)
쿠키 - 쿠기 속성(도메인)
NOTE
1.
명시 : 명시한 문서 기준 도메인 + 서브 도메인 포함 적용
•
domain = example.org를 지정하고 쿠키 생성
•
2.
생략 : 현재 문서 기준 도메인만 적용
•
example.org에서 쿠키 생성, domain 지정 생략
◦
example.org 에서만 쿠키 접근 O
◦
dev.example.org(서브 도메인)은 쿠키 미접근
쿠키 - 쿠기 속성(경로)
NOTE
•
이 경로를 포함한 하위 경로 페이지만 접근 가능
◦
일반적으로 path=/ 루트로 지정함
쿠키 - 쿠기 속성(보안)
NOTE
1.
Secure
•
https인 경우에만 쿠키를 전송한다
2.
HttpOnly
•
XSS(자바스크립트 코드 공격) 방지
•
자바스크립트에서 쿠키 접근 X, HTTP 전송에서만 쿠키 사용
3.
SameSite
•
XSRF 공격 방지 목적
•
요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송
쿠키 질문정리
Q. http 통신을 하는 상황에서 로그인을 한 후 set-cookie로 발급받은 sessionId(쿠키 정보)를 해커에게 탈취당하면 해커는 해당 sessionId를 이용해 제 아이디로 로그인한 상황이 되는 건가요?
Q. 쿠키 미접근이라는 것은 정확히 어떤 의미인가요?
•
사용자가 로그인을 한다 → 서버에서 sessionId를 생성하고 set-cookie를 통해 응답한
쿠키를 웹 브라우저의 쿠키 저장소에 sessionId를 저장한다.
•
만약 브라우저에서 쿠키 미접근 도메인에 요청을 보내면, 애초에 요청을 보낼때 쿠키 저장소에서 쿠키를 꺼내지 않고 요청을 보낸다.
Q. 쿠키와 세션? 세션 쿠키에서 쿠키의 만료날짜를 생략하면 브라우저 종료시까지만 쿠키를 유지한다고 했는데, 서버에서는 웹 브라우저가 종료되었다는 사실을 모를텐데 언제까지 세션을 보관하고 있나요?
•
쿠키는 브라우저(클라이언트), 세션은 서버에서 관리하는 정보다
•
다만 서버가 특정 클라이언트에 대한 정보를 기억하기 위해 쿠키 값을 매번받아
내부에 있는 세션 값과 비교하는 방식으로 쿠키를 사용하는 것
•
웹 서버를 사용하는 프레임워크나 개발자에 따라 세션은 다르게 설정될 수 있다
◦
Spring boot의 경우 1800초로 세션이 지속되고 maxIntervalTimeout으로
특정 세션값을 마지막으로 사용한 시점으로 부터 어느정도 지나면 서버에서 세션값을
지운다.