(인프런) 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식을 공부하고 리뷰한 글입니다.
7. 인증
<정리>
인증 헤더 종류 | 설명 | 사용 헤더 | 사용 목적 |
Authorization | 클라이언트 인증 정보 | 요청 | 인증 방식에 따라 값이 다양함 |
WWW-Authenticate | 리소스 접근시 필요한 인증 방법 정의 | 응답 | 401(Unauthorized) 응답과 함께 사용 |
1. Authorization (요청)
클라이언트 인증 정보를 서버에 전달
- value 값은 인증 방식(OAuth)에 따라 다양함(필요하면 검색)
2. WWW-Authenticate (응답)
리소스 접근시 필요한 인증 방법 정의
- 401 Unauthorized 응답과 함께 사용
8. 쿠키
1) Set-Cookie: 서버->클라이언트 쿠키 전달(응답)
2) Cookie: 클라이언트가 서버에서 받은 쿠키를 저장, 클라이언트->서버 쿠키 전달(요청)
1. 쿠키 미사용
1) 처음 welcome 페이지 접근
로그인하지 않은 사용자가 서버에 /welcom 을 요청하면, 서버는 ~손님을 응답한다.
2) 로그인
사용자가 id, password 정보를 담아 서버에 /login 을 POST로 요청하면, 서버는 로그인 성공 응답을 한다.
3) 로그인 이후 welcome 페이지 접근
사용자가 로그인 이후 서버에 /welcome 을 요청하면, 서버는 로그인한 사용자임을 구분할 수 없기때문에 ~손님을 응답한다.
Q. 서버는 왜 로그인한 사용자임을 알 수 없는가?
A. HTTP는 무상태(Stateless) 프로토콜이다.
- 클라이언트와 서버가 요청, 응답을 주고 받은 후 연결이 끊어진다.
- 클라이언트가 재요청을 하면 서버는 이전 요청을 기억하지 못한다.
- 클라이언트와 서버는 서로 상태를 유지하지 않는다.
4) 대안 - 모든 요청과 링크에 사용자 정보 포함?
요청을 할 때마다 userId, password 유저 정보를 계속 서버에 보낸다.
모든 요청에 사용자 정보를 넘기는 문제가 있다!! 개발자가 힘들어진다..
- 모든 요청에 사용자 정보가 포함되도록 개발 해야함
- 브라우저를 종료하고 다시 열면 Web Storage에 저장해놓고 다시 넣겨야 함
2. 쿠키 사용
1) 로그인
웹 브라우저가 id, password를 담아 POST로 /login을 서버에 요청하면,
서버는 Set-Cookie에 유저 정보를 담아 클라이언트에 응답한다.
-> 클라이언트 웹 브라우저의 쿠키 저장소에 쿠키를 저장한다.
2) 로그인 이후 welcome 페이지 접근
로그인 이후, 웹 브라우저가 자동으로 Cookie를 담아 /welcome을 서버에 요청하면,
서버는 쿠키를 확인해서 로그인한 유저를 확인하고 응답을 한다.
3) 해결 - 모든 요청에 쿠키 정보 자동 포함
로그인 이후, 웹 브라우저가 요청을 보낼 때 자동으로 쿠키 저장소에서 꺼낸 쿠키를 담아 요청을 보낸다!!
<쿠기 생성, 접근 과정 정리>
1) 웹 브라우저가 id, password를 담아 서버에 로그인을 요청함
2) 서버는 id, password 검증에 성공하면, 해당 사용자에 대한 sessionId(쿠키)를 생성함
3) 서버는 Set-Cookie에 sessionId를 담아 웹 브라우저에 로그인 성공을 응답함
4) 웹 브라우저는 쿠키 저장소에 sessionId(쿠키)를 저장함
5) 이후 웹 브라우저가 쿠키 접근가능한 도메인에 요청을 보낼 때마다 자동으로 쿠키 저장소에서 꺼낸 sessionId(쿠키)를 Cookie에 담아 서버에 요청을 보냄
6) 서버는 sessionId(쿠키)의 유효성을 검사해 클라이언트를 식별함
3. 쿠키
쿠키 정보는 항상 서버에 전송된다!!
-> 네트워크 트래픽 추가 유발
-> 최소한의 정보만 사용(세션 id, 인증 토큰)
Q. 쿠키 정보를 서버에 전송하지 않고 클라이언트에서 그 정보를 갖고있는 방식을 쓰고 싶으면?(웹 브라우저 내부에 데이터를 저장하고 싶으면?)
- 웹 스토리지(localStorage, sessionStorage) 참고
(주의!) 보안에 민감한 데이터는 쿠키/웹스토리지에 저장하면 안된다!! (e.g. 주민번호, 신용카드 번호)
<사용처>
- 사용자 로그인 세션 관리
- 광고 정보 트래킹
아래에서 쿠키 접근을 제한하는 방법에 대해 알아보도록 한다.
3-1. 쿠키 - 생명주기
expires, max-age
1) expires : 만료 날짜 설정
2) max-age : 초단위 설정
<쿠키 종류>
1) 세션 쿠키 - 만료 날짜를 생략하면 브라우저 종료시까지만 유지
2) 영속 쿠키 - 만료 날짜를 입력하면 해당 날짜까지 유지(브라우저가 종료되어도 클라이언트 시간이 남아있는 한 유지)
3-2. 쿠키 - 도메인
domain
1) 명시: 명시한 문서 기준 도메인 + 서브 도메인 포함 적용
domain=example.org 를 지정하고 쿠키 생성
- exmaple.org 와 dev.exmaple.org(서브 도메인) 도 쿠키 접근O
2) 생략: 현재 문서 기준 도메인만 적용
exmaple.org에서 쿠키 생성, domain 지정 생략
- example.org에서만 쿠키 접근O
- dev.example.org(서브 도메인)은 쿠키 미접근
3-3. 쿠키 - 경로
path
- 이 경로를 포함한 하위 경로 페이지만 쿠키 접근O
- 일반적으로 path=/ 루트 로 지정
3-4. 쿠키 - 보안
Secure, HttpOnly, SameSite
1) Secure
- https인 경우메만 쿠키를 전송
(참고) 쿠키는 원래 http, https 를 구분하지 않고 쿠키를 서버에 전송함
2) HttpOnly
- XSS 공격 방지 목적
- 자바스크립트에서 쿠키 접근X(document.cookie), HTTP 전송에서만 쿠키 사용
3) SameSite
- XSRF 공격 방지 목적
- 요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송
(참고) 아직 기능이 적용된지 오래되지 않아서 사용할 때는 브라우저에서 어느정도 지원하는지 확인하고 사용해야함
7- 8. 쿠키 질문 정리
Q. http 통신을 하는 상황에서 로그인을 한 후 set-cookie로 발급받은 sessionId(쿠키 정보)를 해커에게 탈취당하면 해커는 해당 sessionId를 이용해 제 아이디로 로그인한 상황이 되는 건가요?
위의 예시처럼 해커에게 sessionId를 탈취당하면 큰일이 난다. 이는 sessionId뿐 아니라 대부분의 인증에서 동일한 문제가 있다. 그래서 네트워크 구간 암호화를 하기 위해 HTTPS를 사용하고 추가로 session의 생존 기간을 짧게 가져가야 한다.
[출처] https://www.inflearn.com/questions/111153
Q. HttpOnly는 HTTP 전송에서만 쿠키를 사용한다고 했는데, https에서 사용할 수 없다는 의미인가요?
쿠키는 자바스크립트로 document.cookie를 이용해 해당 로컬 PC에 저장된 쿠키를 조회할 수도 있다.
HttpOnly는 자바스크립트(document.cookie)로 해당 로컬 PC에 저장된 쿠키를 조죄하는 기능을 막는다는 의미에서 HTTP 전송에서만 쿠키를 사용한다고 표현한 것이다. (여기서 말하는 http는 http, https를 구분하는 것이 아님)
[출처] https://www.inflearn.com/questions/138181
Q. 쿠키 미접근이라는 것은 정확히 어떤 의미인가요?
사용자가 로그인을 하면 서버에서는 sessionId를 생성하고 set-cookie를 통해 응답한 쿠키를 웹 브라우저의 쿠키 저장소에 sessionId를 저장한다. 만약 브라우저에서 쿠키 미접근 도메인에 요청을 보내면, 애초에 요청을 보낼 때 쿠키 저장소에서 쿠키를 꺼내지 않고 요청을 보낸다.
[출처] https://www.inflearn.com/questions/157746
Q. 쿠키와 세션? 세션 쿠키에서 쿠키의 만료날짜를 생략하면 브라우저 종료시까지만 쿠키를 유지한다고 했는데, 서버에서는 웹 브라우저가 종료되었다는 사실을 모를텐데 언제까지 세션을 보관하고 있나요?
쿠키는 브라우저(클라이언트), 세션은 서버에서 관리하는 정보다.
다만 서버가 특정 클라이언트에 대한 정보를 기억하기 위해 쿠키 값을 매번받아 내부에 있는 세션 값과 비교하는 방식으로 쿠키를 사용하는 것이다. 웹 서버를 사용하는 프레임워크나 개발자에 따라 세션은 다르게 설정될 수 있다. Spring boot의 경우 기본 1800초로 세션이 지속되고 maxIntervalTimeout으로 특정 세션값을 마지막으로 사용한 시점으로 부터 어느정도 지나면 서버에서 세션값을 지운다.
[출처] https://www.inflearn.com/questions/442445
'Spring > 모든 개발자를 위한 HTTP 웹 기본 지식' 카테고리의 다른 글
[모든 개발자를 위한 HTTP 웹 기본 지식] 08. HTTP 헤더2(캐시와 조건부 요청) - 검증 헤더와 조건부 요청1 (4) | 2022.06.16 |
---|---|
[모든 개발자를 위한 HTTP 웹 기본 지식] 08. HTTP 헤더2(캐시와 조건부 요청) - 캐시 기본 동작 (0) | 2022.06.08 |
[모든 개발자를 위한 HTTP 웹 기본 지식] 07. HTTP 헤더1(일반헤더) - 일반 정보, 특별한 정보 (0) | 2022.06.07 |
[모든 개발자를 위한 HTTP 웹 기본 지식] 07. HTTP 헤더1(일반헤더) - 전송 방식 (0) | 2022.06.07 |
[모든 개발자를 위한 HTTP 웹 기본 지식] 07. HTTP 헤더1(일반헤더) - 콘텐츠 협상 (0) | 2022.06.07 |