코딩 토막 지식

쿠키 / 세션 / 토큰에 대해

혁준 2022. 1. 14. 17:55

최근 서버 개발자인 친구와 함께 프로젝트를 만들고 있습니다. 프로젝트를 진행하면서  로그인 기능을 구현하게 되었습니다.

기존에는 firebase를 통해 로그인 기능을 구현하였기에 간단하게 로그인을 구현할 수 있었습니다.

그렇지만 서버와 연동을 하게 하면서 좀 더 세밀한 부분에 신경을 써줘야 한다는 것을 알게되었고 공부의 필요성을 느껴 현재 열심히 공부하고 있습니다.

 

이번 글에서는 공부의 일환으로 '쿠키 / 세션 / 토큰' 에 대해 이번 기회에 깔끔하게 정리해보려고 합니다. 

 

 

1. 쿠키(Cookie)

app / web을 사용 중에 재접속을 하는 경우가 있습니다. 이러한 경우 다시 id와 password를 입력하는 일은 굉장히 번거롭습니다. 그렇지만 cookie를 사용하면 이러한 번거로운 일을 하지 않을 수 있습니다.

▲ 쿠키를 사용한 통신 (출처 : https://valuefactory.tistory.com/707)

웹 사이트에 방문하게 되면 사용자(client)에게 data 파일을 저장해 둔 cookie를 줍니다. 이를 client의 저장소에 저장에 놓은 후 다시 로그인을 하는 경우에 다시 꺼내서 사용할 수 있습니다. 그러면 추가적인 id, password 입력이 없이도 접속 유지가 가능합니다!

  • 쿠키는 key - value 형식으로 데이터가 구성되어 있습니다.  
  • android의 경우 okHttpClient.cookieJar / cookieManager 를 사용하여 쿠키를 관리할 수 있습니다. ( 쿠키의 유효시간 관리 가능!)

쿠키는 client의 저장소를 사용하기 때문에 서버의 자원이 사용되지 않습니다. 이러한 특징은 장점이 될 수도 있지만, 단점이 될 수도 있습니다. 보안에 취약해지기 때문이죠. 해커가 http 요청을 중간에서 가져가는 경우에 모든 정보가 그대로 해커에게 탈취당할 수 있습니다. 그렇기 때문에 쿠키는 자동 로그인, 장바구니와 같은 간단한 경우에만 사용하는 것을 권장하고 있습니다. 

 

 

 

2. 세션(Session)

위와 같은 쿠키의 보완이 취약하다는 약점을 보완하기 위해 쿠키와 세션이 함께 사용되게 되었습니다.

 

▲ 쿠키 / 세션을 사용한 통신 (출처 : https://valuefactory.tistory.com/707)

 

세션은 쿠키를 기반으로 합니다. 그렇지만 쿠키가 client에 data를 저장한다면, 세션은 server에 data를 저장합니다. 이 둘은 상호보완적으로 사용됩니다. 즉, 클라언트는 쿠키를 사용하고 서버에서는 쿠키를 받아 세션의 정보에 접근하는 방식으로 인증이 진행되는 것입니다.

 

이렇게 쿠키와 세션을 함께 사용하면 쿠키가 들어있는 http 요청이 도중에 탈취당하여도, 쿠키 자체는 서버에서 사용되는 세션id만 가지고 있을 뿐, 실질적인 정보를 담고있지는 않기 때문에, 큰 문제가 되지 않습니다.

 

사용자는 쿠키를 이용하고, 서버에서는 이 쿠키를 받아 세션의 정보에 접근하는 방식으로 인증합니다.

 

 

*쿠키 / 세션 인증절차 

1. 로그인 시 사용자 id와 일치하는 세션 id를 발급하여 클라이언트에게 줍니다.

2. 클라이언트는 이 세션 id를 쿠키에 저장한 후 필요한 경우에 header에 넣어서 보내줍니다.

3. 세션 id가 들어있는 쿠키를  서버에서 받게되면, 서버에서는 세션 id를 세션 저장소에서 일치 여부를 확인한 후 일치하는 data를 가져옵니다.

 

 

 

3. 토큰(Token)

다양한 token을 사용한 인증 방법들 중 JWT(JSON web Token)는 인증에 필요한 정보들을 암호화시킨 토큰을 의미합니다.

 

▲ 토큰을 사용한 통신 (출처 : http://gcs.emro.co.kr:8090/pages/viewpage.action?pageId=9873130)

 

  • 세션/쿠키 방식과 유사하게 사용되는 Access Token(JWT token)을 http 헤더에 실어 서버에 전송합니다.
  • 토큰은 유저의 인증 정보를 서버나 세션에 담아두지 않고, 클라이언트 측에 저장합니다. 그렇기에 서버를 확장하기에 용이합니다. 
  • 토큰은 임의로 생성된 비밀번호처럼 동작합니다.
  • 토큰은 제한된 수명이 있고, 만료되면 다시 생성해주어야 합니다. 
  • 네이버, 카카오, 구글, 페이스북을 활용하여 로그인을 진행하는 경우 각 홈페이지 Acess Token을 발급받아 기능을 구현할 수 있습니다.

 

*토큰 인증절차 

1. 로그인 시 secret key를 통해 Access token을 발급하여 클라이언트에게 줍니다.

2. 클라이언트에서 API 을 요청할때  클라이언트가 Authorization header에 Access token을 담아 보냅니다. 

3. 서버는 확인 후 data를 반환합니다.

4. 클라이언트의 로그인 정보를 서버 메모리에 저장하지 않기 때문에 토큰기반 검증 메커니즘을 제공합니다.

 

 

 

4. 결론

클라이언트의 로그인만 구현하는 정도의 간단한 프로젝트에서는 쿠키/ 세션의 사용이 적합합니다.

그렇지만 규모가 큰 프로젝트의 경우에는 토큰을 이용하여 구현하는 것이 더 적합합니다. 

 

 

5. 참고 

http://www.opennaru.com/opennaru-blog/jwt-json-web-token/

 

JWT (JSON Web Token) 이해하기와 활용 방안 - Opennaru, Inc.

JWT 는 JSON Web Token의 약자로 전자 서명 된 URL-safe (URL로 이용할 수있는 문자 만 구성된)의 JSON입니다.JWT는 속성 정보 (Claim)를 JSON 데이터 구조로 표현한 토큰으로 RFC7519 표준 입니다.

www.opennaru.com

 

 

읽어주셔서 감사합니다. 

'코딩 토막 지식' 카테고리의 다른 글

[Android] viewModels 사용하기  (0) 2022.04.15
[Android] .gitignore 사용하기  (0) 2022.02.24
REST API란?  (0) 2021.12.24
CORS (Cross-Origin Resource Sharing)란?  (0) 2021.12.23
애자일(Agile) 방법론이란?  (0) 2021.11.16