반응형
조만간 필요할 것 같기도 하고, 계속해서 다시 상기시켜야 할 주요 개념 중 하나인 인증 방식과 관련한 내용들을 정리해보려고 한다.
한창 면접때 공부했던 기억이 있는데 벌써 가물가물해진 것 같다.
애매하게 알고 있는 것은 정말 "내 것"이 아니다.
Cookies
- 쿠키를 이용해서 서버는 브라우저에 데이터를 넣을 수 있다.
- 사용자에 대한 내용을 기억하기 위함
- 어떤 사이트에 방문하면 브라우저는 서버에 요청을 보낸다.
- 서버는 이에 응답할텐데, 응답으로는 모든 데이터와 요청한 정보들이 있다.
- 응답에 추가로 브라우저에 저장하고자 하는 쿠키가 있을 수 있다.
- 사용자가 브라우저에 쿠키를 저장한 후, 해당 웹사이트를 방문할 때마다 쿠키와 함께 요청을 서버에 보내게 된다.
- 참고로 쿠키는 도메인에 따라 제한된다. 또한 쿠키는 유효기간(서버가 정한 기한에 따라)이 존재한다. (ex) 유투브가 준 쿠키는 유투브에만 전송되어짐
- 쿠키는 인증뿐만 아니라 다른 여러가지 정보들을 저장할 수 있다.
- 예를 들면, 웹사이트 언어설정을 바꾸면 서버는 이에대한 응답으로 쿠키를 주고, 브라우저는 요청에 대한 응답으로 언어값을 쿠키로 받아와서 저장한다.
- 따라서, 해당 웹사이트를 다음에 방문하게 될 때 쿠키(언어값)와 함께 서버로 전송되어지고, 서버는 해당 쿠키값에 대한 언어로 된 페이지를 제공.
HTTP 프로토콜
- HTTP 프로토콜은 웹사이트를 이용할 때 사용하는 프로토콜이다.
- 또한 stateless이다. 즉, 서버로 가는 모든 요청이 이전 요청과 완전히 독립적으로 다뤄진다는 의미이다. (요청끼리 연결이 없다. 메모리가 없다.)
- 그러므로 요청이 끝나게 되면 서버는 사용자가 누구인지 잊어버린다.
- 요청을 할 때마다 클라이언트가 누구인지 알려줘야 하는 방식으로 Sessions과 Token 방식이 존재한다.
Sessions
동작 순서
- 로그인 하려는 유저가 본인의 ID, PW를 서버에 전송
- 유효한 유저라면 서버는 세션 DB에 해당 유저에 대한 정보를 생성한다.
- 저장함과 동시에 별도의 ID가 존재하여 이 세션 ID를 쿠키를 통해 브라우저에 저장된다.
- 따라서, 같은 웹사이트의 다른 페이지로 이동하면 브라우저는 세션ID를 가지고있는 쿠키를 서버에게 전송한다.
- 서버는 세션 ID와 함께 들어오는 쿠키를 확인한다. (여기까지 서버는 요청자가 누구인지 모른다.)
- 서버는 세션 ID를 가지고 세션 DB를 확인하여 해당 유저가 누구인지 알아낸다.
- 중요한것은 유저 정보는 모두 서버에 존재한다는 것! (유저가 가지고있는 것은 세션 ID값.)
- 쿠키는 그저 세션 ID를 전달하기 위해 사용되어진다! 즉, 쿠키는 매개체이고 쿠키는 네이티브 앱에는 없고 브라우저에만 존재한다.
- 정리하면 세션은 모든 유저의 정보를 서버가 관리하고 있기 때문에 서버는 유저의 요청이 있을 때마다 쿠키를 받아서 세션 ID를 확인하고, 유저를 찾아내는 DB에 접근해야 한다!
- 그러므로 유저가 늘어난다면 DB 리소스가 필수적으로 더 필요하다.
- 세션을 위한 DB는 주로 Redis를 사용한다. (빠르고 저렴한 DB)
- 강제 로그아웃등과 같은 기능 구현이 가능.
Tokens
- 네이티브 앱에서는 쿠키를 사용할 수 없기 때문에 이 경우에는 토큰을 사용한다!
- 그냥 토큰은 이상하게 생긴 string 이다.
JWT
동작 순서
- 로그인 하려는 유저가 본인의 ID, PW를 서버에 전송
- 서버에서는 유저의 정보를 가지고, 사인 알고리즘을 이용해서 시그니쳐를 생성한다.
- 이후 생성된 시그니쳐 정보를 string 형태로 사용자에게 전달한다.
- 보통 JWT는 세션 ID보다 매우 길다. (길이에 대한 제약이 없음.)
- 사용자가 요청을 보내면 세션 ID와 비슷하게 '사인된 정보(토큰)'을 서버에 보내야 한다.
- 서버는 토큰을 받게되면 해당 사인이 유효한지(조작 여부) 체크하고 유저를 확인한다.
- 세션의 한계점을 극복하기 위해서 등장하게 되었다.
- 토큰 형식으로 JWT로 유저 인증을 처리한다면, 서버가 세션 DB를 가질 필요가 없다.
- 또한, 유저 인증을 위해 많은 작업을 할 필요가 없어지게 된다!
- 서버는 단지 토큰의 생성과 검증 작업만 할 뿐이다.
- 하지만 JWT는 암호화되지 않았다. 따라서 누구나 열어서 해당 컨텐츠를 볼 수 있다. (비밀정보를 JWT에 포함되면 X)
- 유저에 대한 정보들을 강력하게 관리하기 위해서는 JWT대신 세션을 활용하는게 낫다.
반응형