1. Authorization란?
서버에 자기 자신을 증명하기 위한 수단
1) 정의
- 보통 로그인 유지, 사이트가 제공하는 기능을 사용할 권한이 있는지 체크하는 목적으로 쓰인다.
- ex) 게시글 수정, 삭제 시 소유자가 맞는가?
- 주로 토큰, 세션의 방법으로 구현된다.
2) 목적
- 대부분의 웹은 HTTP 프로토콜을 사용한다.
- HTTP는 한 번의 요청과 한 번의 응답으로 브라우저와 서버간 연결이 끊긴다.
- 따라서 로그인을 했더라도 다른 요청이 있다면 다시 로그아웃 되버리는데 이 것을 해결하는 것이 인가(Authorization)이다.
2. 세션
쿠키에 저장
1) 정의
- 사이트에 사용자 요청을 유지하기 위해 웹 서버에 정보를 저장하는 방법이다.
- 브라우저를 닫는 등 연결 종료 시까지 연결된다.
- 방문자가 웹 서버에 접속해 있는 상태를 세션이라고 한다.
2) 원리
- 세션 정보는 서버 메모리 측에 저장되지만 세션DB를 구축했다는 가정 하에 설명
① 로그인을 통한 세션ID 수령
- 유저가 로그인 요청을 하면 서버측에서 유저 데이터를 세션DB에 저장하고 세션ID를 떼서 응답으로 브라우저에게 보낸다.
- 브라우저는 이 세션ID를 쿠키에 저장한다.
② 요청 시마다 세션ID를 동봉
- 브라우저가 서버에 요청을 보내면 쿠키는 자동으로 이 요청에 세션ID를 싣어보낸다.
③ 확인
- 서버는 이 세션ID를 받아 세션DB에서 일치하는 정보가 있는지 찾는다.
- 있다면 로그인을 유지시키거나 해당 요청에 대한 (ex 게시글 수정) 권한이 있는지 확인한다.
3) 장점
- 세션DB에 유저 정보를 저장하므로 밴하고 싶은 유저가 있으면 그 세션 정보를 지우면 된다.
- 인스타그램을 예로 들면 로그인된 모든 디바이스를 확인할 수 있는데 원하지 않는 디바이스는 강제로 로그아웃 가능하다.
4) 단점
- 매 요청마다 세션DB에서 유저 정보를 찾아야 되므로 조금 비효율적일 수 있다.
- 서버를 여러개 둔 회사인 경우 유저가 1번 서버를 통해 로그인했을 때 추후 요청은 2번 서버로 가면 서버가 유저를 알아보지 못한다(공용 DB가 없다는 가정하에).
3. 토큰(JWT)
JWT, 웹 저장소에 저장
1) 정의
- 세션과 같다.
- 쿠키에 저장할 수도 있으나 웹 저장소(로컬 스토리지)에 저장할 수도 있다.
- 토큰은 랜덤하고 긴 string으로 암호문처럼 보일 수 있으나 암호화되지 않았다(jwt.io)!
2) 원리
① 로그인을 통한 토큰 수령
- 유저가 로그인 요청을 하면 서버는 유저의 정보(payload)를 받아서 privateKey로 사인하여 토큰을 만들어 낸다.
- 역시 응답으로 브라우저에게 보내면 브라우저는 쿠키 or 웹저장소에 이를 저장한다.
② 요청 시마다 토큰을 동봉
- 브라우저가 서버에 요청을 보낼 때 토큰을 싣어 보내게 한다.
③ 확인
- 서버는 이를 받아 서버 자체에서 유효성 검사를 한다.
- 서버가 만들었던 토큰과 토씨하나 안틀리고 일치하는가, 사인한 privateKey와 동일한 key로 확인하는가의 단계를 거치고 전부 맞다면 유저의 정보(payload)를 확인할 수 있다.
3) 장점
- 세션과 달리 매번 DB를 확인할 필요없이 서버 자체에서 유효성 검사 가능
4) 단점
- 토큰은 세션처럼 DB에서 삭제할 수 없어서 설령 탈취당하더라도 기간이 만료될 때 까지 유효하고 세션처럼 강제 로그아웃 시킬 수가 없다.
틀린 내용은 태클 걸어주세요!