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

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

이전에 간단한 프로젝트를 할때 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

1
2
3
4
5

<h1>Home#index</h1>
<p>Rails . HAHWUL TEST</p>
<iframe src="http://www.hahwul.com"></iframe>

ruby 코드는 <%= %> 를 통해 사용할 수 있습니다. (php랑 똑같아요)

1
2
3
4
5
6

<%=
  @a = "I am RUBY Code!"
  raw @a
%>

ruby에서 puts은 console 출력을 의미합니다. puts으로 아무리 써봐야 server에 console만 잔뜩찍히기 때문에 raw를 이용해서 웹에 출력해주어야합니다.

Full code로 보면

1
2
3
4
5
6
7
8
9

<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

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

1
2
3

  get 'home/index'

이제 약간 손을 봐줘야겠죠?

1
2
3

  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에 아래 내용을 추가해줍니다.

1
2
3

<%= link_to "My Blog", posts_path %>

위 작업으로 우리 코드에 posts 부분이 연결되었습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11

<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까지!!

1
2
3

<meta content="v7MKs4s4MCHmEAvDBBrPAmeBc92IPOJUTTnZLQvho3o=" name="csrf-token" />

Rails는 재미있는 기능을 하나 더 지원합니다. 바로 HTTP 인증을 쉽게 적용할 수 있는데요.

#> vim app/controllers/application_controller.rb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16

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

1
2
3
4
5
6
7

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

Licensed under CC BY-NC-SA 4.0
Last updated on Jul 10, 2021 01:05 +0900