도메인의 중요성
- 도메인 = 화면, UI, 기술 인프라 등등의 영역을 제외한 시스템이 구현해야하는 핵심 비즈니스 영역
- web부분을 다른 기술로 바꾼다해도 도메인은 그대로 유지되어야함.
- 이렇게 되게 할려면 web은 domain을 알고 있지만 domain은 web을 몰라야 가능
- domain은 web을 모르기 때문에 web패키지를 모두 삭제한다해도 domain에는 전혀 영향이 없다.
- web은 domain을 의존하도록 단방향으로 만들어줘야함.
- 만들어 둔 영역을 다른 기술로 바꾸는게 가능하다.
쿠키를 사용해서 로그인 상태를 유지하기
- 쿼리 파라미터를 계속 유지하면서 보내는것은 매우 어려우면서 번거로운 작업이기 때문에 쿠키를 사용해보자.
- 서버에서 로그인에 성공하게 되면 HTTP 응답에 쿼리를 답아서 브라우저에 전달
- 브라우저는 앞으로 해당 쿠키를 지속해서 보내줌.
쿠키의 종류 2가지
- 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
- 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료시까지만 유지
쿠키와 보완 문제
-
쿠키 값은 임의로 변경할 수있다.
- 클라이언트가 쿠키를 강제로 변경시 다른 사용자가되버림.
- 웹 브라우저 개발자 모드에서 변경가능
-
쿠키에 보관된 정보는 훔쳐갈 수있음.
- 쿠키에 개인정보나 신용카드 정보가 들어있다는 가정을하게 될 경우
- 이 정보의 경우 웹 브라우저에도 보관되고 네트워크 요청마다 클라이언트에서 서버로 전달됨.
- 쿠키의 정보의 경우 로컬 PC에서도 털릴수있으며, 네트워크 전송 구간에서도 털릴 수있음
-
해커가 쿠키를 훔쳐가면 평생 사용이 가능하다.
- 훔쳐간 쿠키를 이용해서 악의적인 요청을 계속 보낼수 있음.
보안문제에 대한 대안
- 쿠키에 중요한 값을 노출하지 않으면서 예측 불가능한 임의의 토큰을 노출하고, 서버에서 토큰과 사용자 id를 매핑해서 인식한다.
- 해커가 임의의 값을 넣어도 찾을수 없도록 예상 불가능해야함.
- 토큰을 만약 털어간다해도 토큰 만료기간을 짧게 유지해서 토큰이 빠르게 만료되도록 하거나 해킹이 의심될경우 해당토큰을 강제로 제거하기.
세션 동작 방식
- 중요한 정보는 모두 서버에 저장하는 방식
- 클라이언트와 서버는 추정 불간으한 임의의 식별자 값으로 연결
세션 관리
- 사용자가 LoginId,Password 정보를 전달하면 서버에서 해당 사용자가 맞는지 확인
- 맞다면 세션 ID를 생성
- UUID 는 추정이 불가능하기 때문에 사용할수 있음.
- 생성된 세션 ID 와 세션에 보관할 값을 서버의 세션 저장소에 보관
- 서버는 클라이언트에게 mySessionId라는 이름으로 세션 ID만 쿠키에 담아서 전달.
- 클라이언트는 쿠키 저장소에 mySessionId 쿠키를 보관함.
중요점
- 회원과 관련된 정보는 전혀 클라이언트에 전달되지않음.
- 추정 불가능한 세션ID만 쿠키를 통해서 클라이언트에 전달됨.
로그인 이후 접근시
- 클라이언트는 요청시 항상 mySessionId 쿠키를 전달
- 서버에서 클라이언트가 전달한 mySessionId 쿠키 정보로 세션 저장소를 조회해서 로그인시 보관한 세션 정보 사용
세션 사용시 보안 문제 해결
- 쿠키 값을 변조할 수 있다. --> 예상 불가능한 복잡한 세션 id를 사용한다.
- 쿠키에 보관하는 정보는 클라이언트 해킹시 털릴 가능성이 있다. -> 세션 id가 털려도 이안에는 중요한 정보가 없음
- 쿠키 탈취 후 사용 -> 해커가 토큰을 털어가도 시간이 지나면 사용할 수 없도록 세션의 만료시간을 짧게 유지.
- 해킹 의심시 서버에서 해당 세션을 강제로 제거하면됨.