2021 04 27
2021-04-27¶
Spring 세션/쿠키¶
- 참고 1: https://engkimbs.tistory.com/696
- 참고 2: https://lazymankook.tistory.com/35
- 세션과 쿠키 - HTTP 프로토콜을 기반으로 사용자와 통신 - HTTP는 Stateless - 이게 페이지가 이동할 때마다 서버와 연결해야함 - 상태유지, 장바구니 기능 구현이 까다로움 - Stateless 상태를 해결하는 2가지 방식이 세션과 쿠키 - 사용자와 서버의 연결 상태를 유지해주는 방법 - 세션: 서버에서 연결 정보를 관리 - 쿠키: 사용자 측에서 연결정보를 관리
- Cookie - Client에 데이터를 저장하는 수단 - Server는 그 데이터를 받아야지만 사용가능 - 과정 1. Client가 Http Request를 서버에 보냄 2. Server는 setcookie() 함수를 통해 Cookie를 설정하고, Http 헤더와 함께 Cookie를 Client에게 전송 3. Client는 Http Request를 할 때 마다 Cookie를 설정한 뒤, Server에 Http 헤더와 함께 보냄 - Cookie의 속성 - Name: Cookie의 이름 - Value: Cookie의 값 - Secure: Https 에서만 Cookie 전송될 것인지 여부 - Domain: 설정한 domain의 모든 subdomain에서 쿠키 사용이 가능 - Path: 어떤 경로에서 Cookie를 사용가능하게 할 지 지정 - Expires: 언제 파기될 지 명시 - 서버가 쿠키 생성할 때, setcookie를 쓰는데, "Name", "Value", "Expires"는 꼭 필요함 - Cookie는 사용자 컴퓨터에 파일로 남겨져 보안상에 문제가 있을 수 있음
- Session
- Server에 데이터를 저장하는 수단
- Server에 저장되기에 Cookie와 다르게 정보가 노출되지 않음
- Client <-> Web server 간 네트워크 연결이 지속적으로 유지되는 상태
- 처음 접속 시 클라이언트에 대해 유일한 ID를 부여
- Session ID: 어떤 사용자의 Session인지를 식별하는 고유한 ID
- 과정
1. Client가 Http Request를 서버에 보냄
2-1. Session ID가 Server 저장소에 존재하지 않음
- Session과 Session ID를 생성/저장 - setcookie 함수 통해 Cookie에 "session ID"를 담아 Response로 돌려줌 2-2. Session ID가 Server 저장소에 존재함 - setcookie 함수 통해 Cookie에 "session ID"를 담아 Response로 돌려줌 3. Client가 Request를 할 때 Session ID를 Cookie에 담아서 보냄 - Server는 저장소에서 Session ID로 Session을 찾음 - 필요한 정보를 Response에 담아서 보냄- 로그인 ~ 로그아웃 할 때 까지의 생애주기 - 세션 없이 로그인 하면 다른 페이지에서 회원에 대한 고유 id 필요하면 데이터 계속 전달하는 비효율 적인 방법 적용 - 세션 사용해서 계속 서버에 유지하고 있으면서, 각 사용자의 "브라우저에 고유한 id를 할당"해 작업 안정성 보장해줘야 함
인증과 인가¶
- 참고: https://www.youtube.com/watch?v=y0xMXlOAfss
- 인증 - 식별 가능한 정보로 서비스에 등록된 유저의 신원을 입증하는 과정
- 인가 - 인증된 사용자에 대한 자원 접근 권한 확인 - 인증이 선행되어야 함
- 목차
1. 인증하기 (Request Header)
- HTTP is stateless
- http://user:pw123@www.helloworld.com/login
- Base64 인코더를 통해 user:pw123 파싱해서 인코딩 하고, 요청 헤더에 넣어서 보내줌
- Authorization: Basic dG9uzsdif3slk1fjQ
2. 인증 유지하기 (Browser)
- 브라우저의 스토리지의 힘을 빌리자
- Cookie로 id, pw를 저장해 둬 --> 이를 서버에 보내줘
- Authorization: Basic dG9uzsdif3slk1fjQ
3. 안전하게 인증하기 (Server)
- 똑같이 로그인 하기
- 만료기간 폐지되서 해킹 위협 Low
- Authorization: Basic dG9uzsdif3slk1fjQ
- 이걸로 보내면, 랜덤한 문자열 SessionID 발행
- Set-Cookie: JESSIONID=sidf091jasj
- 세션의 관리를 서버에서 하기에, 보안에 이점이 있음
- 문제점
- 서버 증설함
- DB까지 안찌르고 세션으로만 인증함
- 1번 서버에 세션있는데 2번 서버가 요청 받음
- 뻑남
- 세션 스토리지를 둬서 여러 서버가 참조하는 세션을 두자
4. 효율적으로 인증하기 (Token) - 정보의 흐름을 나타내는 요청/응답에 인증을 맡겨보자 - JSON WEB TOKEN (JWT) - Secret Key로 인증과정 거침 5. 다른 채널을 통해 인증하기 (OAuth)