7/18/2016

[RUBY] ROR(Ruby on Rails)를 이용한 Web Develope part2 - Create Blog Application and Security


지난 포스팅에서는 Rails 설치 및 기초적인 사용방법에 대해 보았다면
오늘은 아주아주 간단한 페이지 만드는법과 테스트 페이지의 보안을 위해서 HTTP 인증을 추가하는 방법에 대해 해볼까합니다.

https://udemy-images.udemy.com/course/750x422/531360_06c4.jpg


이전에 간단한 프로젝트를 할때 Rails를 사용했었는데, 확실히 보안적인 측면에서 미리 고려되다 보니 필터링하는 번거로움이 없어 편했다죠.
(해킹/보안으로 먹고사는지라.. 프로젝트 해봤자 조그만한거에요..)

Worm up!

시작에 앞서 rails를 가지고 웹을 생성합니다.

#> rails new rails_test
      create
      create  README.rdoc
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
...

#> cd rails_test

Create View and Controller

일단 MVC 모델에서 중요한 View와 Controller를 만들어야합니다.

#> rails generate controller home index
      create  app/controllers/home_controller.rb
       route  get 'home/index'
      invoke  erb
      create    app/views/home
      create    app/views/home/index.html.erb
      invoke  test_unit
      create    test/controllers/home_controller_test.rb
      invoke  helper
      create    app/helpers/home_helper.rb
      invoke    test_unit
      create      test/helpers/home_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/home.js.coffee
      invoke    scss
      create      app/assets/stylesheets/home.css.scss

아마 위 과정을 거치면 자동으로 index.html 이 지워지겠지만 혹시나 남아있다면 index.html 페이지를 지워줍니다.
public 디렉토리 하단에 있으며 이 public 디렉토리는 route.rb 설정 없이도 직접 접근이 가능한 Resource 디렉토리라고 보시면 좋습니다.

#> rm -rf ./public/index.html

#> cd /rails_test/app/views/home
#> ls
index.html.erb

.erb 파일은 rails 기본 포맷이며 ruby와 html 을 섞어쓸 수 있는 확장자입니다. html에서 php 코드 쓰는 느낌이랑 비슷하죠.

이제 내용을 편집해줍니다.

#> vim index.html.erb

<h1>Home#index</h1>
<p>Rails . HAHWUL TEST</p>
<iframe src="http://www.hahwul.com"></iframe>
ruby 코드는 <%=  %> 를 통해 사용할 수 있습니다. (php랑 똑같아요)

<%=
  @a = "I am RUBY Code!"
  raw @a
%>
ruby에서 puts은 console 출력을 의미합니다. puts으로 아무리 써봐야 server에 console만 잔뜩찍히기 때문에 raw를 이용해서 웹에 출력해주어야합니다.

Full code로 보면

<h1>Home#index</h1>
<p>Rails . HAHWUL TEST</p>
<iframe src="http://www.hahwul.com"></iframe>
<%=
  @a = "I am RUBY Code!"
  raw @a
%>
이러고 페이지를 접근해보면..

아직 default 페이지가 나오죠.
왜일까요? routes.rb 설정이 되어있지 않기 때문입니다.

Editing config/routes.rb

routes.rb는 각각 erb 파일과 web 요청을 이어주는 역할을 합니다.

rails 홈 디렉토리로 이동 후 config 하단에 routes.rb 파일을 열어줍니다.
#> cd /rails_test/
#> vim config/routes.rb

아무 설정이 없다면 맨위에 아래와 같은 설정값이 있습니다.

  get 'home/index'
이제 약간 손을 봐줘야겠죠?

  root :to => "home#index"

이제 접근해보면 정상적으로 나타납니다.

ruby 코드도 잘 실행되었네요

Scaffolding을 이용한 리소스 만들기

Scaffolding 를 이용하면 좀 더 쉽게 웹 코드를 생성할 수 있습니다. 사실 저도 이부분은 많이 익숙하지 않아서 직접 코딩하는 경우가 많은데요,
rails 개발자일수록 이 부분을 많이 활용한다고 해요.

#> rails generate scaffold Post nale:string content:text
      invoke  active_record
      create    db/migrate/20160718124447_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml
....

위 부분까지 수행하면
아래 경로에 migration 관련 파일이 생성됩니다. (날짜 데이터는 약간 달라요)

# vim db/migrate/20160718124447_create_posts.rb
class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :nale
      t.text :content
      t.timestamps
    end
  end
end

아까 지정한 형태로 string과 text가 생성되어있습니다. timestamps도요.
이제 migrate를 해줍니다.

#> rake db:migrate
== 20160718124447 CreatePosts: migrating ======================================
-- create_table(:posts)
   -> 0.0055s
== 20160718124447 CreatePosts: migrated (0.0058s) =============================

index.html.erb에 아래 내용을 추가해줍니다.

<%= link_to "My Blog", posts_path %>
위 작업으로 우리 코드에 posts 부분이 연결되었습니다.

<h1>Home#index</h1>
<p>Rails . HAHWUL TEST</p>
<iframe src="http://www.hahwul.com"></iframe>
<%=
  @a = "I am RUBY Code!"
  raw @a
%>
<hr>
<%= link_to "My Blog", posts_path %>
접근해서 보시면 링크 부분이 생성되었고, 눌러서 들어가시면 아래와 같은 페이지로 이동됩니다.



192.168.0.12:3000/posts

이 부분이 이제 반복적으로 파일을 만들지 않고도 글을 작성할 수 있는 부분이죠.

쭉쭉쭉 눌러서 글을 써보시면 바로 페이지가 생성됨을 볼 수 있죠.
(이전에 이것도 모르고 하나하나 ruby로 짜고있던 제가 부끄럽네요..)






물론 필터링도 되어있습니다.

XSS Filter까지?!

Security / HTTP Authentication

간단하게 페이지를 만드는 법을 봤는데, 여기서 잘 보셔야 할 내용이 XSS 필터링을 자기가 생성해서 넣어줬단 겁니다.
아무리 필터링 프레임워크를 써도 노가다는 노가다인데.. 좋네요.
(물론 개발자한테 뭐라하는지라 개발자의 맘으로 이해하기는 어렵지만요)

또한 CSRF Token까지!!

<meta content="v7MKs4s4MCHmEAvDBBrPAmeBc92IPOJUTTnZLQvho3o=" name="csrf-token" />
Rails는 재미있는 기능을 하나 더 지원합니다. 바로 HTTP 인증을 쉽게 적용할 수 있는데요.

#> vim app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery

  private

  def authenticate
    authenticate_or_request_with_http_basic do |user_name, password|
      user_name == 'test' && password == 'test123'
    end
  end

end

간단하게 인증을 구성하는 함수를 만들었습니다.
test/test123으로 접근이 가능하죠.

자 이제 이 함수를 원하시는 controller에 적용해야합니다.
저는 main페이지 접근 시 인증을 걸어보도록 하겠습니다.

#> cd app/controllers/
#> vim home_controller.rb

class HomeController < ApplicationController
before_filter :authenticate
  def index
  end
end
자 이러고 나면 main 페이지 접근 시 아래와 같이 인증을 요청하게 됩니다.


Conclusion

음.. 사실 Rails R도 못했네요.. 욕심이 과해서 급하게 포스팅을 하다보니 Tutorial을 따라간 느낌이랄까요..
그리고 워낙 Tutorial이 잘 나와있어서요. 아무튼 Ruby인에게는 이만한 프레임워크가 없습니다.

잘 익혀두시면 굉장히 도움되는 프레임워크라고 생각되네요.

Reference

http://rubykr.github.io/rails_guides/getting_started.html


HAHWUL

Security engineer, Gopher and H4cker!

Share: | Coffee Me:

0 개의 댓글:

Post a Comment