TigerCow.Door


안녕하세요.

오늘은 Tornado web framework를 이용한 Authentication and security를 알아보도록 하겠습니다.

공식문서를 확인하시면  'Authentication and security' 을 주제로한 몇가지 예제가 나와있습니다.

오늘은 그 중 첫번째인 Cookies and secure cookies 에 대해 공부해보겠습니다.


직접적으로 Tornado를 이용하기에 앞서서 먼저 cookie라는 것에 대해 알아볼게요.


1. 쿠키(cookie)란?

쿠키란 특정 웹서버에 대한 접근 정보를 담고 있는 것 입니다.

많은 분들께서 웹브라우저를 이용하시면서 특정 웹사이트가 로그인 정보를 기억한 경험이 있을거에요.

한번 로그인한 웹사이트를 다음에 접속할때는 따로 ID와 password를 입력하지 않아도 자동으로 로그인 되는 상황이죠.


이렇게 로그인 정보를 기억할때 웹 사이트에서 여러분의 로그인 정보를 쿠키(Cookie)로 저장하게 됩니다. 그리고 다음번에 여러분이 해당 사이트에 접근하게되면 해당 쿠키를 통해서 자동으로 로그인이 되도록 하는 것이죠.

순서를 통해 한번 더 이해해보겠습니다.


웹 브라우저  ---------->    웹서버

  1. 요 청


웹 브라우저  <---쿠키----    웹서버

2. 응 답: 쿠키생성 및 저장

3. 웹 브라우저는 쿠키저장소에 쿠키 저장


웹 브라우저  ---쿠키---->    웹서버

4. 쿠키를 통한 요청


웹 브라우저  <----------    웹서버

5. 응답: 받은 쿠키를 이용한 응답



위와 같은 순서로 쿠키가 생성되고 이용된다고 보시면 됩니다.


이러한 쿠키는 클라이언트에 저장된다고 하는데, 쉽게 말해서 사용자의 컴퓨터에 저장된다고 생각하시면 됩니다.

그럼 쿠키에 개인정보나 중요한 정보가 저장되어 있다면 보안상으로 많은 문제를 불러올 수도 있겠죠?

따라서 쿠키에 중요한 정보를 담지 않고 서버에 중요한 정보를 저장하여 이용하는 방지대책도 있으며

쿠키에 저장되는 정보자체를 암호화 하는 방법도 있습니다.


오늘 포스팅에서는 쿠키가 생성되고 저장되는 것을 확인하고,

방지대책으로써 쿠키에 저장되는 정보자체를 암호화시켜보는 과정을 진행해보겠습니다.


2. 쿠키생성

우리는 tornado에서 set_cookie 메소드를 이용하여 쿠키를 생성할 수 있습니다.

이렇게 만들어진 쿠키는 안전하지 않으며 사용자에 의해 쉽게 변경될 수 있습니다.

(보안성 강화는 뒤에서 알아보겠습니다.)


그럼 코드를 직접 작성하여 쿠키가 생성되는 것을 확인해보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import tornado.httpserver
import tornado.ioloop
import tornado.web
 
class MainHandler(tornado.web.RequestHandler):     
     def get(self):
          if not self.get_secure_cookie("mycookie"):
               self.set_secure_cookie("mycookie","myvalue")         
               self.write("Your cookie was NOT set yet!")
          else:
               self.write("Your cookie was set!")
               items = ["Item 1""Item 2""Item 3"]                  
               self.render("template_test.html", title="My title", items=items, sayHello=self.sayHello) 
               
     def sayHello(self, name):
          return 'Hello, '+name + '!!!'
 
application = tornado.web.Application([     
     (r"/", MainHandler),   
]) 
 
if __name__ == "__main__":     
     http_server = tornado.httpserver.HTTPServer(application)     
     http_server.listen(8888)     
     tornado.ioloop.IOLoop.instance().start()
cs


지난 번 포스팅에서 진행된 코드에서 수정을 진행하였습니다.

7번 라인을 보시면 현재 사용자가 쿠키를 가지고 있는지 확인합니다.

사용자에게 쿠키가 없다면 8번 라인을 통해 mycookie라는 키(key)와 myvalue라는 정보(value)를 가진 쿠키를 생성하고

9번라인을 통해 화면에는 Your cookie was NOT set yet! 이라는 문구를 띄어줍니다.



그럼 이 화면을 보고 있는 상태라면 이미 8번 라인이 실행된 것이므로 쿠키가 생성되었겠죠?

다시 접속해보면 아래와 같이 화면이 바뀌게 됩니다.


네, 쿠키가 생성되어서 이제 코드 8,9 라인이 진행되지 않고 10번라인부터 진행이 되었습니다.

이제 생성된 쿠키를 확인해볼게요.

웹 콘솔창(Shift + I 을 누른뒤 Console 클릭) 또는 명령어 자체를 주소 창에 입력하시는 것을 통해 확인 할 수 있습니다.

javascript:document.cookie 를 입력합니다.



그럼 좀 전 코드에서 확인한 바와 같이 mycookie 라는 키(key)와 그에 대응하는 myvalue 라는 정보(value)가 생성되어 저장된 것을 확인할 수 있습니다.

하지만 처음에 알아본 것과 같이 이렇게 쿠키가 저장되어 있다면 사용자가 이를 쉽게 수정할 수 있으며 또는 쉽게 정보를 해킹당할 수 있습니다.

예를 들어 특정 웹사이트에서 권한을 1~5로 나누고 A라는 유저는 2 정도의 권한을 가지고 있었는데, 위와 같이 쿠키의 정보가 보안이 되어 있지 않다면 사용자가 2라는 권한을 5로 수정하여 허락되지 않은 행동들을 취할 수 있을 것 입니다.



3. 쿠키 암호화 하기

따라서 우리는 쿠키에 중요한 정보를 저장하지 않거나, 쿠키의 정보 자체를 암호화하는 방법을 이야기했습니다.

그 중 tornado에서는 쿠키의 정보 자체를 암호화 하는 함수를 제공하고 있습니다.

set_secure_cookieget_secure_cookie라는 함수를 제공하고 있으며 이러한 함수들을 사용하기 위해서는 cookie_secret이라는 값을 설정해야 합니다. 

set_secure_cookie를 통해 생선된 인증된 쿠키는 암호화된 정보에 추가적으로 timestamp와 HMAC인증이 저장됩니다. 만약 쿠키가 오래된 것이거나 인증이 맞지 않다면 get_secure_cookieNone값을 리턴하여 쿠키가 존재하지 않는 것처럼 처리하게 됩니다. 

위의 두가지 함수를 이용한 python 코드는 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import tornado.httpserver
import tornado.ioloop
import tornado.web
 
class MainHandler(tornado.web.RequestHandler):     
     def get(self):
          if not self.get_secure_cookie("mycookie_2"):
               self.set_secure_cookie("mycookie_2","myvalue")         
               self.write("Your cookie was NOT set yet!")
          else:
               self.write("Your cookie was set!")
               items = ["Item 1""Item 2""Item 3"]                  
               self.render("template_test.html", title="My title", items=items, sayHello=self.sayHello) 
               
     def sayHello(self, name):
          return 'Hello, '+name + '!!!'
 
application = tornado.web.Application([     
     (r"/", MainHandler),   
],cookie_secret="owb4t22n3or$239fn=nefo23/1rf13"
 
if __name__ == "__main__":     
     http_server = tornado.httpserver.HTTPServer(application)     
     http_server.listen(8888)     
     tornado.ioloop.IOLoop.instance().start()
cs


7번 코드를 확인하면 이전과 달리 mycookie_2 가 존재하는지 확인합니다.

그리고 존재하지 않는다면 8번 라인에서 set_secure_cookie 함수를 통해 mycookie_2라는 키와 myvalue 라는 값을 가진 쿠키를 생성합니다. 이후의 동작은 이전의 코드와 동일합니다.

추가적으로 20번라인에 cookie_secret 이 새로 추가된 것을 확인하실 수 있습니다.

저는 해당 cookie_secret을 무작위로 입력하였습니다.

해당 코드로 웹에 접속해 본다면 이전과 같은 결과를 얻을 수 있습니다.

첫 접속에서는, Your cookie was NOT set yet! 이라는 화면이 뜨고 다시 접속하면 필요한 정보들이 출력됩니다.

그럼 다른점을 확인해볼까요?

아까와 같이 웹 콘솔창을 띄우거나 주소창을 통해 이전과 같은 명령어(javascript:document.cookie)를 입력합니다.


그럼 이전에 생성된 mycookie라는 키와 방금 생성된 mycookie_2 라는 키, 두개에 대한 정보를 함꼐 확인하실 수 있습니다.

그 차이점이 명확히 보이시나요?

mycookie_2 라는 키에 대응되는 정보(value)는 암호화되어 사용자가 무슨내용인지 알 수 없습니다.

이런 암호화된 정보를 확인하기 위해서는 위에서 추가한 cookie_secret이 필요할 것 입니다.


토네이도의 공식문서를 통해 확인해보면, 이러한 쿠키는 무결성(integrity)를 보장하지만 기밀성(confidentiality)는 보장하지 않는다고 합니다. 즉, 우리가 쿠키에 대한 정보를 확인할 수 있었듯이 사용자가 쿠키를 볼수는 있지만 수정할 수는 없습니다.

그리고 cookie_secret는 비밀로 유지되어야 하며 이 키의 값을 얻은 사용자는 자신의 쿠키를 생성하거나 수정할 수 있습니다.

기본적으로 tornado의 보안 쿠키는 30일 후에 만료됩니다. 이를 변경하기 위해서는 set_secure_cookie함수에서 expires_days 키워드와 get_secure_cookie의 함수에서 max_age_days 키워드를 수정하면 됩니다.

보다 자세한 정보가 궁금하다면 tornado의 공식문서를 참고하시기를 바랍니다.


이렇게 하여 쿠키(cookie)에 대해 알아보고, Tornado에서 쿠키를 생성하고 보안성을 높이는 방법을 알아보았습니다.

다음에는 유저 인증(User authentication)에 대해서 알아보도록 하겠습니다.

수정되어야 할 점에 대한 피드백이나 문의사항은 덧글 및 이메일(doorbw@outlook.com)을 이용해주세요!

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc



안녕하세요. 문범우입니다.

오늘은 mongoDB의 database, collection, document 들에 대해서 알아보겠습니다.

기본적인 개념들은 지난 포스트를 참고해주시고, 오늘부터는 직접적으로 생성하고 제거하는 등의 활동을 해볼게요.



지난 포스트에서 알아본 듯이 mongoDB는 아래와 같은 architecture를 가지고 있습니다.


Database_1

Collection_1

Documents_1

 

“_id” : “~~~~~~~~~~~~”,

“name” : “홍길동”,

“age” : “30”,

. . .

 

Documents_2

. . .

 

Documents_3

. . .

. . .


 

Collection_2

. . .


Database의 내부에 Collection, 그리고 Collection 내부에 Document가 존재합니다.

이번 포스팅에서는 최종적으로 Documents 를 생성하여 우리가 원하는 key와 value를 저장해보도록 하겠습니다.

물론 그러기 위해서는 아래와 같은 과정이 필요합니다.


Database 생성 -> Collection 생성 -> Documents 생성


그리고 각각을 제거해보는 것까지 함께 해보도록 하겠습니다.


Database 생성-> Collection 생성 -> Documents 생성 -> Documents 제거 -> Collection 제거 -> Database 제거




1. Database 생성

먼저 mongoDB의 server를 키고, mongoDB에 들어갑니다.

그리고 show dbs 명령어를 통해 현재 만들어진 database를 확인할 수 있습니다.



위의 사진과 같이 아무것도 뜨지 않는다는 것은 내가 만든 데이터베이스가 없거나

만든 데이터베이스 내부에 한개 이상의 Document가 존재하지 않는다는 것 입니다.

즉, 데이터베이스가 만들어져 있더라도 해당 데이터베이스 내부에 Documents가 하나도 없다면 리스트에 보이지 않습니다.

이때, 자신이 사용중인 데이터베이스를 확인하기 위해서는 db 명령어를 입력합니다.


현재 저는 test라는 database를 사용하고 있네요.

이제 새롭게 database를 생성해보고 해당 database로 진행해보겠습니다.



use newDatabase 명령어를 통해 newDatabase라는 이름을 가진 database를 새롭게 만듭니다.

(이때 만약 해당 이름을 가진 데이터베이스가 존재한다면

새롭게 만들어지지 않고 기존에 있던 데이터베이스를 사용하게 됩니다.)

db 명령어를 통해서 사용중인 database가 바뀌었음을 확인할 수 있습니다.



2. Collection 생성

이번에는 collection을 생성해보겠습니다.

collection을 생성하기 위해서는 db.createCollection(name,[options]) 이라는 명령어를 사용합니다.

이때 name은 string Type으로써, collection의 이름을 말하며 options는 document Type으로써 선택적인 매개변수입니다.

공식문서를 통해 확인해보시고 필요한 항목을 사용하시면 됩니다. collection 이름은 firstCollection 으로 만들어보겠습니다.



지금까지 만들어진 collection을 확인하기 위해서는 show collections 명령어를 통해서 가능합니다.




3. Document 추가

Document 는 함수 자체에서 insert로 명시되어 있기에 '생성'이라는 말 대신 '추가'라는 말을 사용하였습니다.

새로운 Document를 추가하기 위해선 어떤 collection에 추가할지도 함께 고려해야합니다.

즉, 명령어에는 collection의 이름과 추가될 document의 내용이 들어갑니다.

db.COLLECTION.insert([{document1},{document2}, ... ]) 가 COLLECTION 이라는 이름을 가진 collection에 새로운 document를 추가하는 명령어 입니다.

해당 명령어를 통해 이름, 성별, 전공을 가진 document를 2개 추가해 보도록 하겠습니다.



그리고 db.COLLECTION.find() 을 통해 현재까지 추가된 document를 확인합니다.





4. document 제거

document를 제거하기 위해서는 db.COLLECTION.remove(<query>,<justOne>) 함수를 사용합니다.

db.COLLECTION.remove(<query>,<justOne>)에 대한 공식문서의 설명은 아래와 같습니다.



즉, query는 삭제할 document의 기준, 조건을 말합니다. 만약 query를 비워둔다면 모든 documents 가 해당되니 유의하세요.

justOne 은 한개만 지울 것인지에 대한 변수입니다.

default로 false값을 가지며, 딱 하나의 document만 지울때는 true로 설정하면 됩니다.


저는 3번에서 입력한 document 중 pika라는 이름을 가진 document 하나만 제거해보도록 하겠습니다.



document 하나가 올바르게 지워진 것을 알 수 있습니다.



5. Collection 삭제

현재 사용하고 있는 database의 collection을 보려면, show collections 라는 명령어를 사용하면 된다고 말하였습니다.

한번 더 확인해보겠습니다.


firstCollection 이라는 collection 하나만 존재하므로 하나를 더 생성합니다.



다시 secondCollection을 지워보도록 하겠습니다.

collection을 지우는 명령어는 db.COLLECTION.drop() 입니다.




6. Database 제거

현재 제가 만들어놓은 database의 항목을 확인해보기 위해 show dbs 명령어를 입력합니다.

제거할 database를 임시로 만들기 위하여 temp 라는 database를 만듭니다.



하지만 use temp 명령어를 입력하여도 temp라는 database는 하나이상의 document를 가지고 있지 않기 때문에

show dbs 에서 리스트에 보이지 않습니다. 따라서 빠르게 document를 추가해줍니다.

이때 따로 collection을 미리 생성하지 않아도 아래 명령어가 가능합니다.

db.tempCollection.insert({"name":"jone"})




이제 사용하지 않는 temp라는 database를 제거하기 위해 해당 database를

use DATABASE_NAME 을 통해 선택하고, db.dropDatabase() 함수를 사용하여 제거합니다.




이렇게


Database 생성-> Collection 생성 -> Documents 생성 -> Documents 제거 -> Collection 제거 -> Database 제거


순서대로 진행하였습니다.


마지막으로 각각에 대한 명령어를 정리해볼게요 !



정리


 

생 성 (추 가)

확 인

제 거 (삭 제)

Database

use DATABASE

show dbs

db.dropDatabase()

Collection

db.createCOLLECTION(name,[options])

show collections

db.COLLECTION.drop()

Document

db.COLLECTION.insert({do1},{do2}, …)

db.COLLECTION.find()

db.COLLECTION.remove(<query>,<justOne>)



오늘은 Database, Collection, Document 를 직접 생성하고 확인하고 제거해보았습니다.

다음엔 입력한 데이터를 이용한 실습을 진행해보겠습니다.

문의사항은 덧글이나 이메일(doorbw@outlook.com)을 이용해주세요 :)

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc


대학생분들과 회사원분들이 오피스 작업 및 발표 준비시에 많이 사용하는

PowerPoint(PPT:파워포인트)에 관한 단축키 2번째 포스팅입니다.

이번에는 '파일 관련 단축키'에 대해서 소개를 해드리겠습니다.

다음 포스팅에서는 '텍스트 서식'에 관련한 단축키를 소개해드리겠습니다. :)


http://doorbw.tistory.com

단축키

단축키 내용

Ctrl + T

글꼴 대화 상자 활성화

Ctrl + Shift + >, Ctrl + ]

선택된 텍스트의 크기를 크게

Ctrl + Shift + <, Ctrl + [

선택된 텍스트의 크기를 작게

Shift + F3

선택한 영어 문장의 대/소문자를 변경

Ctrl + B

선택한 텍스트에 '굵게' 효과를 적용

Ctrl + U

선택한 텍스트에 '밑줄' 효과를 적용

Ctrl + I

선택한 텍스트에 '기울임'효과를 적용

Ctrl + =

자동 간격으로 아래 첨자 적용

Ctrl + Shift + +

자동 간격으로 위 첨자 적용

Ctrl + Space Bar

/아래 첨자 등 수동 문자서식을 제거

F2

텍스트가 포함된 개체에서 텍스트만 선택

Ctrl + E

단락 중앙 정렬

Ctrl + J

단락 양쪽 정렬

Ctrl + L

단락 왼쪽 정렬

Ctrl + R

단락 오른쪽 정렬

Alt + Shift +

단락을 한 수준 올리기

Alt + Shift +

단락을 한 수준 내리기

Alt + Shift +

선택한 단락을 위로 이동

Alt + Shift +

선택한 단락을 아래로 이동

Alt + Shift + 1

제목 수준 1을 표시

Alt + Shift + +

제목 아래 텍스트를 확대

Alt + Shift + -

제목 아래 텍스트를 축소

http://doorbw.tistory.com

 



블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc