1. 등장 배경
1994년 루먼 톨린이 쿠키 제안하면서 웹브라우저는 이전의 접속했던 사용자의 정보를 웹서버로 전송할 수 있었고, 웹서버는 이 정보를 가지고 현재 접속한 사용자의 정보를 알 수 있게 되었다. 쿠키를통해 인증을 구현할 수 있게 되었다.
2. http cookie 의 용도 3가지
인증, 개인화, 방문자들의 상태를 체크할 때 사용된다.
3. 쿠키 생성하기
1) 서버 단위에서 response에 set-cookie 를 설정하고 서버를 실행하면 response 에서 쿠키를 확인할 수 있다. (request 에서는 쿠키 확인 불가)
2) 이후에 response에 set-cookie 를 주석처리하고 서버를 실행하면 response 에서 쿠키를 확인할 수 없지만, request 에서 쿠키를 확인할 수 있다.
4. 쿠키 읽기
- 서버단위에서 웹브라우저에서 request 인자로 담은 쿠키를 읽을 수 있다.
- request 객체의 쿠키로 접근한다.
5. 쿠키 활용하기
[검사] - [application] - [쿠키]
: 특정 도메인에 대한 쿠키를 보여준다.
ex.
특정 사이트의 언어 옵션을 쿠키로 저장하여 사용자 개인에게 적합한 언어를 제공한다.
로그인하는 경우 sessionid 라는 쿠키가 생긴다. 로그인을 성공한 사용자의 고유 식별자이다. 아이디, 이메일, 비밀번호 정보가 담겨있지 않지만 이 정보가 있다면 '나'로 로그인할 수 있다.
6. Session 쿠키 vs Permanent 쿠키
- 세션 쿠키 : 웹브라우저가 켜져 있을 때만 유효
- 퍼머넌트 쿠키 : 웹브라우저를 껐다 켜도 유효. 오래 지속되는 쿠키이다.
Expires={쿠키가 죽을 시각} 또는 Max-Age={현재 시점 기준으로 쿠키가 살아있을 초 단위} 를 쿠키 옵션에 추가한다.
7. 쿠키 옵션 Secure & HttpOnly (보안관련)
- Secure; : 웹브라우저와 웹서버가 https 를 통해서 통신하는 경우에만 쿠키를 전송한다.
Response 에서 Secure; 확인 가능 / Request 에서는 확인 불가능
(http로 통신하고 있기 때문에 request 에서 Secure; 설정된 쿠키를 전송할 수 없다.)
sessionid 쿠키에 이용 가능. http 통신이면 sessionid를 쉽게 악용할 수 있음.
- HttpOnly : 웹브라우저, 웹서버가 통신할 때만 쿠키를 발행한다.
새로고침 - [검사] - HttpOnly 쿠키 확인 가능 / [콘솔] - [자바스크립트 document.cookie] HttpOnly 쿠키 확인 불가능
자바스크립트로 보안 정보에 접근하는 것을 방지하기 위함이다. sessionid에 활용 가능
8. 쿠키 옵션 path & domain
[검사] - [application] - [쿠키] 에서 확인
- Path : 어떤 Url Path에서 동작할 것인가 제안하는 것이다. '/' 이면 최상위 디렉터리를 의미하는데, 서버단위에서 set-cookie 로직을 주석처리해도 http://호스트 (최상위) 에 접근하면 쿠키가 살아있다. 경우에 따라 특정 디렉터리에서만 쿠키가 활성화되도록 하고 싶을 때 Path=/디렉터리명 기능을 사용한다.
- Domain : 어떤 Url 도메인에서 동작할 것인가 제안하는 것이다. 도메인은 IP의 이름이다. Domain=o2.org 설정하면 o2.org:3000에 접근하면 Domain 을 설정한 쿠키의 도메인만 도메인 값이 '.' 으로 시작한다. test.o2.org:3000 (서브도메인)에 접속할 때 이 쿠키만 살아있다. 즉, 도메인 앞에 어떤 서브 도메인이와도 사용할 수 있다.
9. 쿠키를 이용한 인증 기능 구현 (실제 서비스엔 사용 불가 - 간단 로직만 참고할 것)
1) 아이디, 패스워드 로그인 : 쿠키 안에 아이디, 패스워드가 평문으로 저장된다.
// 서버 단위에서 아이디, 패스워드가 맞는지 체크하고 맞으면 쿠키 response
2) 로그아웃 : 쿠키에 아이디, 패스워드 사라짐
// 서버 단위에서 set-cookie 시, Max-Age=0 설정하여 쿠키가 삭제되도록 처리
3) 접근 제어(acl 액세스 컨트롤) : 로그인되어있지 않은 경우, 글 쓰기 작업 접근 불가능
// 서버 단위에서 로그인 상태 체크
/*
isOwner = false
request headers 에서 쿠키를 읽는다. 아이디, 패스워드가 맞다면 isOwner = true
return isOwner
*/
로그인하지 않은 상태인 경우, login required 메세지 리턴